@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,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synonym expansion for query broadening.
|
|
3
|
+
*
|
|
4
|
+
* Provides stemmed synonym groups and a function to expand a set of stemmed
|
|
5
|
+
* query tokens with related synonyms (at a lower weight).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const queryTerms = tokenizeQuestion(question); // already stemmed
|
|
9
|
+
* const expanded = expandWithSynonyms(queryTerms);
|
|
10
|
+
* // expanded includes originals (weight=1.0) + synonyms (weight=0.5)
|
|
11
|
+
*/
|
|
12
|
+
import { stem } from './stemmer.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Synonym groups (raw, unstemmed)
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Raw synonym groups. Each group is a set of words with equivalent or near-
|
|
18
|
+
* equivalent meaning in the context of software/web documentation queries.
|
|
19
|
+
*
|
|
20
|
+
* These are stored in unstemmed form for readability; the build process stems
|
|
21
|
+
* them into STEMMED_SYNONYM_GROUPS and builds an index.
|
|
22
|
+
*/
|
|
23
|
+
export const SYNONYM_GROUPS = [
|
|
24
|
+
// Price/cost
|
|
25
|
+
['price', 'cost', 'fee', 'charge', 'rate', 'pricing', 'subscription', 'plan'],
|
|
26
|
+
// Create/build
|
|
27
|
+
['create', 'build', 'make', 'develop', 'construct', 'design', 'author', 'write', 'conceive'],
|
|
28
|
+
// Fast/quick
|
|
29
|
+
['fast', 'quick', 'rapid', 'speedy', 'swift', 'performant', 'efficient'],
|
|
30
|
+
// Big/large
|
|
31
|
+
['big', 'large', 'huge', 'enormous', 'massive', 'significant', 'substantial'],
|
|
32
|
+
// Small/tiny
|
|
33
|
+
['small', 'tiny', 'little', 'minor', 'minimal', 'compact', 'lightweight'],
|
|
34
|
+
// Error/bug
|
|
35
|
+
['error', 'bug', 'issue', 'problem', 'fault', 'defect', 'failure', 'crash'],
|
|
36
|
+
// Start/begin
|
|
37
|
+
['start', 'begin', 'launch', 'initiate', 'commence', 'found', 'establish', 'release', 'introduce'],
|
|
38
|
+
// Stop/end
|
|
39
|
+
['stop', 'end', 'finish', 'terminate', 'halt', 'cease', 'conclude'],
|
|
40
|
+
// Use/utilize
|
|
41
|
+
['use', 'utilize', 'employ', 'leverage', 'apply', 'adopt'],
|
|
42
|
+
// Help/assist
|
|
43
|
+
['help', 'assist', 'support', 'aid', 'guide', 'facilitate'],
|
|
44
|
+
// Show/display
|
|
45
|
+
['show', 'display', 'render', 'present', 'exhibit', 'demonstrate'],
|
|
46
|
+
// Get/obtain
|
|
47
|
+
['get', 'obtain', 'acquire', 'retrieve', 'fetch', 'receive', 'gain'],
|
|
48
|
+
// Send/transmit
|
|
49
|
+
['send', 'transmit', 'deliver', 'dispatch', 'forward', 'emit'],
|
|
50
|
+
// Change/modify
|
|
51
|
+
['change', 'modify', 'alter', 'update', 'revise', 'adjust', 'edit'],
|
|
52
|
+
// Delete/remove
|
|
53
|
+
['delete', 'remove', 'eliminate', 'erase', 'clear', 'purge', 'drop'],
|
|
54
|
+
// Allow/permit
|
|
55
|
+
['allow', 'permit', 'enable', 'authorize', 'grant', 'let'],
|
|
56
|
+
// Prevent/block
|
|
57
|
+
['prevent', 'block', 'prohibit', 'restrict', 'deny', 'forbid', 'disable'],
|
|
58
|
+
// Location/place
|
|
59
|
+
['location', 'place', 'position', 'site', 'area', 'region', 'spot'],
|
|
60
|
+
// Person/individual
|
|
61
|
+
['person', 'individual', 'user', 'member', 'participant', 'developer'],
|
|
62
|
+
// Feature/capability
|
|
63
|
+
['feature', 'capability', 'functionality', 'ability', 'function', 'capacity'],
|
|
64
|
+
// Limit/restrict
|
|
65
|
+
['limit', 'restrict', 'constrain', 'cap', 'bound', 'throttle'],
|
|
66
|
+
// Install/setup
|
|
67
|
+
['install', 'setup', 'configure', 'deploy', 'provision'],
|
|
68
|
+
// Compare/contrast
|
|
69
|
+
['compare', 'contrast', 'versus', 'differ', 'distinction', 'difference'],
|
|
70
|
+
// Require/need
|
|
71
|
+
['require', 'need', 'demand', 'necessitate', 'depend'],
|
|
72
|
+
// Advantage/benefit/feature
|
|
73
|
+
['advantage', 'benefit', 'pro', 'strength', 'upside', 'merit', 'feature', 'perk'],
|
|
74
|
+
// Disadvantage/drawback
|
|
75
|
+
['disadvantage', 'drawback', 'con', 'weakness', 'downside', 'limitation'],
|
|
76
|
+
// Learn/study
|
|
77
|
+
['learn', 'study', 'understand', 'explore', 'discover', 'research'],
|
|
78
|
+
// Test/verify
|
|
79
|
+
['test', 'verify', 'validate', 'check', 'confirm', 'inspect'],
|
|
80
|
+
// Connect/integrate
|
|
81
|
+
['connect', 'integrate', 'link', 'combine', 'join', 'merge', 'attach'],
|
|
82
|
+
// Document/describe
|
|
83
|
+
['document', 'describe', 'explain', 'detail', 'outline', 'specify'],
|
|
84
|
+
// Improve/optimize
|
|
85
|
+
['improve', 'optimize', 'enhance', 'upgrade', 'refine', 'boost'],
|
|
86
|
+
// Location state (where questions)
|
|
87
|
+
['base', 'headquarter', 'locate', 'situate'],
|
|
88
|
+
// Software referents (helps with coreference)
|
|
89
|
+
['platform', 'service', 'product', 'tool', 'application', 'system', 'software'],
|
|
90
|
+
// Movement/direction
|
|
91
|
+
['move', 'transfer', 'migrate', 'shift', 'relocate', 'transition'],
|
|
92
|
+
// Exist/available
|
|
93
|
+
['exist', 'available', 'present', 'accessible', 'offered'],
|
|
94
|
+
// Medical/health
|
|
95
|
+
['symptom', 'sign', 'indication', 'manifestation'],
|
|
96
|
+
['treatment', 'therapy', 'cure', 'remedy', 'medication', 'medicine'],
|
|
97
|
+
['diagnosis', 'assessment', 'evaluation', 'examination'],
|
|
98
|
+
['disease', 'illness', 'condition', 'disorder', 'ailment', 'sickness'],
|
|
99
|
+
// Financial/business
|
|
100
|
+
['revenue', 'income', 'earnings', 'sales', 'turnover'],
|
|
101
|
+
['expense', 'cost', 'spending', 'expenditure', 'outlay'],
|
|
102
|
+
['profit', 'gain', 'return', 'margin', 'surplus'],
|
|
103
|
+
['invest', 'fund', 'finance', 'capitalize', 'back'],
|
|
104
|
+
// Importance/significance
|
|
105
|
+
['important', 'significant', 'crucial', 'critical', 'vital', 'essential', 'key'],
|
|
106
|
+
['minor', 'trivial', 'negligible', 'insignificant', 'marginal'],
|
|
107
|
+
// Communication
|
|
108
|
+
['say', 'state', 'declare', 'announce', 'claim', 'assert', 'mention'],
|
|
109
|
+
['ask', 'question', 'inquire', 'query', 'request'],
|
|
110
|
+
['answer', 'reply', 'respond', 'response'],
|
|
111
|
+
// Think/believe
|
|
112
|
+
['think', 'believe', 'consider', 'regard', 'view', 'deem'],
|
|
113
|
+
['decide', 'determine', 'conclude', 'resolve', 'settle'],
|
|
114
|
+
// Outcome/result
|
|
115
|
+
['result', 'outcome', 'consequence', 'effect', 'impact', 'aftermath'],
|
|
116
|
+
['cause', 'reason', 'factor', 'trigger', 'source', 'origin'],
|
|
117
|
+
// Amount/quantity
|
|
118
|
+
['many', 'numerous', 'several', 'multiple', 'various', 'countless'],
|
|
119
|
+
['few', 'scarce', 'rare', 'limited', 'sparse'],
|
|
120
|
+
// Time
|
|
121
|
+
['before', 'prior', 'previous', 'preceding', 'earlier', 'former'],
|
|
122
|
+
['after', 'subsequent', 'following', 'later', 'next', 'succeeding'],
|
|
123
|
+
['recent', 'latest', 'newest', 'current', 'contemporary', 'modern'],
|
|
124
|
+
['old', 'ancient', 'historical', 'legacy', 'outdated', 'obsolete'],
|
|
125
|
+
];
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Build stemmed synonym index
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
/**
|
|
130
|
+
* Stemmed synonym groups.
|
|
131
|
+
* Each word in each group has been run through the Porter stemmer.
|
|
132
|
+
* Duplicate stems within a group are deduplicated.
|
|
133
|
+
*/
|
|
134
|
+
export const STEMMED_SYNONYM_GROUPS = SYNONYM_GROUPS.map(group => {
|
|
135
|
+
const stemmed = group.map(w => stem(w));
|
|
136
|
+
// Deduplicate (multiple words may stem to the same root)
|
|
137
|
+
return [...new Set(stemmed)];
|
|
138
|
+
});
|
|
139
|
+
/**
|
|
140
|
+
* Index: stemmed_word → set of other stemmed words in the same group.
|
|
141
|
+
* A word may appear in only one group (first match wins if duplicates exist).
|
|
142
|
+
*/
|
|
143
|
+
const synonymIndex = new Map();
|
|
144
|
+
for (const group of STEMMED_SYNONYM_GROUPS) {
|
|
145
|
+
for (const word of group) {
|
|
146
|
+
if (!synonymIndex.has(word)) {
|
|
147
|
+
// Store all OTHER words in the group as synonyms
|
|
148
|
+
const others = new Set(group.filter(w => w !== word));
|
|
149
|
+
synonymIndex.set(word, others);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Expand a list of stemmed query tokens with their synonyms.
|
|
155
|
+
*
|
|
156
|
+
* @param terms - Already-stemmed tokens from the query
|
|
157
|
+
* @returns Array of ExpandedTerm objects. Original terms have weight=1.0,
|
|
158
|
+
* synonym expansions have weight=0.5.
|
|
159
|
+
* The returned array preserves originals first, then synonyms.
|
|
160
|
+
*/
|
|
161
|
+
export function expandWithSynonyms(terms) {
|
|
162
|
+
const result = [];
|
|
163
|
+
const seen = new Set();
|
|
164
|
+
// Add all original terms first
|
|
165
|
+
for (const term of terms) {
|
|
166
|
+
if (!seen.has(term)) {
|
|
167
|
+
seen.add(term);
|
|
168
|
+
result.push({ term, weight: 1.0, isOriginal: true });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Add synonyms for each original term
|
|
172
|
+
for (const term of terms) {
|
|
173
|
+
const synonyms = synonymIndex.get(term);
|
|
174
|
+
if (!synonyms)
|
|
175
|
+
continue;
|
|
176
|
+
for (const syn of synonyms) {
|
|
177
|
+
if (!seen.has(syn)) {
|
|
178
|
+
seen.add(syn);
|
|
179
|
+
result.push({ term: syn, weight: 0.5, isOriginal: false });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System resource monitor — cgroup-aware for K8s containers.
|
|
3
|
+
*
|
|
4
|
+
* In K8s, os.freemem() gives WRONG numbers because it reads host memory,
|
|
5
|
+
* not the container's cgroup limit. We read /sys/fs/cgroup directly.
|
|
6
|
+
*
|
|
7
|
+
* Three-tier memory management (from Crawl4AI):
|
|
8
|
+
* - Normal: < threshold (85%) — accept all jobs
|
|
9
|
+
* - Pressure: >= threshold (85%) — log warning, reject new render jobs
|
|
10
|
+
* - Critical: >= critical (95%) — reject ALL new jobs
|
|
11
|
+
*
|
|
12
|
+
* Also tracks: CPU usage, connection count, uptime.
|
|
13
|
+
*/
|
|
14
|
+
export interface SystemHealth {
|
|
15
|
+
memory: {
|
|
16
|
+
usedBytes: number;
|
|
17
|
+
totalBytes: number;
|
|
18
|
+
usedPercent: number;
|
|
19
|
+
tier: 'normal' | 'pressure' | 'critical';
|
|
20
|
+
};
|
|
21
|
+
uptime: number;
|
|
22
|
+
isK8s: boolean;
|
|
23
|
+
canAcceptJob: boolean;
|
|
24
|
+
canAcceptRenderJob: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface SystemMonitorOptions {
|
|
27
|
+
memoryThresholdPercent?: number;
|
|
28
|
+
criticalThresholdPercent?: number;
|
|
29
|
+
recoveryThresholdPercent?: number;
|
|
30
|
+
}
|
|
31
|
+
declare class SystemMonitor {
|
|
32
|
+
private readonly IS_K8S;
|
|
33
|
+
private readonly MEM_CURRENT;
|
|
34
|
+
private readonly MEM_MAX;
|
|
35
|
+
private readonly MEM_CURRENT_V1;
|
|
36
|
+
private readonly MEM_MAX_V1;
|
|
37
|
+
private memoryThreshold;
|
|
38
|
+
private criticalThreshold;
|
|
39
|
+
private recoveryThreshold;
|
|
40
|
+
private inPressureMode;
|
|
41
|
+
private readonly startTime;
|
|
42
|
+
private consecutiveRejects;
|
|
43
|
+
private readonly MAX_CONSECUTIVE_REJECTS;
|
|
44
|
+
constructor(options?: SystemMonitorOptions);
|
|
45
|
+
/** Read memory from cgroups (K8s) or OS */
|
|
46
|
+
getMemoryUsage(): {
|
|
47
|
+
usedBytes: number;
|
|
48
|
+
totalBytes: number;
|
|
49
|
+
usedPercent: number;
|
|
50
|
+
};
|
|
51
|
+
private readCgroupMemory;
|
|
52
|
+
/** Get full health snapshot */
|
|
53
|
+
getHealth(): SystemHealth;
|
|
54
|
+
/** Quick check: can we accept a new job? */
|
|
55
|
+
canAccept(requireRender?: boolean): boolean;
|
|
56
|
+
/** Check if the worker appears stalled */
|
|
57
|
+
isStalled(): boolean;
|
|
58
|
+
}
|
|
59
|
+
/** Singleton system monitor */
|
|
60
|
+
export declare const systemMonitor: SystemMonitor;
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System resource monitor — cgroup-aware for K8s containers.
|
|
3
|
+
*
|
|
4
|
+
* In K8s, os.freemem() gives WRONG numbers because it reads host memory,
|
|
5
|
+
* not the container's cgroup limit. We read /sys/fs/cgroup directly.
|
|
6
|
+
*
|
|
7
|
+
* Three-tier memory management (from Crawl4AI):
|
|
8
|
+
* - Normal: < threshold (85%) — accept all jobs
|
|
9
|
+
* - Pressure: >= threshold (85%) — log warning, reject new render jobs
|
|
10
|
+
* - Critical: >= critical (95%) — reject ALL new jobs
|
|
11
|
+
*
|
|
12
|
+
* Also tracks: CPU usage, connection count, uptime.
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, existsSync } from 'fs';
|
|
15
|
+
import os from 'os';
|
|
16
|
+
import { createLogger } from './logger.js';
|
|
17
|
+
const log = createLogger('monitor');
|
|
18
|
+
class SystemMonitor {
|
|
19
|
+
IS_K8S;
|
|
20
|
+
MEM_CURRENT = '/sys/fs/cgroup/memory.current';
|
|
21
|
+
MEM_MAX = '/sys/fs/cgroup/memory.max';
|
|
22
|
+
// cgroup v1 fallback paths
|
|
23
|
+
MEM_CURRENT_V1 = '/sys/fs/cgroup/memory/memory.usage_in_bytes';
|
|
24
|
+
MEM_MAX_V1 = '/sys/fs/cgroup/memory/memory.limit_in_bytes';
|
|
25
|
+
memoryThreshold;
|
|
26
|
+
criticalThreshold;
|
|
27
|
+
recoveryThreshold;
|
|
28
|
+
inPressureMode = false;
|
|
29
|
+
startTime = Date.now();
|
|
30
|
+
consecutiveRejects = 0;
|
|
31
|
+
MAX_CONSECUTIVE_REJECTS = 25; // Firecrawl-style stall detection
|
|
32
|
+
constructor(options = {}) {
|
|
33
|
+
this.memoryThreshold = (options.memoryThresholdPercent ?? 85) / 100;
|
|
34
|
+
this.criticalThreshold = (options.criticalThresholdPercent ?? 95) / 100;
|
|
35
|
+
this.recoveryThreshold = (options.recoveryThresholdPercent ?? 80) / 100;
|
|
36
|
+
// Detect K8s by checking for cgroup files
|
|
37
|
+
this.IS_K8S = existsSync(this.MEM_CURRENT) || existsSync(this.MEM_CURRENT_V1);
|
|
38
|
+
if (this.IS_K8S) {
|
|
39
|
+
log.info('K8s cgroup memory monitoring active');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
log.info('Using OS-level memory monitoring (non-K8s)');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Read memory from cgroups (K8s) or OS */
|
|
46
|
+
getMemoryUsage() {
|
|
47
|
+
if (this.IS_K8S) {
|
|
48
|
+
return this.readCgroupMemory();
|
|
49
|
+
}
|
|
50
|
+
const total = os.totalmem();
|
|
51
|
+
const free = os.freemem();
|
|
52
|
+
const used = total - free;
|
|
53
|
+
return { usedBytes: used, totalBytes: total, usedPercent: used / total };
|
|
54
|
+
}
|
|
55
|
+
readCgroupMemory() {
|
|
56
|
+
try {
|
|
57
|
+
// Try cgroup v2 first, then v1
|
|
58
|
+
let currentPath = this.MEM_CURRENT;
|
|
59
|
+
let maxPath = this.MEM_MAX;
|
|
60
|
+
if (!existsSync(currentPath)) {
|
|
61
|
+
currentPath = this.MEM_CURRENT_V1;
|
|
62
|
+
maxPath = this.MEM_MAX_V1;
|
|
63
|
+
}
|
|
64
|
+
const current = parseInt(readFileSync(currentPath, 'utf8').trim(), 10);
|
|
65
|
+
const maxStr = readFileSync(maxPath, 'utf8').trim();
|
|
66
|
+
// 'max' in cgroup v2 means no limit set
|
|
67
|
+
const max = maxStr === 'max' || parseInt(maxStr, 10) > os.totalmem() * 10
|
|
68
|
+
? os.totalmem()
|
|
69
|
+
: parseInt(maxStr, 10);
|
|
70
|
+
return { usedBytes: current, totalBytes: max, usedPercent: current / max };
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// Fallback to OS-level if cgroup read fails
|
|
74
|
+
log.warn('Failed to read cgroup memory, falling back to OS-level');
|
|
75
|
+
const total = os.totalmem();
|
|
76
|
+
const free = os.freemem();
|
|
77
|
+
const used = total - free;
|
|
78
|
+
return { usedBytes: used, totalBytes: total, usedPercent: used / total };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Get full health snapshot */
|
|
82
|
+
getHealth() {
|
|
83
|
+
const mem = this.getMemoryUsage();
|
|
84
|
+
// Three-tier memory management with hysteresis
|
|
85
|
+
let tier;
|
|
86
|
+
if (mem.usedPercent >= this.criticalThreshold) {
|
|
87
|
+
tier = 'critical';
|
|
88
|
+
this.inPressureMode = true;
|
|
89
|
+
}
|
|
90
|
+
else if (mem.usedPercent >= this.memoryThreshold) {
|
|
91
|
+
tier = 'pressure';
|
|
92
|
+
this.inPressureMode = true;
|
|
93
|
+
}
|
|
94
|
+
else if (this.inPressureMode && mem.usedPercent > this.recoveryThreshold) {
|
|
95
|
+
// Hysteresis: stay in pressure until we drop below recovery threshold
|
|
96
|
+
tier = 'pressure';
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
tier = 'normal';
|
|
100
|
+
this.inPressureMode = false;
|
|
101
|
+
}
|
|
102
|
+
const canAcceptJob = tier !== 'critical';
|
|
103
|
+
const canAcceptRenderJob = tier === 'normal'; // render jobs use more memory
|
|
104
|
+
// Track consecutive rejects for stall detection
|
|
105
|
+
if (!canAcceptJob) {
|
|
106
|
+
this.consecutiveRejects++;
|
|
107
|
+
if (this.consecutiveRejects >= this.MAX_CONSECUTIVE_REJECTS) {
|
|
108
|
+
log.error(`WORKER STALLED — ${this.consecutiveRejects} consecutive job rejections. Memory: ${(mem.usedPercent * 100).toFixed(1)}%`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.consecutiveRejects = 0;
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
memory: { ...mem, tier },
|
|
116
|
+
uptime: (Date.now() - this.startTime) / 1000,
|
|
117
|
+
isK8s: this.IS_K8S,
|
|
118
|
+
canAcceptJob,
|
|
119
|
+
canAcceptRenderJob,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Quick check: can we accept a new job? */
|
|
123
|
+
canAccept(requireRender = false) {
|
|
124
|
+
const health = this.getHealth();
|
|
125
|
+
return requireRender ? health.canAcceptRenderJob : health.canAcceptJob;
|
|
126
|
+
}
|
|
127
|
+
/** Check if the worker appears stalled */
|
|
128
|
+
isStalled() {
|
|
129
|
+
return this.consecutiveRejects >= this.MAX_CONSECUTIVE_REJECTS;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Singleton system monitor */
|
|
133
|
+
export const systemMonitor = new SystemMonitor();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASCII table renderer using Unicode box-drawing characters.
|
|
3
|
+
*
|
|
4
|
+
* Renders an array of objects (e.g. {@link ListingItem}) as a neatly formatted
|
|
5
|
+
* table with auto-sized columns.
|
|
6
|
+
*
|
|
7
|
+
* @module table-format
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Render an array of row objects as a Unicode box-drawing table.
|
|
11
|
+
*
|
|
12
|
+
* Column order follows the insertion order of keys in the first row.
|
|
13
|
+
* Columns with exclusively `undefined`/empty values are omitted.
|
|
14
|
+
*
|
|
15
|
+
* @param rows - Array of plain objects.
|
|
16
|
+
* @param columns - Optional explicit column keys to include (in order).
|
|
17
|
+
* @returns Multi-line string ready for `console.log`.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { formatTable } from './table-format.js';
|
|
22
|
+
*
|
|
23
|
+
* const table = formatTable([
|
|
24
|
+
* { title: 'Widget A', price: '$10' },
|
|
25
|
+
* { title: 'Widget B', price: '$20' },
|
|
26
|
+
* ]);
|
|
27
|
+
* console.log(table);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatTable(rows: Record<string, string | undefined>[], columns?: string[]): string;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASCII table renderer using Unicode box-drawing characters.
|
|
3
|
+
*
|
|
4
|
+
* Renders an array of objects (e.g. {@link ListingItem}) as a neatly formatted
|
|
5
|
+
* table with auto-sized columns.
|
|
6
|
+
*
|
|
7
|
+
* @module table-format
|
|
8
|
+
*/
|
|
9
|
+
/* ------------------------------------------------------------------ */
|
|
10
|
+
/* Box-drawing character set */
|
|
11
|
+
/* ------------------------------------------------------------------ */
|
|
12
|
+
const BOX = {
|
|
13
|
+
topLeft: '┌',
|
|
14
|
+
topRight: '┐',
|
|
15
|
+
bottomLeft: '└',
|
|
16
|
+
bottomRight: '┘',
|
|
17
|
+
horizontal: '─',
|
|
18
|
+
vertical: '│',
|
|
19
|
+
teeDown: '┬',
|
|
20
|
+
teeUp: '┴',
|
|
21
|
+
teeRight: '├',
|
|
22
|
+
teeLeft: '┤',
|
|
23
|
+
cross: '┼',
|
|
24
|
+
};
|
|
25
|
+
/* ------------------------------------------------------------------ */
|
|
26
|
+
/* Helpers */
|
|
27
|
+
/* ------------------------------------------------------------------ */
|
|
28
|
+
const MAX_COL_WIDTH = 40;
|
|
29
|
+
const MIN_COL_WIDTH = 3;
|
|
30
|
+
/**
|
|
31
|
+
* Truncate a string to `max` visible characters. Adds `…` if truncated.
|
|
32
|
+
*/
|
|
33
|
+
function truncate(s, max) {
|
|
34
|
+
if (s.length <= max)
|
|
35
|
+
return s;
|
|
36
|
+
return s.slice(0, max - 1) + '…';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Pad (right) a string to `width` characters.
|
|
40
|
+
*/
|
|
41
|
+
function padRight(s, width) {
|
|
42
|
+
if (s.length >= width)
|
|
43
|
+
return s;
|
|
44
|
+
return s + ' '.repeat(width - s.length);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Capitalise the first letter of a string.
|
|
48
|
+
*/
|
|
49
|
+
function capitalise(s) {
|
|
50
|
+
if (!s)
|
|
51
|
+
return s;
|
|
52
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
53
|
+
}
|
|
54
|
+
/* ------------------------------------------------------------------ */
|
|
55
|
+
/* Public API */
|
|
56
|
+
/* ------------------------------------------------------------------ */
|
|
57
|
+
/**
|
|
58
|
+
* Render an array of row objects as a Unicode box-drawing table.
|
|
59
|
+
*
|
|
60
|
+
* Column order follows the insertion order of keys in the first row.
|
|
61
|
+
* Columns with exclusively `undefined`/empty values are omitted.
|
|
62
|
+
*
|
|
63
|
+
* @param rows - Array of plain objects.
|
|
64
|
+
* @param columns - Optional explicit column keys to include (in order).
|
|
65
|
+
* @returns Multi-line string ready for `console.log`.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* import { formatTable } from './table-format.js';
|
|
70
|
+
*
|
|
71
|
+
* const table = formatTable([
|
|
72
|
+
* { title: 'Widget A', price: '$10' },
|
|
73
|
+
* { title: 'Widget B', price: '$20' },
|
|
74
|
+
* ]);
|
|
75
|
+
* console.log(table);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function formatTable(rows, columns) {
|
|
79
|
+
if (rows.length === 0)
|
|
80
|
+
return '';
|
|
81
|
+
// Determine columns: explicit list or derive from all rows
|
|
82
|
+
const cols = columns ?? deriveColumns(rows);
|
|
83
|
+
if (cols.length === 0)
|
|
84
|
+
return '';
|
|
85
|
+
// Build header labels
|
|
86
|
+
const headers = cols.map(c => capitalise(c));
|
|
87
|
+
// Compute column widths (bounded by MIN/MAX)
|
|
88
|
+
const widths = cols.map((col, i) => {
|
|
89
|
+
let max = headers[i].length;
|
|
90
|
+
for (const row of rows) {
|
|
91
|
+
const val = row[col] ?? '';
|
|
92
|
+
if (val.length > max)
|
|
93
|
+
max = val.length;
|
|
94
|
+
}
|
|
95
|
+
return Math.max(MIN_COL_WIDTH, Math.min(max, MAX_COL_WIDTH));
|
|
96
|
+
});
|
|
97
|
+
// Build lines
|
|
98
|
+
const lines = [];
|
|
99
|
+
// Top border
|
|
100
|
+
lines.push(BOX.topLeft +
|
|
101
|
+
widths.map(w => BOX.horizontal.repeat(w + 2)).join(BOX.teeDown) +
|
|
102
|
+
BOX.topRight);
|
|
103
|
+
// Header row
|
|
104
|
+
lines.push(BOX.vertical +
|
|
105
|
+
headers.map((h, i) => ' ' + padRight(truncate(h, widths[i]), widths[i]) + ' ').join(BOX.vertical) +
|
|
106
|
+
BOX.vertical);
|
|
107
|
+
// Separator
|
|
108
|
+
lines.push(BOX.teeRight +
|
|
109
|
+
widths.map(w => BOX.horizontal.repeat(w + 2)).join(BOX.cross) +
|
|
110
|
+
BOX.teeLeft);
|
|
111
|
+
// Data rows
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
lines.push(BOX.vertical +
|
|
114
|
+
cols.map((col, i) => {
|
|
115
|
+
const val = row[col] ?? '';
|
|
116
|
+
return ' ' + padRight(truncate(val, widths[i]), widths[i]) + ' ';
|
|
117
|
+
}).join(BOX.vertical) +
|
|
118
|
+
BOX.vertical);
|
|
119
|
+
}
|
|
120
|
+
// Bottom border
|
|
121
|
+
lines.push(BOX.bottomLeft +
|
|
122
|
+
widths.map(w => BOX.horizontal.repeat(w + 2)).join(BOX.teeUp) +
|
|
123
|
+
BOX.bottomRight);
|
|
124
|
+
return lines.join('\n');
|
|
125
|
+
}
|
|
126
|
+
/* ------------------------------------------------------------------ */
|
|
127
|
+
/* Internals */
|
|
128
|
+
/* ------------------------------------------------------------------ */
|
|
129
|
+
/**
|
|
130
|
+
* Derive the set of columns that have at least one non-empty value across
|
|
131
|
+
* all rows. Preserves insertion order from the first row that provides a key.
|
|
132
|
+
*/
|
|
133
|
+
function deriveColumns(rows) {
|
|
134
|
+
const seen = new Set();
|
|
135
|
+
const order = [];
|
|
136
|
+
for (const row of rows) {
|
|
137
|
+
for (const key of Object.keys(row)) {
|
|
138
|
+
if (!seen.has(key)) {
|
|
139
|
+
seen.add(key);
|
|
140
|
+
order.push(key);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Filter out columns that are entirely empty
|
|
145
|
+
return order.filter(col => rows.some(r => r[col] && r[col].trim().length > 0));
|
|
146
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community threat intelligence feeds — cached in-memory, refreshed every 6 hours.
|
|
3
|
+
*
|
|
4
|
+
* Sources (all free, no API key):
|
|
5
|
+
* - URLhaus (abuse.ch): ~150K active malware distribution URLs
|
|
6
|
+
* API: https://urlhaus-api.abuse.ch/v1/url/ (POST with url=<url>)
|
|
7
|
+
* - PhishTank: community-verified phishing URLs
|
|
8
|
+
* API: https://checkurl.phishtank.com/checkurl/ (POST with url=<url>&format=json)
|
|
9
|
+
* - OpenPhish: curated phishing feed
|
|
10
|
+
* Feed: https://openphish.com/feed.txt (plain text, one URL per line, ~5K URLs)
|
|
11
|
+
*
|
|
12
|
+
* Strategy:
|
|
13
|
+
* - On startup, fetch OpenPhish feed into a Set (small, fast lookup)
|
|
14
|
+
* - For URLhaus and PhishTank, do real-time API lookups with 2s timeout
|
|
15
|
+
* - Cache results for 1 hour to avoid hammering APIs
|
|
16
|
+
*/
|
|
17
|
+
export interface ThreatFeedResult {
|
|
18
|
+
safe: boolean;
|
|
19
|
+
threats: string[];
|
|
20
|
+
source: 'urlhaus' | 'phishtank' | 'openphish' | 'none';
|
|
21
|
+
details?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function checkThreatFeeds(url: string): Promise<ThreatFeedResult>;
|