@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,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Pre-Warming Routes
|
|
3
|
+
*
|
|
4
|
+
* GET /internal/popular-urls — Top N URLs fetched in the last 24h (for CF Worker)
|
|
5
|
+
* GET /internal/cache-status — Current warmer state (warmed URLs, last run time)
|
|
6
|
+
*
|
|
7
|
+
* Both routes are mounted BEFORE auth middleware so they're accessible internally.
|
|
8
|
+
* /internal/popular-urls is protected by CACHE_WARM_SECRET bearer token when set.
|
|
9
|
+
*
|
|
10
|
+
* startCacheWarmer() — server-side self-warming (opt-in via ENABLE_CACHE_WARM=true)
|
|
11
|
+
*/
|
|
12
|
+
import { Router } from 'express';
|
|
13
|
+
import { createLogger } from '../logger.js';
|
|
14
|
+
const log = createLogger('cache-warm');
|
|
15
|
+
// ─── Fallback URLs ────────────────────────────────────────────────────────────
|
|
16
|
+
// Used when the DB has no usage data yet (new deployment / empty DB).
|
|
17
|
+
const FALLBACK_URLS = [
|
|
18
|
+
'https://www.bbc.com/news',
|
|
19
|
+
'https://news.ycombinator.com',
|
|
20
|
+
'https://github.com',
|
|
21
|
+
'https://en.wikipedia.org/wiki/Main_Page',
|
|
22
|
+
'https://www.reuters.com',
|
|
23
|
+
'https://techcrunch.com',
|
|
24
|
+
'https://stripe.com/docs',
|
|
25
|
+
'https://developer.mozilla.org',
|
|
26
|
+
'https://react.dev',
|
|
27
|
+
'https://docs.python.org/3/',
|
|
28
|
+
'https://nodejs.org/en/docs',
|
|
29
|
+
'https://www.npmjs.com',
|
|
30
|
+
'https://vercel.com/docs',
|
|
31
|
+
'https://nextjs.org/docs',
|
|
32
|
+
'https://tailwindcss.com/docs',
|
|
33
|
+
'https://www.typescriptlang.org/docs/',
|
|
34
|
+
'https://docs.render.com',
|
|
35
|
+
'https://cloudflare.com/docs',
|
|
36
|
+
'https://aws.amazon.com/documentation/',
|
|
37
|
+
'https://docs.github.com',
|
|
38
|
+
'https://www.nytimes.com',
|
|
39
|
+
'https://www.theguardian.com',
|
|
40
|
+
'https://arstechnica.com',
|
|
41
|
+
'https://www.wired.com',
|
|
42
|
+
'https://www.bloomberg.com/technology',
|
|
43
|
+
'https://lobste.rs',
|
|
44
|
+
'https://www.producthunt.com',
|
|
45
|
+
'https://stackoverflow.com',
|
|
46
|
+
'https://css-tricks.com',
|
|
47
|
+
'https://web.dev',
|
|
48
|
+
];
|
|
49
|
+
// ─── In-memory warmer state ───────────────────────────────────────────────────
|
|
50
|
+
const warmerState = {
|
|
51
|
+
warmedUrls: new Set(),
|
|
52
|
+
lastWarmTime: null,
|
|
53
|
+
};
|
|
54
|
+
// ─── Router ──────────────────────────────────────────────────────────────────
|
|
55
|
+
export function createCacheWarmRouter(pool) {
|
|
56
|
+
const router = Router();
|
|
57
|
+
// GET /internal/popular-urls
|
|
58
|
+
router.get('/internal/popular-urls', async (req, res) => {
|
|
59
|
+
// Auth check — if CACHE_WARM_SECRET is set, require it
|
|
60
|
+
const secret = process.env.CACHE_WARM_SECRET;
|
|
61
|
+
if (secret) {
|
|
62
|
+
const authHeader = req.headers['authorization'] || '';
|
|
63
|
+
const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7) : '';
|
|
64
|
+
if (token !== secret) {
|
|
65
|
+
res.status(401).json({
|
|
66
|
+
success: false,
|
|
67
|
+
error: { type: 'unauthorized', message: 'Invalid or missing bearer token.' },
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
let urls = [];
|
|
73
|
+
// Query DB if available
|
|
74
|
+
if (pool) {
|
|
75
|
+
try {
|
|
76
|
+
const result = await pool.query(`
|
|
77
|
+
SELECT url, COUNT(*) as fetch_count
|
|
78
|
+
FROM usage_logs
|
|
79
|
+
WHERE created_at > NOW() - INTERVAL '24 hours'
|
|
80
|
+
AND url IS NOT NULL
|
|
81
|
+
AND status_code >= 200 AND status_code < 300
|
|
82
|
+
AND url NOT LIKE '%localhost%'
|
|
83
|
+
AND url NOT LIKE '%127.0.0.1%'
|
|
84
|
+
AND url NOT LIKE '%169.254%'
|
|
85
|
+
GROUP BY url
|
|
86
|
+
ORDER BY fetch_count DESC
|
|
87
|
+
LIMIT 50
|
|
88
|
+
`);
|
|
89
|
+
urls = result.rows.map((row) => ({
|
|
90
|
+
url: row.url,
|
|
91
|
+
count: parseInt(row.fetch_count, 10),
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
log.warn('Failed to query usage_logs, falling back to static list', {
|
|
96
|
+
error: err?.message,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Fall back to static list if no DB data
|
|
101
|
+
if (urls.length === 0) {
|
|
102
|
+
log.info('No usage data found, using fallback URL list');
|
|
103
|
+
urls = FALLBACK_URLS.map((url) => ({ url, count: 0 }));
|
|
104
|
+
}
|
|
105
|
+
res.json({
|
|
106
|
+
urls,
|
|
107
|
+
total: urls.length,
|
|
108
|
+
generatedAt: new Date().toISOString(),
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// GET /internal/cache-status
|
|
112
|
+
router.get('/internal/cache-status', (_req, res) => {
|
|
113
|
+
res.json({
|
|
114
|
+
warmedUrls: Array.from(warmerState.warmedUrls),
|
|
115
|
+
urlCount: warmerState.warmedUrls.size,
|
|
116
|
+
lastWarmTime: warmerState.lastWarmTime?.toISOString() ?? null,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
return router;
|
|
120
|
+
}
|
|
121
|
+
// ─── Self-Warming ─────────────────────────────────────────────────────────────
|
|
122
|
+
/**
|
|
123
|
+
* startCacheWarmer — server-side self-warming (fallback when no CF Worker).
|
|
124
|
+
*
|
|
125
|
+
* Every `intervalMs` (default 2 min):
|
|
126
|
+
* 1. Queries /internal/popular-urls (via the DB, not HTTP)
|
|
127
|
+
* 2. Fetches each URL through /r/<url> with concurrency 5
|
|
128
|
+
* 3. Updates warmerState for /internal/cache-status
|
|
129
|
+
*
|
|
130
|
+
* Only started if ENABLE_CACHE_WARM=true.
|
|
131
|
+
*/
|
|
132
|
+
export function startCacheWarmer(pool, intervalMs = 900_000) {
|
|
133
|
+
log.info('Cache warmer started', { intervalMs });
|
|
134
|
+
const runWarm = async () => {
|
|
135
|
+
const t0 = Date.now();
|
|
136
|
+
log.info('Cache warm cycle starting');
|
|
137
|
+
// Determine base URL
|
|
138
|
+
// RENDER_EXTERNAL_URL is legacy (Render is retired). On K8s, use PUBLIC_URL or localhost.
|
|
139
|
+
const base = process.env.PUBLIC_URL?.replace(/\/$/, '') ||
|
|
140
|
+
process.env.API_BASE_URL?.replace(/\/$/, '') ||
|
|
141
|
+
`http://localhost:${process.env.PORT || 3000}`;
|
|
142
|
+
// Step 1: Fetch popular URLs (same logic as the endpoint)
|
|
143
|
+
let urls = [];
|
|
144
|
+
if (pool) {
|
|
145
|
+
try {
|
|
146
|
+
const result = await pool.query(`
|
|
147
|
+
SELECT url, COUNT(*) as fetch_count
|
|
148
|
+
FROM usage_logs
|
|
149
|
+
WHERE created_at > NOW() - INTERVAL '24 hours'
|
|
150
|
+
AND url IS NOT NULL
|
|
151
|
+
AND status_code >= 200 AND status_code < 300
|
|
152
|
+
AND url NOT LIKE '%localhost%'
|
|
153
|
+
AND url NOT LIKE '%127.0.0.1%'
|
|
154
|
+
AND url NOT LIKE '%169.254%'
|
|
155
|
+
GROUP BY url
|
|
156
|
+
ORDER BY fetch_count DESC
|
|
157
|
+
LIMIT 50
|
|
158
|
+
`);
|
|
159
|
+
urls = result.rows.map((row) => ({
|
|
160
|
+
url: row.url,
|
|
161
|
+
count: parseInt(row.fetch_count, 10),
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
log.warn('Warm cycle: DB query failed, using fallback', { error: err?.message });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (urls.length === 0) {
|
|
169
|
+
urls = FALLBACK_URLS.map((u) => ({ url: u, count: 0 }));
|
|
170
|
+
}
|
|
171
|
+
// Step 2: Warm each URL with concurrency 5
|
|
172
|
+
const concurrency = 5;
|
|
173
|
+
let warmed = 0;
|
|
174
|
+
let failed = 0;
|
|
175
|
+
const newWarmedSet = new Set();
|
|
176
|
+
for (let i = 0; i < urls.length; i += concurrency) {
|
|
177
|
+
const batch = urls.slice(i, i + concurrency);
|
|
178
|
+
const results = await Promise.allSettled(batch.map(({ url }) => fetch(`${base}/r/${encodeURIComponent(url)}`, {
|
|
179
|
+
headers: { 'User-Agent': 'WebPeel-CacheWarmer/1.0' },
|
|
180
|
+
signal: AbortSignal.timeout(15_000),
|
|
181
|
+
}).then((r) => {
|
|
182
|
+
if (r.ok) {
|
|
183
|
+
newWarmedSet.add(url);
|
|
184
|
+
warmed++;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
failed++;
|
|
188
|
+
}
|
|
189
|
+
})));
|
|
190
|
+
// Count settled rejections as failures
|
|
191
|
+
results.forEach((r) => {
|
|
192
|
+
if (r.status === 'rejected') {
|
|
193
|
+
failed++;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Step 3: Update state
|
|
198
|
+
warmerState.warmedUrls = newWarmedSet;
|
|
199
|
+
warmerState.lastWarmTime = new Date();
|
|
200
|
+
const elapsed = ((Date.now() - t0) / 1000).toFixed(1);
|
|
201
|
+
log.info(`Warmed ${warmed}/${urls.length} URLs in ${elapsed}s`, { failed });
|
|
202
|
+
};
|
|
203
|
+
// Run once immediately, then on interval
|
|
204
|
+
void runWarm().catch((err) => {
|
|
205
|
+
log.error('Cache warm cycle error', { error: err?.message });
|
|
206
|
+
});
|
|
207
|
+
setInterval(() => {
|
|
208
|
+
void runWarm().catch((err) => {
|
|
209
|
+
log.error('Cache warm cycle error', { error: err?.message });
|
|
210
|
+
});
|
|
211
|
+
}, intervalMs);
|
|
212
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Usage endpoint — works with API key auth (not JWT)
|
|
3
|
+
* Used by the `webpeel usage` command and pre-fetch usage checks
|
|
4
|
+
*/
|
|
5
|
+
import { Router } from 'express';
|
|
6
|
+
import pg from 'pg';
|
|
7
|
+
const { Pool } = pg;
|
|
8
|
+
export function createCLIUsageRouter() {
|
|
9
|
+
const router = Router();
|
|
10
|
+
const dbUrl = process.env.DATABASE_URL;
|
|
11
|
+
if (!dbUrl) {
|
|
12
|
+
// If no DB, return a stub router
|
|
13
|
+
router.get('/v1/cli/usage', (req, res) => {
|
|
14
|
+
res.status(501).json({
|
|
15
|
+
success: false,
|
|
16
|
+
error: {
|
|
17
|
+
type: 'not_configured',
|
|
18
|
+
message: 'Usage tracking requires PostgreSQL backend',
|
|
19
|
+
docs: 'https://webpeel.dev/docs/errors#not_configured',
|
|
20
|
+
},
|
|
21
|
+
requestId: req.requestId,
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
return router;
|
|
25
|
+
}
|
|
26
|
+
const pool = new Pool({
|
|
27
|
+
connectionString: dbUrl,
|
|
28
|
+
// TLS: enabled when DATABASE_URL contains sslmode=require.
|
|
29
|
+
// Secure by default (rejectUnauthorized: true); set PG_REJECT_UNAUTHORIZED=false
|
|
30
|
+
// only for managed DBs (Render/Neon/Supabase) that use self-signed certs.
|
|
31
|
+
ssl: process.env.DATABASE_URL?.includes('sslmode=require')
|
|
32
|
+
? { rejectUnauthorized: process.env.PG_REJECT_UNAUTHORIZED !== 'false' }
|
|
33
|
+
: undefined,
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* GET /v1/cli/usage
|
|
37
|
+
* Returns usage info for the authenticated API key's owner
|
|
38
|
+
* Auth: API key via Authorization: Bearer <key> or X-API-Key header
|
|
39
|
+
*/
|
|
40
|
+
router.get('/v1/cli/usage', async (req, res) => {
|
|
41
|
+
try {
|
|
42
|
+
// Require API key auth (set by global auth middleware)
|
|
43
|
+
if (!req.auth?.keyInfo?.accountId) {
|
|
44
|
+
res.status(401).json({ success: false, error: { type: 'unauthorized', message: 'Valid API key required. Run `webpeel login` to authenticate.', docs: 'https://webpeel.dev/docs/authentication' }, requestId: req.requestId });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const userId = req.auth.keyInfo.accountId;
|
|
48
|
+
// Get user plan info
|
|
49
|
+
const planResult = await pool.query('SELECT tier, weekly_limit, burst_limit FROM users WHERE id = $1', [userId]);
|
|
50
|
+
if (planResult.rows.length === 0) {
|
|
51
|
+
res.status(404).json({ success: false, error: { type: 'user_not_found', message: 'User not found', docs: 'https://webpeel.dev/docs/errors#user_not_found' }, requestId: req.requestId });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const plan = planResult.rows[0];
|
|
55
|
+
// Current week (ISO format)
|
|
56
|
+
const now = new Date();
|
|
57
|
+
const year = now.getUTCFullYear();
|
|
58
|
+
const jan4 = new Date(Date.UTC(year, 0, 4));
|
|
59
|
+
const weekNum = Math.ceil(((now.getTime() - jan4.getTime()) / 86400000 + jan4.getUTCDay() + 1) / 7);
|
|
60
|
+
const currentWeek = `${year}-W${String(weekNum).padStart(2, '0')}`;
|
|
61
|
+
// Current hour bucket
|
|
62
|
+
const currentHour = now.toISOString().substring(0, 13);
|
|
63
|
+
// Get weekly usage
|
|
64
|
+
const weeklyResult = await pool.query(`SELECT
|
|
65
|
+
COALESCE(SUM(wu.total_count), 0) as total_used,
|
|
66
|
+
COALESCE(SUM(wu.basic_count), 0) as basic_used,
|
|
67
|
+
COALESCE(SUM(wu.stealth_count), 0) as stealth_used,
|
|
68
|
+
COALESCE(SUM(wu.search_count), 0) as search_used
|
|
69
|
+
FROM api_keys ak
|
|
70
|
+
LEFT JOIN weekly_usage wu ON wu.api_key_id = ak.id AND wu.week = $2
|
|
71
|
+
WHERE ak.user_id = $1 AND ak.is_active = true`, [userId, currentWeek]);
|
|
72
|
+
const weekly = weeklyResult.rows[0];
|
|
73
|
+
const totalUsed = parseInt(weekly.total_used) || 0;
|
|
74
|
+
const weeklyLimit = plan.weekly_limit || 125;
|
|
75
|
+
const remaining = Math.max(0, weeklyLimit - totalUsed);
|
|
76
|
+
// Get burst usage
|
|
77
|
+
const burstResult = await pool.query(`SELECT COALESCE(SUM(bu.count), 0) as burst_used
|
|
78
|
+
FROM api_keys ak
|
|
79
|
+
LEFT JOIN burst_usage bu ON bu.api_key_id = ak.id AND bu.hour_bucket = $2
|
|
80
|
+
WHERE ak.user_id = $1 AND ak.is_active = true`, [userId, currentHour]);
|
|
81
|
+
const burstUsed = parseInt(burstResult.rows[0]?.burst_used) || 0;
|
|
82
|
+
const burstLimit = plan.burst_limit || 25;
|
|
83
|
+
const minutesRemaining = 59 - now.getUTCMinutes();
|
|
84
|
+
// Get next Monday reset time
|
|
85
|
+
const dayOfWeek = now.getUTCDay();
|
|
86
|
+
const daysUntilMonday = dayOfWeek === 0 ? 1 : 8 - dayOfWeek;
|
|
87
|
+
const nextMonday = new Date(now);
|
|
88
|
+
nextMonday.setUTCDate(now.getUTCDate() + daysUntilMonday);
|
|
89
|
+
nextMonday.setUTCHours(0, 0, 0, 0);
|
|
90
|
+
res.json({
|
|
91
|
+
plan: {
|
|
92
|
+
tier: plan.tier,
|
|
93
|
+
weeklyLimit,
|
|
94
|
+
burstLimit,
|
|
95
|
+
},
|
|
96
|
+
weekly: {
|
|
97
|
+
used: totalUsed,
|
|
98
|
+
limit: weeklyLimit,
|
|
99
|
+
remaining,
|
|
100
|
+
resetsAt: nextMonday.toISOString(),
|
|
101
|
+
percentUsed: Math.round((totalUsed / weeklyLimit) * 100),
|
|
102
|
+
},
|
|
103
|
+
burst: {
|
|
104
|
+
used: burstUsed,
|
|
105
|
+
limit: burstLimit,
|
|
106
|
+
resetsIn: minutesRemaining <= 0 ? '< 1 min' : `${minutesRemaining}m`,
|
|
107
|
+
},
|
|
108
|
+
// Simple boolean flags for CLI to check quickly
|
|
109
|
+
canFetch: remaining > 0 && burstUsed < burstLimit,
|
|
110
|
+
upgradeUrl: 'https://webpeel.dev/pricing',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error('CLI usage error:', error);
|
|
115
|
+
res.status(500).json({
|
|
116
|
+
success: false,
|
|
117
|
+
error: {
|
|
118
|
+
type: 'internal_error',
|
|
119
|
+
message: 'Failed to retrieve usage',
|
|
120
|
+
docs: 'https://webpeel.dev/docs/errors#internal_error',
|
|
121
|
+
},
|
|
122
|
+
requestId: req.requestId,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return router;
|
|
127
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firecrawl API Compatibility Layer
|
|
3
|
+
*
|
|
4
|
+
* Drop-in replacement for Firecrawl's API - users can switch by ONLY changing the base URL.
|
|
5
|
+
* This is our killer acquisition feature.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: Error responses in this file intentionally use Firecrawl's format:
|
|
8
|
+
* { success: false, error: "Human-readable message" }
|
|
9
|
+
* This is required for Firecrawl drop-in compatibility and differs from the
|
|
10
|
+
* standard WebPeel API error format: { error: "error_code", message: "description" }.
|
|
11
|
+
* Do NOT change this format — it would break Firecrawl-compatible integrations.
|
|
12
|
+
*
|
|
13
|
+
* Implements Firecrawl endpoints:
|
|
14
|
+
* - POST /v1/scrape
|
|
15
|
+
* - POST /v2/scrape (v2 with formats: ["screenshot"] support)
|
|
16
|
+
* - POST /v1/crawl
|
|
17
|
+
* - GET /v1/crawl/:id
|
|
18
|
+
* - POST /v1/search
|
|
19
|
+
* - POST /v1/map
|
|
20
|
+
*/
|
|
21
|
+
import { Router } from 'express';
|
|
22
|
+
import type { IJobQueue } from '../job-queue.js';
|
|
23
|
+
export declare function createCompatRouter(jobQueue: IJobQueue): Router;
|