@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,584 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source credibility scoring — lightweight, zero dependencies, no network calls.
|
|
3
|
+
*
|
|
4
|
+
* Actively investigates domain signals from the URL itself:
|
|
5
|
+
* - TLD trust score
|
|
6
|
+
* - HTTPS enforcement
|
|
7
|
+
* - Domain structure analysis
|
|
8
|
+
* - Brand/platform recognition (500+ known domains)
|
|
9
|
+
* - Content platform detection
|
|
10
|
+
*
|
|
11
|
+
* Score breakdown (0–100):
|
|
12
|
+
* TLD weight 0–20
|
|
13
|
+
* HTTPS 0–10
|
|
14
|
+
* Known domain 0–40
|
|
15
|
+
* Structure 0–15
|
|
16
|
+
* Platform 0–15
|
|
17
|
+
*/
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// TLD trust map: points (0–20)
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const TLD_TRUST = {
|
|
22
|
+
'.gov': 20, '.edu': 20, '.mil': 20,
|
|
23
|
+
'.org': 14, '.net': 12, '.com': 12, '.io': 11,
|
|
24
|
+
'.co': 10, '.us': 10, '.uk': 10, '.ca': 10, '.au': 10,
|
|
25
|
+
'.de': 10, '.fr': 10, '.jp': 10, '.br': 10, '.in': 10,
|
|
26
|
+
'.eu': 11, '.int': 15,
|
|
27
|
+
'.info': 8, '.biz': 7, '.me': 8, '.tv': 8, '.app': 10,
|
|
28
|
+
'.dev': 10, '.ai': 10, '.tech': 8, '.page': 8,
|
|
29
|
+
'.blog': 7, '.news': 8, '.media': 8, '.press': 8,
|
|
30
|
+
'.shop': 7, '.store': 7, '.online': 7, '.site': 6,
|
|
31
|
+
'.website': 6, '.space': 5, '.club': 5, '.pro': 7,
|
|
32
|
+
// Low-trust freebies
|
|
33
|
+
'.tk': 1, '.ml': 1, '.ga': 1, '.cf': 1, '.gq': 1,
|
|
34
|
+
'.xyz': 4, '.top': 3, '.loan': 2, '.click': 3, '.link': 4,
|
|
35
|
+
'.win': 2, '.bid': 2, '.download': 2, '.racing': 2, '.review': 4,
|
|
36
|
+
'.cc': 3, '.pw': 3, '.men': 2, '.party': 2, '.stream': 3,
|
|
37
|
+
};
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Suspicious TLDs (high-risk freebies used in phishing)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
const SUSPICIOUS_TLDS = new Set(['.tk', '.ml', '.ga', '.cf', '.gq', '.win', '.bid', '.men', '.party', '.loan']);
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Official TLDs
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
const OFFICIAL_TLDS = new Set(['.gov', '.edu', '.mil', '.int']);
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Official hostnames (beyond .gov/.edu/.mil TLD)
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
const OFFICIAL_DOMAINS = new Set([
|
|
50
|
+
// International organisations
|
|
51
|
+
'who.int', 'un.org', 'worldbank.org', 'imf.org', 'oecd.org', 'europa.eu',
|
|
52
|
+
'nato.int', 'wto.org', 'unicef.org', 'unhcr.org', 'icrc.org',
|
|
53
|
+
// Academic / research
|
|
54
|
+
'arxiv.org', 'pubmed.ncbi.nlm.nih.gov', 'ncbi.nlm.nih.gov', 'jstor.org',
|
|
55
|
+
'nature.com', 'science.org', 'cell.com', 'nejm.org', 'bmj.com',
|
|
56
|
+
'thelancet.com', 'plos.org', 'springer.com', 'elsevier.com',
|
|
57
|
+
'scholar.google.com', 'researchgate.net', 'semanticscholar.org',
|
|
58
|
+
'acm.org', 'ieee.org',
|
|
59
|
+
// Official tech documentation
|
|
60
|
+
'docs.python.org', 'developer.mozilla.org', 'nodejs.org', 'rust-lang.org',
|
|
61
|
+
'docs.microsoft.com', 'learn.microsoft.com', 'developer.apple.com',
|
|
62
|
+
'developer.android.com', 'php.net', 'ruby-lang.org', 'golang.org', 'go.dev',
|
|
63
|
+
// Health
|
|
64
|
+
'mayoclinic.org', 'clevelandclinic.org', 'webmd.com',
|
|
65
|
+
// Standards / specs
|
|
66
|
+
'w3.org', 'ietf.org', 'rfc-editor.org', 'iso.org', 'ecma-international.org',
|
|
67
|
+
]);
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Established domains (score bonus 40 pts) — 500+ entries
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
const ESTABLISHED_DOMAINS = new Set([
|
|
72
|
+
// ── Major Tech ──────────────────────────────────────────────────────────
|
|
73
|
+
'google.com', 'apple.com', 'microsoft.com', 'amazon.com', 'meta.com',
|
|
74
|
+
'netflix.com', 'spotify.com', 'adobe.com', 'salesforce.com', 'oracle.com',
|
|
75
|
+
'ibm.com', 'intel.com', 'nvidia.com', 'amd.com', 'qualcomm.com',
|
|
76
|
+
'cisco.com', 'vmware.com', 'sap.com', 'servicenow.com', 'workday.com',
|
|
77
|
+
'zoom.us', 'slack.com', 'dropbox.com', 'box.com', 'atlassian.com',
|
|
78
|
+
'jira.atlassian.com', 'confluence.atlassian.com',
|
|
79
|
+
'twilio.com', 'sendgrid.com', 'mailchimp.com', 'hubspot.com',
|
|
80
|
+
'zendesk.com', 'intercom.com', 'freshworks.com', 'docusign.com',
|
|
81
|
+
'okta.com', 'auth0.com', 'cloudflare.com', 'fastly.com', 'akamai.com',
|
|
82
|
+
'digitalocean.com', 'linode.com', 'vultr.com',
|
|
83
|
+
'datadog.com', 'newrelic.com', 'splunk.com', 'elastic.co',
|
|
84
|
+
'mongodb.com', 'redis.io', 'postgresql.org', 'mysql.com',
|
|
85
|
+
'docker.com', 'kubernetes.io', 'helm.sh',
|
|
86
|
+
'terraform.io', 'ansible.com', 'chef.io', 'puppet.com',
|
|
87
|
+
'heroku.com', 'render.com', 'railway.app', 'fly.io',
|
|
88
|
+
'supabase.com', 'planetscale.com', 'neon.tech', 'fauna.com',
|
|
89
|
+
'firebase.google.com', 'expo.dev',
|
|
90
|
+
'openai.com', 'anthropic.com', 'cohere.com', 'huggingface.co',
|
|
91
|
+
'stability.ai', 'midjourney.com', 'replicate.com',
|
|
92
|
+
'figma.com', 'sketch.com', 'invisionapp.com', 'zeplin.io',
|
|
93
|
+
'notion.so', 'airtable.com', 'monday.com', 'asana.com', 'clickup.com',
|
|
94
|
+
'trello.com', 'basecamp.com', 'linear.app', 'shortcut.com',
|
|
95
|
+
'postman.com', 'insomnia.rest', 'swagger.io',
|
|
96
|
+
'sentry.io', 'bugsnag.com', 'rollbar.com',
|
|
97
|
+
'segment.com', 'mixpanel.com', 'amplitude.com', 'heap.io',
|
|
98
|
+
'looker.com', 'tableau.com', 'powerbi.microsoft.com',
|
|
99
|
+
'snowflake.com', 'databricks.com', 'dbt.com', 'fivetran.com', 'airbyte.com',
|
|
100
|
+
'vercel.com', 'netlify.com',
|
|
101
|
+
// ── Cloud / Hosting ──────────────────────────────────────────────────────
|
|
102
|
+
'aws.amazon.com', 'cloud.google.com', 'azure.microsoft.com',
|
|
103
|
+
'docs.aws.amazon.com', 'console.aws.amazon.com',
|
|
104
|
+
// ── Developer Ecosystems ──────────────────────────────────────────────────
|
|
105
|
+
'github.com', 'gitlab.com', 'bitbucket.org', 'sourcehut.com',
|
|
106
|
+
'stackoverflow.com', 'superuser.com', 'serverfault.com',
|
|
107
|
+
'npmjs.com', 'pypi.org', 'crates.io', 'packagist.org', 'rubygems.org',
|
|
108
|
+
'nuget.org', 'pub.dev', 'hex.pm', 'opam.ocaml.org',
|
|
109
|
+
'docs.rs', 'crates.io', 'pkg.go.dev',
|
|
110
|
+
'codepen.io', 'jsfiddle.net', 'replit.com', 'glitch.com', 'codesandbox.io',
|
|
111
|
+
'leetcode.com', 'hackerrank.com', 'codewars.com', 'exercism.org',
|
|
112
|
+
'regex101.com', 'regexr.com',
|
|
113
|
+
// ── Major Social ──────────────────────────────────────────────────────────
|
|
114
|
+
'twitter.com', 'x.com', 'reddit.com', 'linkedin.com', 'instagram.com',
|
|
115
|
+
'facebook.com', 'youtube.com', 'tiktok.com', 'snapchat.com', 'pinterest.com',
|
|
116
|
+
'tumblr.com', 'mastodon.social', 'threads.net', 'discord.com', 'discord.gg',
|
|
117
|
+
'twitch.tv', 'kick.com', 'vimeo.com', 'dailymotion.com',
|
|
118
|
+
'quora.com', 'medium.com', 'substack.com', 'hashnode.com', 'dev.to',
|
|
119
|
+
// ── Major News ────────────────────────────────────────────────────────────
|
|
120
|
+
'nytimes.com', 'washingtonpost.com', 'theguardian.com', 'bbc.com', 'bbc.co.uk',
|
|
121
|
+
'reuters.com', 'apnews.com', 'bloomberg.com', 'economist.com', 'ft.com',
|
|
122
|
+
'wsj.com', 'cnn.com', 'foxnews.com', 'msnbc.com', 'nbcnews.com',
|
|
123
|
+
'cbsnews.com', 'abcnews.go.com', 'npr.org', 'pbs.org',
|
|
124
|
+
'time.com', 'usatoday.com', 'huffpost.com', 'vox.com', 'axios.com',
|
|
125
|
+
'politico.com', 'thehill.com', 'rollcall.com', 'slate.com', 'salon.com',
|
|
126
|
+
'theatlantic.com', 'newyorker.com', 'newrepublic.com',
|
|
127
|
+
'motherjones.com', 'propublica.org', 'intercept.co',
|
|
128
|
+
'aljazeera.com', 'dw.com', 'france24.com', 'rt.com',
|
|
129
|
+
'spiegel.de', 'lemonde.fr', 'liberation.fr', 'lefigaro.fr',
|
|
130
|
+
'elpais.com', 'elmundo.es', 'repubblica.it', 'corriere.it',
|
|
131
|
+
'theglobeandmail.com', 'thestar.com', 'nationalpost.com',
|
|
132
|
+
'smh.com.au', 'theage.com.au', 'abc.net.au',
|
|
133
|
+
'timesofindia.com', 'hindustantimes.com', 'thehindu.com', 'ndtv.com',
|
|
134
|
+
'scmp.com', 'channelnewsasia.com', 'straitstimes.com',
|
|
135
|
+
'haaretz.com', 'timesofisrael.com', 'jpost.com',
|
|
136
|
+
'techcrunch.com', 'wired.com', 'arstechnica.com', 'theverge.com',
|
|
137
|
+
'engadget.com', 'gizmodo.com', 'cnet.com', 'pcmag.com', 'tomshardware.com',
|
|
138
|
+
'anandtech.com', 'macrumors.com', '9to5mac.com', '9to5google.com',
|
|
139
|
+
'androidcentral.com', 'windowscentral.com',
|
|
140
|
+
'venturebeat.com', 'businessinsider.com', 'forbes.com', 'fortune.com',
|
|
141
|
+
'inc.com', 'entrepreneur.com', 'fastcompany.com',
|
|
142
|
+
// ── Finance ───────────────────────────────────────────────────────────────
|
|
143
|
+
'chase.com', 'bankofamerica.com', 'wellsfargo.com', 'citibank.com',
|
|
144
|
+
'capitalone.com', 'usbank.com', 'tdbank.com', 'pnc.com',
|
|
145
|
+
'americanexpress.com', 'discover.com', 'synchrony.com',
|
|
146
|
+
'paypal.com', 'stripe.com', 'square.com', 'braintree.com', 'adyen.com',
|
|
147
|
+
'coinbase.com', 'binance.com', 'kraken.com', 'gemini.com', 'crypto.com',
|
|
148
|
+
'robinhood.com', 'etrade.com', 'schwab.com', 'fidelity.com',
|
|
149
|
+
'vanguard.com', 'blackrock.com', 'jpmorgan.com', 'goldmansachs.com',
|
|
150
|
+
'morganstanley.com', 'ubs.com', 'credit-suisse.com', 'hsbc.com',
|
|
151
|
+
'barclays.com', 'lloydsbank.com', 'natwest.com', 'santander.com',
|
|
152
|
+
'transferwise.com', 'wise.com', 'revolut.com', 'monzo.com',
|
|
153
|
+
'quickbooks.intuit.com', 'turbotax.intuit.com', 'mint.com', 'hrblock.com',
|
|
154
|
+
'experian.com', 'equifax.com', 'transunion.com',
|
|
155
|
+
// ── E-commerce / Retail ──────────────────────────────────────────────────
|
|
156
|
+
'amazon.com', 'ebay.com', 'etsy.com', 'walmart.com', 'target.com',
|
|
157
|
+
'bestbuy.com', 'costco.com', 'homedepot.com', 'lowes.com', 'wayfair.com',
|
|
158
|
+
'shopify.com', 'bigcommerce.com', 'woocommerce.com', 'squarespace.com',
|
|
159
|
+
'overstock.com', 'newegg.com', 'bhphotovideo.com', 'adorama.com',
|
|
160
|
+
'aliexpress.com', 'alibaba.com', 'wish.com', 'dhgate.com',
|
|
161
|
+
'zappos.com', 'nordstrom.com', 'macys.com', 'bloomingdales.com', 'gap.com',
|
|
162
|
+
'nike.com', 'adidas.com', 'reebok.com', 'underarmour.com', 'lululemon.com',
|
|
163
|
+
'ikea.com', 'crate.com', 'potterybarn.com', 'williams-sonoma.com',
|
|
164
|
+
'chewy.com', 'petco.com', 'petsmart.com',
|
|
165
|
+
'instacart.com', 'doordash.com', 'ubereats.com', 'grubhub.com',
|
|
166
|
+
'opentable.com', 'yelp.com', 'tripadvisor.com',
|
|
167
|
+
// ── Travel ────────────────────────────────────────────────────────────────
|
|
168
|
+
'booking.com', 'expedia.com', 'airbnb.com', 'vrbo.com', 'kayak.com',
|
|
169
|
+
'hotels.com', 'priceline.com', 'orbitz.com', 'travelocity.com',
|
|
170
|
+
'delta.com', 'united.com', 'aa.com', 'southwest.com', 'jetblue.com',
|
|
171
|
+
'marriott.com', 'hilton.com', 'hyatt.com', 'ihg.com', 'wyndham.com',
|
|
172
|
+
'uber.com', 'lyft.com', 'waymo.com',
|
|
173
|
+
// ── Education ─────────────────────────────────────────────────────────────
|
|
174
|
+
'coursera.org', 'edx.org', 'khanacademy.org', 'udemy.com', 'udacity.com',
|
|
175
|
+
'pluralsight.com', 'lynda.com', 'linkedin.com', 'skillshare.com',
|
|
176
|
+
'codecademy.com', 'freecodecamp.org', 'theodinproject.com',
|
|
177
|
+
'brilliant.org', 'duolingo.com', 'babbel.com', 'rosettastone.com',
|
|
178
|
+
'cambridgeinternational.org',
|
|
179
|
+
'britannica.com', 'encyclopedia.com',
|
|
180
|
+
// ── Reference / Knowledge ─────────────────────────────────────────────────
|
|
181
|
+
'wikipedia.org', 'wikimedia.org', 'wikihow.com', 'wikidata.org',
|
|
182
|
+
'imdb.com', 'rottentomatoes.com', 'metacritic.com', 'goodreads.com',
|
|
183
|
+
'nationalgeographic.com', 'smithsonianmag.com', 'history.com',
|
|
184
|
+
'wolframalpha.com', 'dictionary.com', 'merriam-webster.com',
|
|
185
|
+
'etymonline.com', 'thesaurus.com',
|
|
186
|
+
'archive.org', 'waybackmachine.org',
|
|
187
|
+
// ── Health ────────────────────────────────────────────────────────────────
|
|
188
|
+
'webmd.com', 'mayoclinic.org', 'clevelandclinic.org', 'healthline.com',
|
|
189
|
+
'medicalnewstoday.com', 'everydayhealth.com', 'drugs.com',
|
|
190
|
+
'rxlist.com', 'medscape.com', 'uptodate.com', 'emedicinehealth.com',
|
|
191
|
+
'psych.org', 'nami.org', 'betterhelp.com', 'talkspace.com',
|
|
192
|
+
// ── Legal ─────────────────────────────────────────────────────────────────
|
|
193
|
+
'law.cornell.edu', 'justia.com', 'findlaw.com', 'nolo.com', 'avvo.com',
|
|
194
|
+
'legalzoom.com', 'rocket lawyer.com',
|
|
195
|
+
// ── Government / Civic (beyond TLD) ──────────────────────────────────────
|
|
196
|
+
'gov.uk', 'gc.ca', 'australia.gov.au',
|
|
197
|
+
// ── Open Source / Misc Tech ──────────────────────────────────────────────
|
|
198
|
+
'linux.org', 'kernel.org', 'gnu.org', 'apache.org', 'mozilla.org',
|
|
199
|
+
'python.org', 'perl.org', 'haskell.org',
|
|
200
|
+
'jquery.com', 'reactjs.org', 'react.dev', 'vuejs.org', 'angular.io',
|
|
201
|
+
'svelte.dev', 'nextjs.org', 'nuxtjs.org', 'remix.run', 'astro.build',
|
|
202
|
+
'tailwindcss.com', 'getbootstrap.com', 'mui.com', 'chakra-ui.com',
|
|
203
|
+
'styled-components.com', 'emotion.sh',
|
|
204
|
+
'vitejs.dev', 'webpack.js.org', 'rollupjs.org', 'esbuild.github.io',
|
|
205
|
+
'babeljs.io', 'eslint.org', 'prettier.io', 'typescript.dev',
|
|
206
|
+
'typescriptlang.org', 'deno.com', 'deno.land', 'bun.sh',
|
|
207
|
+
'expressjs.com', 'fastify.io', 'nestjs.com', 'koajs.com', 'hapi.dev',
|
|
208
|
+
'graphql.org', 'apollographql.com', 'trpc.io', 'grpc.io',
|
|
209
|
+
'prisma.io', 'drizzle.team', 'typeorm.io', 'sequelize.org',
|
|
210
|
+
'socket.io', 'feathersjs.com',
|
|
211
|
+
'git-scm.com', 'gitkraken.com',
|
|
212
|
+
'homebrew.sh', 'brew.sh', 'chocolatey.org', 'scoop.sh', 'winget.run',
|
|
213
|
+
'ubuntu.com', 'debian.org', 'fedoraproject.org', 'archlinux.org',
|
|
214
|
+
'redhat.com', 'suse.com', 'centos.org',
|
|
215
|
+
// ── Security / Privacy ───────────────────────────────────────────────────
|
|
216
|
+
'haveibeenpwned.com', 'virustotal.com', '1password.com', 'bitwarden.com',
|
|
217
|
+
'lastpass.com', 'dashlane.com', 'nordvpn.com', 'expressvpn.com',
|
|
218
|
+
'protonmail.com', 'proton.me', 'tutanota.com', 'fastmail.com',
|
|
219
|
+
'letsencrypt.org', 'ssllabs.com', 'namecheap.com', 'godaddy.com',
|
|
220
|
+
'porkbun.com', 'cloudflare.com', 'dnschecker.org',
|
|
221
|
+
// ── Search ────────────────────────────────────────────────────────────────
|
|
222
|
+
'google.com', 'bing.com', 'yahoo.com', 'duckduckgo.com', 'brave.com',
|
|
223
|
+
'startpage.com', 'ecosia.org', 'kagi.com',
|
|
224
|
+
// ── Productivity ─────────────────────────────────────────────────────────
|
|
225
|
+
'gmail.com', 'outlook.com', 'office.com', 'office365.com',
|
|
226
|
+
'docs.google.com', 'drive.google.com', 'calendar.google.com',
|
|
227
|
+
'maps.google.com', 'translate.google.com',
|
|
228
|
+
'evernote.com', 'onenote.com', 'bear.app', 'obsidian.md',
|
|
229
|
+
'cal.com', 'calendly.com', 'doodle.com', 'when2meet.com',
|
|
230
|
+
'loom.com', 'screen.studio', 'cleanshot.com',
|
|
231
|
+
'canva.com', 'unsplash.com', 'pexels.com', 'pixabay.com',
|
|
232
|
+
'shutterstock.com', 'gettyimages.com', 'istockphoto.com',
|
|
233
|
+
'giphy.com', 'tenor.com',
|
|
234
|
+
// ── Music / Media ─────────────────────────────────────────────────────────
|
|
235
|
+
'soundcloud.com', 'bandcamp.com', 'last.fm', 'allmusic.com',
|
|
236
|
+
'discogs.com', 'genius.com', 'azlyrics.com', 'musixmatch.com',
|
|
237
|
+
'hulu.com', 'disneyplus.com', 'hbomax.com', 'max.com',
|
|
238
|
+
'peacocktv.com', 'paramount.com', 'crunchyroll.com', 'funimation.com',
|
|
239
|
+
'apple.com', 'music.apple.com',
|
|
240
|
+
// ── Gaming ───────────────────────────────────────────────────────────────
|
|
241
|
+
'steam.com', 'steampowered.com', 'epicgames.com', 'gog.com',
|
|
242
|
+
'itch.io', 'roblox.com', 'minecraft.net', 'ea.com',
|
|
243
|
+
'activision.com', 'blizzard.com', 'battle.net', 'ubisoft.com',
|
|
244
|
+
'nintendo.com', 'playstation.com', 'xbox.com',
|
|
245
|
+
'ign.com', 'gamespot.com', 'kotaku.com', 'polygon.com',
|
|
246
|
+
'pcgamer.com', 'rockpapershotgun.com',
|
|
247
|
+
// ── Science / Research ───────────────────────────────────────────────────
|
|
248
|
+
'nasa.gov', 'esa.int', 'noaa.gov', 'nist.gov', 'usgs.gov',
|
|
249
|
+
'epa.gov', 'energy.gov', 'nsf.gov',
|
|
250
|
+
'acs.org', 'aps.org', 'aip.org', 'ams.org',
|
|
251
|
+
'newsweek.com', 'scientificamerican.com', 'popularmechanics.com',
|
|
252
|
+
'livescience.com', 'space.com', 'phys.org', 'sciencedaily.com',
|
|
253
|
+
'technologyreview.com',
|
|
254
|
+
// ── Mapping / Location ────────────────────────────────────────────────────
|
|
255
|
+
'openstreetmap.org', 'mapbox.com', 'here.com', 'waze.com',
|
|
256
|
+
'zillow.com', 'redfin.com', 'realtor.com', 'trulia.com', 'apartments.com',
|
|
257
|
+
// ── HR / Recruiting ───────────────────────────────────────────────────────
|
|
258
|
+
'indeed.com', 'glassdoor.com', 'monster.com', 'ziprecruiter.com',
|
|
259
|
+
'careerbuilder.com', 'simplyhired.com', 'flexjobs.com', 'remote.com',
|
|
260
|
+
'levels.fyi', 'teamblind.com', 'angellist.com', 'wellfound.com',
|
|
261
|
+
// ── Misc established ─────────────────────────────────────────────────────
|
|
262
|
+
'hbr.org', 'mckinsey.com', 'bcg.com', 'bain.com', 'deloitte.com',
|
|
263
|
+
'pwc.com', 'kpmg.com', 'ey.com', 'accenture.com',
|
|
264
|
+
'gartner.com', 'idc.com', 'forrester.com',
|
|
265
|
+
'ted.com', 'masterclass.com',
|
|
266
|
+
'change.org', 'gofundme.com', 'kickstarter.com', 'indiegogo.com',
|
|
267
|
+
'patreon.com', 'ko-fi.com', 'buymeacoffee.com',
|
|
268
|
+
'webpeel.dev',
|
|
269
|
+
]);
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Community / content platforms — user content hosted on established infra
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
const COMMUNITY_PLATFORMS = new Map([
|
|
274
|
+
['github.com', 'Community Content on GitHub'],
|
|
275
|
+
['github.io', 'Personal Site on GitHub Pages'],
|
|
276
|
+
['gitlab.com', 'Community Content on GitLab'],
|
|
277
|
+
['medium.com', 'Article on Medium'],
|
|
278
|
+
['substack.com', 'Newsletter on Substack'],
|
|
279
|
+
['hashnode.com', 'Blog on Hashnode'],
|
|
280
|
+
['dev.to', 'Article on DEV Community'],
|
|
281
|
+
['wordpress.com', 'Blog on WordPress'],
|
|
282
|
+
['blogspot.com', 'Blog on Blogger'],
|
|
283
|
+
['blogger.com', 'Blog on Blogger'],
|
|
284
|
+
['tumblr.com', 'Blog on Tumblr'],
|
|
285
|
+
['weebly.com', 'Site on Weebly'],
|
|
286
|
+
['wix.com', 'Site on Wix'],
|
|
287
|
+
['squarespace.com', 'Site on Squarespace'],
|
|
288
|
+
['webflow.io', 'Site on Webflow'],
|
|
289
|
+
['vercel.app', 'Deployed Project on Vercel'],
|
|
290
|
+
['netlify.app', 'Deployed Project on Netlify'],
|
|
291
|
+
['pages.dev', 'Deployed Project on Cloudflare Pages'],
|
|
292
|
+
['web.app', 'Firebase Hosted App'],
|
|
293
|
+
['firebaseapp.com', 'Firebase Hosted App'],
|
|
294
|
+
['herokuapp.com', 'App on Heroku'],
|
|
295
|
+
['replit.dev', 'Project on Replit'],
|
|
296
|
+
['glitch.me', 'Project on Glitch'],
|
|
297
|
+
['codesandbox.io', 'Sandbox on CodeSandbox'],
|
|
298
|
+
['stackblitz.com', 'Project on StackBlitz'],
|
|
299
|
+
['codepen.io', 'Pen on CodePen'],
|
|
300
|
+
['jsfiddle.net', 'Fiddle on JSFiddle'],
|
|
301
|
+
['notion.site', 'Notion Page'],
|
|
302
|
+
['gitbook.io', 'Docs on GitBook'],
|
|
303
|
+
['gitbook.com', 'Docs on GitBook'],
|
|
304
|
+
['readthedocs.io', 'Docs on Read the Docs'],
|
|
305
|
+
['readthedocs.org', 'Docs on Read the Docs'],
|
|
306
|
+
['reddit.com', 'Community Discussion on Reddit'],
|
|
307
|
+
['news.ycombinator.com', 'Discussion on Hacker News'],
|
|
308
|
+
['quora.com', 'Answer on Quora'],
|
|
309
|
+
['stackoverflow.com', 'Answer on Stack Overflow'],
|
|
310
|
+
['stackexchange.com', 'Answer on Stack Exchange'],
|
|
311
|
+
['producthunt.com', 'Launch on Product Hunt'],
|
|
312
|
+
['indiehackers.com', 'Post on Indie Hackers'],
|
|
313
|
+
['hackernoon.com', 'Article on HackerNoon'],
|
|
314
|
+
['lobste.rs', 'Discussion on Lobsters'],
|
|
315
|
+
['lobsters.rs', 'Discussion on Lobsters'],
|
|
316
|
+
['twitter.com', 'Post on X (Twitter)'],
|
|
317
|
+
['x.com', 'Post on X (Twitter)'],
|
|
318
|
+
['linkedin.com', 'Post on LinkedIn'],
|
|
319
|
+
['youtube.com', 'Video on YouTube'],
|
|
320
|
+
['vimeo.com', 'Video on Vimeo'],
|
|
321
|
+
['twitch.tv', 'Stream on Twitch'],
|
|
322
|
+
['soundcloud.com', 'Audio on SoundCloud'],
|
|
323
|
+
['bandcamp.com', 'Music on Bandcamp'],
|
|
324
|
+
['pinterest.com', 'Pin on Pinterest'],
|
|
325
|
+
['instagram.com', 'Post on Instagram'],
|
|
326
|
+
['tiktok.com', 'Video on TikTok'],
|
|
327
|
+
]);
|
|
328
|
+
// ---------------------------------------------------------------------------
|
|
329
|
+
// Brand-category labels for established domains
|
|
330
|
+
// ---------------------------------------------------------------------------
|
|
331
|
+
const DOMAIN_CATEGORY = {
|
|
332
|
+
// Tech
|
|
333
|
+
'google.com': 'Established Technology Company',
|
|
334
|
+
'apple.com': 'Established Technology Company',
|
|
335
|
+
'microsoft.com': 'Established Technology Company',
|
|
336
|
+
'amazon.com': 'Established E-commerce & Cloud Platform',
|
|
337
|
+
'meta.com': 'Established Technology Company',
|
|
338
|
+
'netflix.com': 'Established Streaming Service',
|
|
339
|
+
'spotify.com': 'Established Music Streaming Service',
|
|
340
|
+
'openai.com': 'Established AI Research Company',
|
|
341
|
+
'anthropic.com': 'Established AI Research Company',
|
|
342
|
+
'github.com': 'Established Developer Platform',
|
|
343
|
+
'gitlab.com': 'Established Developer Platform',
|
|
344
|
+
'stackoverflow.com': 'Established Developer Q&A Platform',
|
|
345
|
+
'npmjs.com': 'Established Package Registry',
|
|
346
|
+
'pypi.org': 'Established Package Registry',
|
|
347
|
+
'docker.com': 'Established Container Platform',
|
|
348
|
+
'vercel.com': 'Established Hosting Platform',
|
|
349
|
+
'netlify.com': 'Established Hosting Platform',
|
|
350
|
+
'cloudflare.com': 'Established CDN & Security Provider',
|
|
351
|
+
'figma.com': 'Established Design Platform',
|
|
352
|
+
'notion.so': 'Established Productivity Platform',
|
|
353
|
+
'slack.com': 'Established Business Communication Platform',
|
|
354
|
+
'zoom.us': 'Established Video Communication Platform',
|
|
355
|
+
'adobe.com': 'Established Creative Software Company',
|
|
356
|
+
// News
|
|
357
|
+
'nytimes.com': 'Established News Organization',
|
|
358
|
+
'washingtonpost.com': 'Established News Organization',
|
|
359
|
+
'theguardian.com': 'Established News Organization',
|
|
360
|
+
'bbc.com': 'Established News Organization',
|
|
361
|
+
'bbc.co.uk': 'Established News Organization',
|
|
362
|
+
'reuters.com': 'Established News Agency',
|
|
363
|
+
'apnews.com': 'Established News Agency',
|
|
364
|
+
'bloomberg.com': 'Established Financial News Organization',
|
|
365
|
+
'economist.com': 'Established News Publication',
|
|
366
|
+
'ft.com': 'Established Financial News Organization',
|
|
367
|
+
'wsj.com': 'Established Financial News Organization',
|
|
368
|
+
'cnn.com': 'Established News Organization',
|
|
369
|
+
'npr.org': 'Established Public Radio',
|
|
370
|
+
'techcrunch.com': 'Established Technology News Publication',
|
|
371
|
+
'wired.com': 'Established Technology News Publication',
|
|
372
|
+
'arstechnica.com': 'Established Technology News Publication',
|
|
373
|
+
'theverge.com': 'Established Technology News Publication',
|
|
374
|
+
// Finance
|
|
375
|
+
'paypal.com': 'Established Payment Platform',
|
|
376
|
+
'stripe.com': 'Established Payment Platform',
|
|
377
|
+
'square.com': 'Established Payment Platform',
|
|
378
|
+
'coinbase.com': 'Established Cryptocurrency Exchange',
|
|
379
|
+
'chase.com': 'Established Financial Institution',
|
|
380
|
+
'bankofamerica.com': 'Established Financial Institution',
|
|
381
|
+
'wellsfargo.com': 'Established Financial Institution',
|
|
382
|
+
// E-commerce
|
|
383
|
+
'ebay.com': 'Established E-commerce Marketplace',
|
|
384
|
+
'etsy.com': 'Established Handmade Marketplace',
|
|
385
|
+
'walmart.com': 'Established Retail Company',
|
|
386
|
+
'target.com': 'Established Retail Company',
|
|
387
|
+
'bestbuy.com': 'Established Electronics Retailer',
|
|
388
|
+
'shopify.com': 'Established E-commerce Platform',
|
|
389
|
+
// Education
|
|
390
|
+
'coursera.org': 'Established Online Education Platform',
|
|
391
|
+
'edx.org': 'Established Online Education Platform',
|
|
392
|
+
'khanacademy.org': 'Non-Profit Education Platform',
|
|
393
|
+
'udemy.com': 'Established Online Learning Marketplace',
|
|
394
|
+
'britannica.com': 'Established Reference Encyclopedia',
|
|
395
|
+
'wikipedia.org': 'Open Encyclopedia (Community Edited)',
|
|
396
|
+
// Reference
|
|
397
|
+
'archive.org': 'Established Digital Archive',
|
|
398
|
+
'wolframalpha.com': 'Established Computational Knowledge Engine',
|
|
399
|
+
'imdb.com': 'Established Movie & TV Database',
|
|
400
|
+
};
|
|
401
|
+
// ---------------------------------------------------------------------------
|
|
402
|
+
// Helpers
|
|
403
|
+
// ---------------------------------------------------------------------------
|
|
404
|
+
function extractTLD(hostname) {
|
|
405
|
+
const parts = hostname.split('.');
|
|
406
|
+
if (parts.length < 2)
|
|
407
|
+
return '';
|
|
408
|
+
return '.' + parts.slice(-1)[0];
|
|
409
|
+
}
|
|
410
|
+
function extractSLD(hostname) {
|
|
411
|
+
// Returns registrable domain (e.g. "google.com")
|
|
412
|
+
const parts = hostname.split('.');
|
|
413
|
+
if (parts.length < 2)
|
|
414
|
+
return hostname;
|
|
415
|
+
return parts.slice(-2).join('.');
|
|
416
|
+
}
|
|
417
|
+
function countSubdomains(hostname) {
|
|
418
|
+
// www.example.com → 0 subdomains (www doesn't count)
|
|
419
|
+
const stripped = hostname.replace(/^www\./, '');
|
|
420
|
+
const parts = stripped.split('.');
|
|
421
|
+
return Math.max(0, parts.length - 2);
|
|
422
|
+
}
|
|
423
|
+
// ---------------------------------------------------------------------------
|
|
424
|
+
// Main export
|
|
425
|
+
// ---------------------------------------------------------------------------
|
|
426
|
+
/**
|
|
427
|
+
* Assess the credibility of a source URL.
|
|
428
|
+
* Fully synchronous — no network calls.
|
|
429
|
+
*/
|
|
430
|
+
export function getSourceCredibility(url) {
|
|
431
|
+
const signals = [];
|
|
432
|
+
const warnings = [];
|
|
433
|
+
let score = 0;
|
|
434
|
+
// ── Parse URL ─────────────────────────────────────────────────────────────
|
|
435
|
+
let parsedUrl;
|
|
436
|
+
try {
|
|
437
|
+
parsedUrl = new URL(url);
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
return {
|
|
441
|
+
tier: 'suspicious',
|
|
442
|
+
score: 0,
|
|
443
|
+
label: 'Invalid URL — Cannot Assess',
|
|
444
|
+
signals: [],
|
|
445
|
+
warnings: ['URL could not be parsed'],
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
const protocol = parsedUrl.protocol; // 'https:' or 'http:'
|
|
449
|
+
const rawHostname = parsedUrl.hostname.toLowerCase();
|
|
450
|
+
const hostname = rawHostname.replace(/^www\./, '');
|
|
451
|
+
const tld = extractTLD(hostname);
|
|
452
|
+
const sld = extractSLD(hostname); // e.g. "google.com"
|
|
453
|
+
const subdomainCount = countSubdomains(rawHostname);
|
|
454
|
+
// ── 1. HTTPS check (0–10 pts) ─────────────────────────────────────────────
|
|
455
|
+
if (protocol === 'https:') {
|
|
456
|
+
score += 10;
|
|
457
|
+
signals.push('HTTPS enforced');
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
warnings.push('HTTP only — no encryption');
|
|
461
|
+
}
|
|
462
|
+
// ── 2. TLD trust (0–20 pts) ───────────────────────────────────────────────
|
|
463
|
+
const tldScore = TLD_TRUST[tld] ?? 5;
|
|
464
|
+
score += tldScore;
|
|
465
|
+
if (tldScore >= 18) {
|
|
466
|
+
signals.push(`Trusted TLD (${tld})`);
|
|
467
|
+
}
|
|
468
|
+
else if (tldScore <= 3) {
|
|
469
|
+
warnings.push(`High-risk TLD (${tld}) — commonly used in phishing`);
|
|
470
|
+
}
|
|
471
|
+
// ── 3. Official TLD shortcut ──────────────────────────────────────────────
|
|
472
|
+
if (OFFICIAL_TLDS.has(tld) || OFFICIAL_DOMAINS.has(hostname) || OFFICIAL_DOMAINS.has(sld)) {
|
|
473
|
+
const category = DOMAIN_CATEGORY[hostname] ?? DOMAIN_CATEGORY[sld] ?? 'Official Source';
|
|
474
|
+
return {
|
|
475
|
+
tier: 'official',
|
|
476
|
+
score: Math.min(100, score + 40 + 15),
|
|
477
|
+
label: tld === '.gov' ? 'Official Government Source' :
|
|
478
|
+
tld === '.edu' ? 'Official Educational Institution' :
|
|
479
|
+
tld === '.mil' ? 'Official Military Source' :
|
|
480
|
+
tld === '.int' ? 'International Organization' :
|
|
481
|
+
category,
|
|
482
|
+
signals: [...signals, 'Official domain verified', `Trusted TLD (${tld})`].filter((v, i, a) => a.indexOf(v) === i),
|
|
483
|
+
warnings,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
// ── 4. Domain structure (0–15 pts) ────────────────────────────────────────
|
|
487
|
+
if (subdomainCount === 0) {
|
|
488
|
+
score += 15;
|
|
489
|
+
signals.push('Clean domain structure');
|
|
490
|
+
}
|
|
491
|
+
else if (subdomainCount === 1) {
|
|
492
|
+
score += 10;
|
|
493
|
+
signals.push('Standard subdomain structure');
|
|
494
|
+
}
|
|
495
|
+
else if (subdomainCount === 2) {
|
|
496
|
+
score += 5;
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
// 3+ subdomains — possible phishing pattern
|
|
500
|
+
score += 0;
|
|
501
|
+
warnings.push(`Excessive subdomains (${subdomainCount}) — potential phishing indicator`);
|
|
502
|
+
}
|
|
503
|
+
// ── 5 & 6. Known domain + Community platform (mutually exclusive bonus) ──
|
|
504
|
+
// Community platform detection — user content on a known hosting platform.
|
|
505
|
+
// When the domain is a community platform, it gets the platform bonus (15 pts)
|
|
506
|
+
// but NOT the established domain bonus (they're conceptually different tiers).
|
|
507
|
+
const communityLabel = COMMUNITY_PLATFORMS.get(hostname) ?? COMMUNITY_PLATFORMS.get(sld);
|
|
508
|
+
const isEstablished = ESTABLISHED_DOMAINS.has(hostname) || ESTABLISHED_DOMAINS.has(sld);
|
|
509
|
+
if (communityLabel) {
|
|
510
|
+
// Platform bonus only — user content hosted on verified infra
|
|
511
|
+
score += 15;
|
|
512
|
+
signals.push(`Hosted on verified platform (${sld})`);
|
|
513
|
+
}
|
|
514
|
+
else if (isEstablished) {
|
|
515
|
+
// Full established domain bonus
|
|
516
|
+
score += 40;
|
|
517
|
+
signals.push('Recognized established domain');
|
|
518
|
+
}
|
|
519
|
+
// ── 7. Suspicious TLD ─────────────────────────────────────────────────────
|
|
520
|
+
if (SUSPICIOUS_TLDS.has(tld)) {
|
|
521
|
+
score = Math.min(score, 15); // Cap at suspicious tier
|
|
522
|
+
warnings.push('Domain uses a free TLD associated with fraud');
|
|
523
|
+
}
|
|
524
|
+
// ── 8. Phishing keyword detection ─────────────────────────────────────────
|
|
525
|
+
const phishingKeywords = ['paypal-', 'apple-', 'google-', 'microsoft-', 'amazon-',
|
|
526
|
+
'bank-', 'login-', 'signin-', 'secure-', 'verify-', 'account-', 'update-',
|
|
527
|
+
'support-', 'helpdesk-', '-login', '-signin', '-secure', '-verify', '-account',
|
|
528
|
+
'paypal.', 'apple.', 'google.', 'microsoft.', 'amazon.'];
|
|
529
|
+
const suspiciousPattern = phishingKeywords.some(kw => hostname.includes(kw) && !isEstablished && !communityLabel);
|
|
530
|
+
if (suspiciousPattern) {
|
|
531
|
+
score = Math.min(score, 19);
|
|
532
|
+
warnings.push('Domain contains impersonation keywords — potential phishing');
|
|
533
|
+
}
|
|
534
|
+
// ── Clamp score ───────────────────────────────────────────────────────────
|
|
535
|
+
score = Math.max(0, Math.min(100, score));
|
|
536
|
+
// ── Tier assignment ───────────────────────────────────────────────────────
|
|
537
|
+
let tier;
|
|
538
|
+
if (score >= 90)
|
|
539
|
+
tier = 'official';
|
|
540
|
+
else if (score >= 60)
|
|
541
|
+
tier = 'established';
|
|
542
|
+
else if (score >= 40)
|
|
543
|
+
tier = 'community';
|
|
544
|
+
else if (score >= 20)
|
|
545
|
+
tier = 'new';
|
|
546
|
+
else
|
|
547
|
+
tier = 'suspicious';
|
|
548
|
+
// ── Label generation ──────────────────────────────────────────────────────
|
|
549
|
+
let label;
|
|
550
|
+
if (communityLabel) {
|
|
551
|
+
label = communityLabel;
|
|
552
|
+
}
|
|
553
|
+
else if (isEstablished) {
|
|
554
|
+
label = DOMAIN_CATEGORY[hostname] ?? DOMAIN_CATEGORY[sld] ?? labelFromTier(tier, hostname, tld);
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
label = labelFromTier(tier, hostname, tld);
|
|
558
|
+
}
|
|
559
|
+
return { tier, score, label, signals, warnings };
|
|
560
|
+
}
|
|
561
|
+
// ---------------------------------------------------------------------------
|
|
562
|
+
// Generate a useful fallback label based on tier + domain context
|
|
563
|
+
// ---------------------------------------------------------------------------
|
|
564
|
+
function labelFromTier(tier, _hostname, tld) {
|
|
565
|
+
switch (tier) {
|
|
566
|
+
case 'official':
|
|
567
|
+
return 'Official Source';
|
|
568
|
+
case 'established':
|
|
569
|
+
return tld === '.org' ? 'Established Organization' :
|
|
570
|
+
tld === '.net' ? 'Established Network Service' :
|
|
571
|
+
tld === '.io' ? 'Established Tech Service' :
|
|
572
|
+
'Established Website';
|
|
573
|
+
case 'community':
|
|
574
|
+
return 'Community or Independent Website';
|
|
575
|
+
case 'new':
|
|
576
|
+
return 'Small or Recently Established Website';
|
|
577
|
+
case 'suspicious':
|
|
578
|
+
return SUSPICIOUS_TLDS.has(tld)
|
|
579
|
+
? `Free Domain TLD (${tld}) — Exercise Caution`
|
|
580
|
+
: 'Unrecognized Domain — Exercise Caution';
|
|
581
|
+
default:
|
|
582
|
+
return 'Unknown Domain — Limited Verification Available';
|
|
583
|
+
}
|
|
584
|
+
}
|