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