@staticn0va/wigolo 0.1.0 → 0.1.2
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 +1 -1
- package/README.md +146 -227
- package/SKILL.md +382 -0
- package/assets/blocks/claude-code/CLAUDE.md.block +20 -0
- package/assets/blocks/claude-code/wigolo-command.md +40 -0
- package/assets/blocks/cursor/wigolo.mdc +46 -0
- package/assets/blocks/gemini-cli/GEMINI.md.block +18 -0
- package/assets/blocks/vscode/copilot-instructions.md.block +18 -0
- package/assets/skills/wigolo/SKILL.md +50 -0
- package/assets/skills/wigolo/rules/cache-first.md +30 -0
- package/assets/skills/wigolo/rules/synthesis.md +43 -0
- package/assets/skills/wigolo-agent/SKILL.md +73 -0
- package/assets/skills/wigolo-crawl/SKILL.md +60 -0
- package/assets/skills/wigolo-extract/SKILL.md +59 -0
- package/assets/skills/wigolo-fetch/SKILL.md +65 -0
- package/assets/skills/wigolo-find-similar/SKILL.md +72 -0
- package/assets/skills/wigolo-research/SKILL.md +77 -0
- package/assets/skills/wigolo-search/SKILL.md +78 -0
- package/dist/agent/executor.d.ts +33 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +233 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/pipeline.d.ts +5 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +238 -0
- package/dist/agent/pipeline.js.map +1 -0
- package/dist/agent/planner.d.ts +13 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +271 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/relevance.d.ts +15 -0
- package/dist/agent/relevance.d.ts.map +1 -0
- package/dist/agent/relevance.js +60 -0
- package/dist/agent/relevance.js.map +1 -0
- package/dist/cache/backfill-embeddings.d.ts +23 -0
- package/dist/cache/backfill-embeddings.d.ts.map +1 -0
- package/dist/cache/backfill-embeddings.js +105 -0
- package/dist/cache/backfill-embeddings.js.map +1 -0
- package/dist/cache/change-detector.d.ts +7 -0
- package/dist/cache/change-detector.d.ts.map +1 -0
- package/dist/cache/change-detector.js +43 -0
- package/dist/cache/change-detector.js.map +1 -0
- package/dist/cache/db.d.ts +1 -0
- package/dist/cache/db.d.ts.map +1 -1
- package/dist/cache/db.js +94 -22
- package/dist/cache/db.js.map +1 -1
- package/dist/cache/diff-summary.d.ts +2 -0
- package/dist/cache/diff-summary.d.ts.map +1 -0
- package/dist/cache/diff-summary.js +82 -0
- package/dist/cache/diff-summary.js.map +1 -0
- package/dist/cache/migrations/runner.d.ts +29 -0
- package/dist/cache/migrations/runner.d.ts.map +1 -0
- package/dist/cache/migrations/runner.js +147 -0
- package/dist/cache/migrations/runner.js.map +1 -0
- package/dist/cache/sqlite-vec-store.d.ts +42 -0
- package/dist/cache/sqlite-vec-store.d.ts.map +1 -0
- package/dist/cache/sqlite-vec-store.js +176 -0
- package/dist/cache/sqlite-vec-store.js.map +1 -0
- package/dist/cache/store.d.ts +47 -1
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +364 -168
- package/dist/cache/store.js.map +1 -1
- package/dist/cli/agents/antigravity.d.ts +20 -0
- package/dist/cli/agents/antigravity.d.ts.map +1 -0
- package/dist/cli/agents/antigravity.js +49 -0
- package/dist/cli/agents/antigravity.js.map +1 -0
- package/dist/cli/agents/claude-code.d.ts +25 -0
- package/dist/cli/agents/claude-code.d.ts.map +1 -0
- package/dist/cli/agents/claude-code.js +111 -0
- package/dist/cli/agents/claude-code.js.map +1 -0
- package/dist/cli/agents/cursor.d.ts +21 -0
- package/dist/cli/agents/cursor.d.ts.map +1 -0
- package/dist/cli/agents/cursor.js +58 -0
- package/dist/cli/agents/cursor.js.map +1 -0
- package/dist/cli/agents/gemini-cli.d.ts +21 -0
- package/dist/cli/agents/gemini-cli.d.ts.map +1 -0
- package/dist/cli/agents/gemini-cli.js +55 -0
- package/dist/cli/agents/gemini-cli.js.map +1 -0
- package/dist/cli/agents/registry.d.ts +21 -0
- package/dist/cli/agents/registry.d.ts.map +1 -0
- package/dist/cli/agents/registry.js +27 -0
- package/dist/cli/agents/registry.js.map +1 -0
- package/dist/cli/agents/utils.d.ts +26 -0
- package/dist/cli/agents/utils.d.ts.map +1 -0
- package/dist/cli/agents/utils.js +136 -0
- package/dist/cli/agents/utils.js.map +1 -0
- package/dist/cli/agents/vscode.d.ts +21 -0
- package/dist/cli/agents/vscode.d.ts.map +1 -0
- package/dist/cli/agents/vscode.js +62 -0
- package/dist/cli/agents/vscode.js.map +1 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +94 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/backfill.d.ts +2 -0
- package/dist/cli/backfill.d.ts.map +1 -0
- package/dist/cli/backfill.js +58 -0
- package/dist/cli/backfill.js.map +1 -0
- package/dist/cli/daemon.d.ts +6 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +61 -3
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +344 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/health.d.ts +1 -1
- package/dist/cli/health.d.ts.map +1 -1
- package/dist/cli/health.js +42 -3
- package/dist/cli/health.js.map +1 -1
- package/dist/cli/help.d.ts +6 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +63 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +35 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +201 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/plugin.d.ts +5 -0
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +185 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/cli/setup-mcp.d.ts +2 -0
- package/dist/cli/setup-mcp.d.ts.map +1 -0
- package/dist/cli/setup-mcp.js +114 -0
- package/dist/cli/setup-mcp.js.map +1 -0
- package/dist/cli/shell.d.ts +2 -0
- package/dist/cli/shell.d.ts.map +1 -0
- package/dist/cli/shell.js +86 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/shutdown.d.ts +2 -0
- package/dist/cli/shutdown.d.ts.map +1 -0
- package/dist/cli/shutdown.js +26 -0
- package/dist/cli/shutdown.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +31 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/telemetry.d.ts +10 -0
- package/dist/cli/telemetry.d.ts.map +1 -0
- package/dist/cli/telemetry.js +56 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/tui/agents-types.d.ts +28 -0
- package/dist/cli/tui/agents-types.d.ts.map +1 -0
- package/dist/cli/tui/agents-types.js +1 -0
- package/dist/cli/tui/agents-types.js.map +1 -0
- package/dist/cli/tui/agents.d.ts +11 -0
- package/dist/cli/tui/agents.d.ts.map +1 -0
- package/dist/cli/tui/agents.js +93 -0
- package/dist/cli/tui/agents.js.map +1 -0
- package/dist/cli/tui/banner.d.ts +3 -0
- package/dist/cli/tui/banner.d.ts.map +1 -0
- package/dist/cli/tui/banner.js +30 -0
- package/dist/cli/tui/banner.js.map +1 -0
- package/dist/cli/tui/components/AgentSelect.d.ts +13 -0
- package/dist/cli/tui/components/AgentSelect.d.ts.map +1 -0
- package/dist/cli/tui/components/AgentSelect.js +116 -0
- package/dist/cli/tui/components/AgentSelect.js.map +1 -0
- package/dist/cli/tui/components/Banner.d.ts +6 -0
- package/dist/cli/tui/components/Banner.d.ts.map +1 -0
- package/dist/cli/tui/components/Banner.js +25 -0
- package/dist/cli/tui/components/Banner.js.map +1 -0
- package/dist/cli/tui/components/BrowserSelect.d.ts +7 -0
- package/dist/cli/tui/components/BrowserSelect.d.ts.map +1 -0
- package/dist/cli/tui/components/BrowserSelect.js +19 -0
- package/dist/cli/tui/components/BrowserSelect.js.map +1 -0
- package/dist/cli/tui/components/InstallProgress.d.ts +9 -0
- package/dist/cli/tui/components/InstallProgress.d.ts.map +1 -0
- package/dist/cli/tui/components/InstallProgress.js +67 -0
- package/dist/cli/tui/components/InstallProgress.js.map +1 -0
- package/dist/cli/tui/components/SkillInstall.d.ts +14 -0
- package/dist/cli/tui/components/SkillInstall.d.ts.map +1 -0
- package/dist/cli/tui/components/SkillInstall.js +94 -0
- package/dist/cli/tui/components/SkillInstall.js.map +1 -0
- package/dist/cli/tui/components/Summary.d.ts +22 -0
- package/dist/cli/tui/components/Summary.d.ts.map +1 -0
- package/dist/cli/tui/components/Summary.js +135 -0
- package/dist/cli/tui/components/Summary.js.map +1 -0
- package/dist/cli/tui/components/SystemCheck.d.ts +8 -0
- package/dist/cli/tui/components/SystemCheck.d.ts.map +1 -0
- package/dist/cli/tui/components/SystemCheck.js +71 -0
- package/dist/cli/tui/components/SystemCheck.js.map +1 -0
- package/dist/cli/tui/components/Verification.d.ts +8 -0
- package/dist/cli/tui/components/Verification.d.ts.map +1 -0
- package/dist/cli/tui/components/Verification.js +63 -0
- package/dist/cli/tui/components/Verification.js.map +1 -0
- package/dist/cli/tui/config-writer-cli.d.ts +12 -0
- package/dist/cli/tui/config-writer-cli.d.ts.map +1 -0
- package/dist/cli/tui/config-writer-cli.js +39 -0
- package/dist/cli/tui/config-writer-cli.js.map +1 -0
- package/dist/cli/tui/config-writer-json.d.ts +16 -0
- package/dist/cli/tui/config-writer-json.d.ts.map +1 -0
- package/dist/cli/tui/config-writer-json.js +86 -0
- package/dist/cli/tui/config-writer-json.js.map +1 -0
- package/dist/cli/tui/config-writer-toml.d.ts +16 -0
- package/dist/cli/tui/config-writer-toml.d.ts.map +1 -0
- package/dist/cli/tui/config-writer-toml.js +83 -0
- package/dist/cli/tui/config-writer-toml.js.map +1 -0
- package/dist/cli/tui/config-writer.d.ts +25 -0
- package/dist/cli/tui/config-writer.d.ts.map +1 -0
- package/dist/cli/tui/config-writer.js +101 -0
- package/dist/cli/tui/config-writer.js.map +1 -0
- package/dist/cli/tui/detect-helpers.d.ts +6 -0
- package/dist/cli/tui/detect-helpers.d.ts.map +1 -0
- package/dist/cli/tui/detect-helpers.js +45 -0
- package/dist/cli/tui/detect-helpers.js.map +1 -0
- package/dist/cli/tui/extras-prompt.d.ts +7 -0
- package/dist/cli/tui/extras-prompt.d.ts.map +1 -0
- package/dist/cli/tui/extras-prompt.js +42 -0
- package/dist/cli/tui/extras-prompt.js.map +1 -0
- package/dist/cli/tui/flags-types.d.ts +19 -0
- package/dist/cli/tui/flags-types.d.ts.map +1 -0
- package/dist/cli/tui/flags-types.js +23 -0
- package/dist/cli/tui/flags-types.js.map +1 -0
- package/dist/cli/tui/flags.d.ts +5 -0
- package/dist/cli/tui/flags.d.ts.map +1 -0
- package/dist/cli/tui/flags.js +132 -0
- package/dist/cli/tui/flags.js.map +1 -0
- package/dist/cli/tui/format.d.ts +14 -0
- package/dist/cli/tui/format.d.ts.map +1 -0
- package/dist/cli/tui/format.js +37 -0
- package/dist/cli/tui/format.js.map +1 -0
- package/dist/cli/tui/hooks/useAgentDetect.d.ts +6 -0
- package/dist/cli/tui/hooks/useAgentDetect.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useAgentDetect.js +19 -0
- package/dist/cli/tui/hooks/useAgentDetect.js.map +1 -0
- package/dist/cli/tui/hooks/useInstall.d.ts +14 -0
- package/dist/cli/tui/hooks/useInstall.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useInstall.js +90 -0
- package/dist/cli/tui/hooks/useInstall.js.map +1 -0
- package/dist/cli/tui/hooks/useSystemCheck.d.ts +13 -0
- package/dist/cli/tui/hooks/useSystemCheck.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useSystemCheck.js +95 -0
- package/dist/cli/tui/hooks/useSystemCheck.js.map +1 -0
- package/dist/cli/tui/hooks/useVerify.d.ts +14 -0
- package/dist/cli/tui/hooks/useVerify.d.ts.map +1 -0
- package/dist/cli/tui/hooks/useVerify.js +71 -0
- package/dist/cli/tui/hooks/useVerify.js.map +1 -0
- package/dist/cli/tui/ink-init.d.ts +2 -0
- package/dist/cli/tui/ink-init.d.ts.map +1 -0
- package/dist/cli/tui/ink-init.js +198 -0
- package/dist/cli/tui/ink-init.js.map +1 -0
- package/dist/cli/tui/reporter-auto.d.ts +7 -0
- package/dist/cli/tui/reporter-auto.d.ts.map +1 -0
- package/dist/cli/tui/reporter-auto.js +15 -0
- package/dist/cli/tui/reporter-auto.js.map +1 -0
- package/dist/cli/tui/reporter.d.ts +26 -0
- package/dist/cli/tui/reporter.d.ts.map +1 -0
- package/dist/cli/tui/reporter.js +32 -0
- package/dist/cli/tui/reporter.js.map +1 -0
- package/dist/cli/tui/run-command.d.ts +14 -0
- package/dist/cli/tui/run-command.d.ts.map +1 -0
- package/dist/cli/tui/run-command.js +72 -0
- package/dist/cli/tui/run-command.js.map +1 -0
- package/dist/cli/tui/select-agents.d.ts +6 -0
- package/dist/cli/tui/select-agents.d.ts.map +1 -0
- package/dist/cli/tui/select-agents.js +32 -0
- package/dist/cli/tui/select-agents.js.map +1 -0
- package/dist/cli/tui/status-agents.d.ts +11 -0
- package/dist/cli/tui/status-agents.d.ts.map +1 -0
- package/dist/cli/tui/status-agents.js +53 -0
- package/dist/cli/tui/status-agents.js.map +1 -0
- package/dist/cli/tui/status-cache.d.ts +6 -0
- package/dist/cli/tui/status-cache.d.ts.map +1 -0
- package/dist/cli/tui/status-cache.js +39 -0
- package/dist/cli/tui/status-cache.js.map +1 -0
- package/dist/cli/tui/status-format.d.ts +14 -0
- package/dist/cli/tui/status-format.d.ts.map +1 -0
- package/dist/cli/tui/status-format.js +41 -0
- package/dist/cli/tui/status-format.js.map +1 -0
- package/dist/cli/tui/status-python.d.ts +6 -0
- package/dist/cli/tui/status-python.d.ts.map +1 -0
- package/dist/cli/tui/status-python.js +30 -0
- package/dist/cli/tui/status-python.js.map +1 -0
- package/dist/cli/tui/system-check.d.ts +24 -0
- package/dist/cli/tui/system-check.d.ts.map +1 -0
- package/dist/cli/tui/system-check.js +103 -0
- package/dist/cli/tui/system-check.js.map +1 -0
- package/dist/cli/tui/tui-reporter.d.ts +19 -0
- package/dist/cli/tui/tui-reporter.d.ts.map +1 -0
- package/dist/cli/tui/tui-reporter.js +95 -0
- package/dist/cli/tui/tui-reporter.js.map +1 -0
- package/dist/cli/tui/utils/config-writer.d.ts +3 -0
- package/dist/cli/tui/utils/config-writer.d.ts.map +1 -0
- package/dist/cli/tui/utils/config-writer.js +22 -0
- package/dist/cli/tui/utils/config-writer.js.map +1 -0
- package/dist/cli/tui/utils/suppress-logs.d.ts +3 -0
- package/dist/cli/tui/utils/suppress-logs.d.ts.map +1 -0
- package/dist/cli/tui/utils/suppress-logs.js +11 -0
- package/dist/cli/tui/utils/suppress-logs.js.map +1 -0
- package/dist/cli/tui/verify-suggestions.d.ts +5 -0
- package/dist/cli/tui/verify-suggestions.d.ts.map +1 -0
- package/dist/cli/tui/verify-suggestions.js +20 -0
- package/dist/cli/tui/verify-suggestions.js.map +1 -0
- package/dist/cli/tui/verify.d.ts +14 -0
- package/dist/cli/tui/verify.d.ts.map +1 -0
- package/dist/cli/tui/verify.js +101 -0
- package/dist/cli/tui/verify.js.map +1 -0
- package/dist/cli/tui/version.d.ts +2 -0
- package/dist/cli/tui/version.d.ts.map +1 -0
- package/dist/cli/tui/version.js +14 -0
- package/dist/cli/tui/version.js.map +1 -0
- package/dist/cli/uninstall.d.ts +2 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +57 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/warmup.d.ts +10 -2
- package/dist/cli/warmup.d.ts.map +1 -1
- package/dist/cli/warmup.js +226 -93
- package/dist/cli/warmup.js.map +1 -1
- package/dist/config.d.ts +28 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +106 -56
- package/dist/config.js.map +1 -1
- package/dist/crawl/crawler.d.ts +6 -0
- package/dist/crawl/crawler.d.ts.map +1 -1
- package/dist/crawl/crawler.js +210 -209
- package/dist/crawl/crawler.js.map +1 -1
- package/dist/crawl/dedup.d.ts +1 -0
- package/dist/crawl/dedup.d.ts.map +1 -1
- package/dist/crawl/dedup.js +124 -81
- package/dist/crawl/dedup.js.map +1 -1
- package/dist/crawl/etag-incremental.d.ts +43 -0
- package/dist/crawl/etag-incremental.d.ts.map +1 -0
- package/dist/crawl/etag-incremental.js +94 -0
- package/dist/crawl/etag-incremental.js.map +1 -0
- package/dist/crawl/index-to-vec.d.ts +10 -0
- package/dist/crawl/index-to-vec.d.ts.map +1 -0
- package/dist/crawl/index-to-vec.js +44 -0
- package/dist/crawl/index-to-vec.js.map +1 -0
- package/dist/crawl/mapper.js +136 -164
- package/dist/crawl/mapper.js.map +1 -1
- package/dist/crawl/rate-limiter.js +63 -66
- package/dist/crawl/rate-limiter.js.map +1 -1
- package/dist/crawl/robots.js +58 -57
- package/dist/crawl/robots.js.map +1 -1
- package/dist/crawl/sitemap-first.d.ts +12 -0
- package/dist/crawl/sitemap-first.d.ts.map +1 -0
- package/dist/crawl/sitemap-first.js +47 -0
- package/dist/crawl/sitemap-first.js.map +1 -0
- package/dist/crawl/sitemap.js +33 -32
- package/dist/crawl/sitemap.js.map +1 -1
- package/dist/crawl/url-utils.d.ts +1 -0
- package/dist/crawl/url-utils.d.ts.map +1 -1
- package/dist/crawl/url-utils.js +49 -37
- package/dist/crawl/url-utils.js.map +1 -1
- package/dist/daemon/health-check.d.ts +16 -0
- package/dist/daemon/health-check.d.ts.map +1 -0
- package/dist/daemon/health-check.js +33 -0
- package/dist/daemon/health-check.js.map +1 -0
- package/dist/daemon/http-server.d.ts +26 -0
- package/dist/daemon/http-server.d.ts.map +1 -0
- package/dist/daemon/http-server.js +275 -0
- package/dist/daemon/http-server.js.map +1 -0
- package/dist/daemon/proxy.d.ts +10 -0
- package/dist/daemon/proxy.d.ts.map +1 -0
- package/dist/daemon/proxy.js +93 -0
- package/dist/daemon/proxy.js.map +1 -0
- package/dist/embedding/embed.d.ts +59 -0
- package/dist/embedding/embed.d.ts.map +1 -0
- package/dist/embedding/embed.js +233 -0
- package/dist/embedding/embed.js.map +1 -0
- package/dist/embedding/fastembed-provider.d.ts +19 -0
- package/dist/embedding/fastembed-provider.d.ts.map +1 -0
- package/dist/embedding/fastembed-provider.js +51 -0
- package/dist/embedding/fastembed-provider.js.map +1 -0
- package/dist/embedding/key-terms.d.ts +12 -0
- package/dist/embedding/key-terms.d.ts.map +1 -0
- package/dist/embedding/key-terms.js +234 -0
- package/dist/embedding/key-terms.js.map +1 -0
- package/dist/extraction/boilerplate.d.ts +15 -0
- package/dist/extraction/boilerplate.d.ts.map +1 -0
- package/dist/extraction/boilerplate.js +52 -0
- package/dist/extraction/boilerplate.js.map +1 -0
- package/dist/extraction/defuddle.d.ts.map +1 -1
- package/dist/extraction/defuddle.js +27 -23
- package/dist/extraction/defuddle.js.map +1 -1
- package/dist/extraction/extract.d.ts.map +1 -1
- package/dist/extraction/extract.js +76 -76
- package/dist/extraction/extract.js.map +1 -1
- package/dist/extraction/jsonld.js +50 -54
- package/dist/extraction/jsonld.js.map +1 -1
- package/dist/extraction/lang-hints.d.ts +2 -0
- package/dist/extraction/lang-hints.d.ts.map +1 -0
- package/dist/extraction/lang-hints.js +30 -0
- package/dist/extraction/lang-hints.js.map +1 -0
- package/dist/extraction/llm-fallback.d.ts +17 -0
- package/dist/extraction/llm-fallback.d.ts.map +1 -0
- package/dist/extraction/llm-fallback.js +130 -0
- package/dist/extraction/llm-fallback.js.map +1 -0
- package/dist/extraction/markdown-sanitize.d.ts +2 -0
- package/dist/extraction/markdown-sanitize.d.ts.map +1 -0
- package/dist/extraction/markdown-sanitize.js +151 -0
- package/dist/extraction/markdown-sanitize.js.map +1 -0
- package/dist/extraction/markdown.d.ts +11 -0
- package/dist/extraction/markdown.d.ts.map +1 -1
- package/dist/extraction/markdown.js +195 -91
- package/dist/extraction/markdown.js.map +1 -1
- package/dist/extraction/pipeline.d.ts +8 -0
- package/dist/extraction/pipeline.d.ts.map +1 -1
- package/dist/extraction/pipeline.js +57 -91
- package/dist/extraction/pipeline.js.map +1 -1
- package/dist/extraction/readability.d.ts +1 -1
- package/dist/extraction/readability.d.ts.map +1 -1
- package/dist/extraction/readability.js +28 -29
- package/dist/extraction/readability.js.map +1 -1
- package/dist/extraction/schema.d.ts +12 -0
- package/dist/extraction/schema.d.ts.map +1 -1
- package/dist/extraction/schema.js +135 -72
- package/dist/extraction/schema.js.map +1 -1
- package/dist/extraction/site-extractors/docs-generic.d.ts.map +1 -1
- package/dist/extraction/site-extractors/docs-generic.js +81 -91
- package/dist/extraction/site-extractors/docs-generic.js.map +1 -1
- package/dist/extraction/site-extractors/github.d.ts.map +1 -1
- package/dist/extraction/site-extractors/github.js +87 -95
- package/dist/extraction/site-extractors/github.js.map +1 -1
- package/dist/extraction/site-extractors/mdn.d.ts.map +1 -1
- package/dist/extraction/site-extractors/mdn.js +46 -54
- package/dist/extraction/site-extractors/mdn.js.map +1 -1
- package/dist/extraction/site-extractors/stackoverflow.d.ts.map +1 -1
- package/dist/extraction/site-extractors/stackoverflow.js +71 -80
- package/dist/extraction/site-extractors/stackoverflow.js.map +1 -1
- package/dist/extraction/structured-data.d.ts +4 -0
- package/dist/extraction/structured-data.d.ts.map +1 -0
- package/dist/extraction/structured-data.js +173 -0
- package/dist/extraction/structured-data.js.map +1 -0
- package/dist/extraction/structured.d.ts +4 -0
- package/dist/extraction/structured.d.ts.map +1 -0
- package/dist/extraction/structured.js +163 -0
- package/dist/extraction/structured.js.map +1 -0
- package/dist/extraction/v1/classifier.d.ts +3 -0
- package/dist/extraction/v1/classifier.d.ts.map +1 -0
- package/dist/extraction/v1/classifier.js +110 -0
- package/dist/extraction/v1/classifier.js.map +1 -0
- package/dist/extraction/v1/extract-provider.d.ts +16 -0
- package/dist/extraction/v1/extract-provider.d.ts.map +1 -0
- package/dist/extraction/v1/extract-provider.js +43 -0
- package/dist/extraction/v1/extract-provider.js.map +1 -0
- package/dist/extraction/v1/local-llm.d.ts +8 -0
- package/dist/extraction/v1/local-llm.d.ts.map +1 -0
- package/dist/extraction/v1/local-llm.js +34 -0
- package/dist/extraction/v1/local-llm.js.map +1 -0
- package/dist/extraction/v1/news.d.ts +3 -0
- package/dist/extraction/v1/news.d.ts.map +1 -0
- package/dist/extraction/v1/news.js +61 -0
- package/dist/extraction/v1/news.js.map +1 -0
- package/dist/extraction/v1/product.d.ts +3 -0
- package/dist/extraction/v1/product.d.ts.map +1 -0
- package/dist/extraction/v1/product.js +166 -0
- package/dist/extraction/v1/product.js.map +1 -0
- package/dist/extraction/v1/recipe.d.ts +3 -0
- package/dist/extraction/v1/recipe.d.ts.map +1 -0
- package/dist/extraction/v1/recipe.js +136 -0
- package/dist/extraction/v1/recipe.js.map +1 -0
- package/dist/extraction/v1/routed.d.ts +17 -0
- package/dist/extraction/v1/routed.d.ts.map +1 -0
- package/dist/extraction/v1/routed.js +68 -0
- package/dist/extraction/v1/routed.js.map +1 -0
- package/dist/extraction/v1/schemas/Article.d.ts +11 -0
- package/dist/extraction/v1/schemas/Article.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/Article.js +23 -0
- package/dist/extraction/v1/schemas/Article.js.map +1 -0
- package/dist/extraction/v1/schemas/CodeSnippet.d.ts +9 -0
- package/dist/extraction/v1/schemas/CodeSnippet.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/CodeSnippet.js +90 -0
- package/dist/extraction/v1/schemas/CodeSnippet.js.map +1 -0
- package/dist/extraction/v1/schemas/EventListing.d.ts +10 -0
- package/dist/extraction/v1/schemas/EventListing.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/EventListing.js +122 -0
- package/dist/extraction/v1/schemas/EventListing.js.map +1 -0
- package/dist/extraction/v1/schemas/Paper.d.ts +10 -0
- package/dist/extraction/v1/schemas/Paper.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/Paper.js +156 -0
- package/dist/extraction/v1/schemas/Paper.js.map +1 -0
- package/dist/extraction/v1/schemas/Product.d.ts +17 -0
- package/dist/extraction/v1/schemas/Product.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/Product.js +149 -0
- package/dist/extraction/v1/schemas/Product.js.map +1 -0
- package/dist/extraction/v1/schemas/Recipe.d.ts +14 -0
- package/dist/extraction/v1/schemas/Recipe.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/Recipe.js +160 -0
- package/dist/extraction/v1/schemas/Recipe.js.map +1 -0
- package/dist/extraction/v1/schemas/index.d.ts +13 -0
- package/dist/extraction/v1/schemas/index.d.ts.map +1 -0
- package/dist/extraction/v1/schemas/index.js +44 -0
- package/dist/extraction/v1/schemas/index.js.map +1 -0
- package/dist/extraction/v1/site-extractors.d.ts +5 -0
- package/dist/extraction/v1/site-extractors.d.ts.map +1 -0
- package/dist/extraction/v1/site-extractors.js +31 -0
- package/dist/extraction/v1/site-extractors.js.map +1 -0
- package/dist/fetch/action-executor.d.ts +28 -0
- package/dist/fetch/action-executor.d.ts.map +1 -0
- package/dist/fetch/action-executor.js +88 -0
- package/dist/fetch/action-executor.js.map +1 -0
- package/dist/fetch/auth.d.ts +2 -1
- package/dist/fetch/auth.d.ts.map +1 -1
- package/dist/fetch/auth.js +56 -26
- package/dist/fetch/auth.js.map +1 -1
- package/dist/fetch/browser-pool.d.ts +30 -11
- package/dist/fetch/browser-pool.d.ts.map +1 -1
- package/dist/fetch/browser-pool.js +303 -127
- package/dist/fetch/browser-pool.js.map +1 -1
- package/dist/fetch/browser-selector.d.ts +17 -0
- package/dist/fetch/browser-selector.d.ts.map +1 -0
- package/dist/fetch/browser-selector.js +72 -0
- package/dist/fetch/browser-selector.js.map +1 -0
- package/dist/fetch/browser-types.d.ts +3 -0
- package/dist/fetch/browser-types.d.ts.map +1 -0
- package/dist/fetch/browser-types.js +45 -0
- package/dist/fetch/browser-types.js.map +1 -0
- package/dist/fetch/cdp-client.d.ts +9 -0
- package/dist/fetch/cdp-client.d.ts.map +1 -0
- package/dist/fetch/cdp-client.js +89 -0
- package/dist/fetch/cdp-client.js.map +1 -0
- package/dist/fetch/content-check.js +39 -46
- package/dist/fetch/content-check.js.map +1 -1
- package/dist/fetch/error-describe.d.ts +7 -0
- package/dist/fetch/error-describe.d.ts.map +1 -0
- package/dist/fetch/error-describe.js +37 -0
- package/dist/fetch/error-describe.js.map +1 -0
- package/dist/fetch/http-client.d.ts +4 -0
- package/dist/fetch/http-client.d.ts.map +1 -1
- package/dist/fetch/http-client.js +147 -128
- package/dist/fetch/http-client.js.map +1 -1
- package/dist/fetch/lightpanda.d.ts +28 -0
- package/dist/fetch/lightpanda.d.ts.map +1 -0
- package/dist/fetch/lightpanda.js +174 -0
- package/dist/fetch/lightpanda.js.map +1 -0
- package/dist/fetch/playwright-tier.d.ts +19 -0
- package/dist/fetch/playwright-tier.d.ts.map +1 -0
- package/dist/fetch/playwright-tier.js +76 -0
- package/dist/fetch/playwright-tier.js.map +1 -0
- package/dist/fetch/router.d.ts +49 -3
- package/dist/fetch/router.d.ts.map +1 -1
- package/dist/fetch/router.js +187 -81
- package/dist/fetch/router.js.map +1 -1
- package/dist/index.js +102 -17
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +31 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +245 -0
- package/dist/instructions.js.map +1 -0
- package/dist/integrations/cloud/llm/anthropic.d.ts +3 -0
- package/dist/integrations/cloud/llm/anthropic.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/anthropic.js +41 -0
- package/dist/integrations/cloud/llm/anthropic.js.map +1 -0
- package/dist/integrations/cloud/llm/cache.d.ts +5 -0
- package/dist/integrations/cloud/llm/cache.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/cache.js +49 -0
- package/dist/integrations/cloud/llm/cache.js.map +1 -0
- package/dist/integrations/cloud/llm/gemini.d.ts +3 -0
- package/dist/integrations/cloud/llm/gemini.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/gemini.js +37 -0
- package/dist/integrations/cloud/llm/gemini.js.map +1 -0
- package/dist/integrations/cloud/llm/groq.d.ts +3 -0
- package/dist/integrations/cloud/llm/groq.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/groq.js +74 -0
- package/dist/integrations/cloud/llm/groq.js.map +1 -0
- package/dist/integrations/cloud/llm/hash.d.ts +3 -0
- package/dist/integrations/cloud/llm/hash.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/hash.js +26 -0
- package/dist/integrations/cloud/llm/hash.js.map +1 -0
- package/dist/integrations/cloud/llm/model-select.d.ts +5 -0
- package/dist/integrations/cloud/llm/model-select.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/model-select.js +32 -0
- package/dist/integrations/cloud/llm/model-select.js.map +1 -0
- package/dist/integrations/cloud/llm/openai.d.ts +3 -0
- package/dist/integrations/cloud/llm/openai.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/openai.js +43 -0
- package/dist/integrations/cloud/llm/openai.js.map +1 -0
- package/dist/integrations/cloud/llm/run.d.ts +27 -0
- package/dist/integrations/cloud/llm/run.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/run.js +99 -0
- package/dist/integrations/cloud/llm/run.js.map +1 -0
- package/dist/integrations/cloud/llm/select.d.ts +5 -0
- package/dist/integrations/cloud/llm/select.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/select.js +30 -0
- package/dist/integrations/cloud/llm/select.js.map +1 -0
- package/dist/integrations/cloud/llm/text-adapters.d.ts +19 -0
- package/dist/integrations/cloud/llm/text-adapters.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/text-adapters.js +103 -0
- package/dist/integrations/cloud/llm/text-adapters.js.map +1 -0
- package/dist/integrations/cloud/llm/types.d.ts +24 -0
- package/dist/integrations/cloud/llm/types.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/types.js +1 -0
- package/dist/integrations/cloud/llm/types.js.map +1 -0
- package/dist/integrations/cloud/llm/validate.d.ts +6 -0
- package/dist/integrations/cloud/llm/validate.d.ts.map +1 -0
- package/dist/integrations/cloud/llm/validate.js +63 -0
- package/dist/integrations/cloud/llm/validate.js.map +1 -0
- package/dist/logger.d.ts +4 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +71 -30
- package/dist/logger.js.map +1 -1
- package/dist/pdf-parse.d.js +1 -0
- package/dist/pdf-parse.d.js.map +1 -0
- package/dist/plugins/loader.d.ts +20 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +157 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/registry.d.ts +26 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +71 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/validate.d.ts +9 -0
- package/dist/plugins/validate.d.ts.map +1 -0
- package/dist/plugins/validate.js +79 -0
- package/dist/plugins/validate.js.map +1 -0
- package/dist/providers/embed-provider.d.ts +11 -0
- package/dist/providers/embed-provider.d.ts.map +1 -0
- package/dist/providers/embed-provider.js +24 -0
- package/dist/providers/embed-provider.js.map +1 -0
- package/dist/providers/extract-provider.d.ts +23 -0
- package/dist/providers/extract-provider.d.ts.map +1 -0
- package/dist/providers/extract-provider.js +25 -0
- package/dist/providers/extract-provider.js.map +1 -0
- package/dist/providers/rerank-provider.d.ts +17 -0
- package/dist/providers/rerank-provider.d.ts.map +1 -0
- package/dist/providers/rerank-provider.js +41 -0
- package/dist/providers/rerank-provider.js.map +1 -0
- package/dist/providers/search-provider.d.ts +25 -0
- package/dist/providers/search-provider.d.ts.map +1 -0
- package/dist/providers/search-provider.js +44 -0
- package/dist/providers/search-provider.js.map +1 -0
- package/dist/providers/vector-store.d.ts +27 -0
- package/dist/providers/vector-store.d.ts.map +1 -0
- package/dist/providers/vector-store.js +27 -0
- package/dist/providers/vector-store.js.map +1 -0
- package/dist/python-env.d.ts +9 -0
- package/dist/python-env.d.ts.map +1 -0
- package/dist/python-env.js +13 -0
- package/dist/python-env.js.map +1 -0
- package/dist/repl/commands/agent.d.ts +5 -0
- package/dist/repl/commands/agent.d.ts.map +1 -0
- package/dist/repl/commands/agent.js +62 -0
- package/dist/repl/commands/agent.js.map +1 -0
- package/dist/repl/commands/cache.d.ts +4 -0
- package/dist/repl/commands/cache.d.ts.map +1 -0
- package/dist/repl/commands/cache.js +43 -0
- package/dist/repl/commands/cache.js.map +1 -0
- package/dist/repl/commands/crawl.d.ts +7 -0
- package/dist/repl/commands/crawl.d.ts.map +1 -0
- package/dist/repl/commands/crawl.js +44 -0
- package/dist/repl/commands/crawl.js.map +1 -0
- package/dist/repl/commands/extract.d.ts +5 -0
- package/dist/repl/commands/extract.d.ts.map +1 -0
- package/dist/repl/commands/extract.js +47 -0
- package/dist/repl/commands/extract.js.map +1 -0
- package/dist/repl/commands/fetch.d.ts +5 -0
- package/dist/repl/commands/fetch.d.ts.map +1 -0
- package/dist/repl/commands/fetch.js +67 -0
- package/dist/repl/commands/fetch.js.map +1 -0
- package/dist/repl/commands/find-similar.d.ts +5 -0
- package/dist/repl/commands/find-similar.d.ts.map +1 -0
- package/dist/repl/commands/find-similar.js +74 -0
- package/dist/repl/commands/find-similar.js.map +1 -0
- package/dist/repl/commands/research.d.ts +5 -0
- package/dist/repl/commands/research.d.ts.map +1 -0
- package/dist/repl/commands/research.js +65 -0
- package/dist/repl/commands/research.js.map +1 -0
- package/dist/repl/commands/search.d.ts +5 -0
- package/dist/repl/commands/search.d.ts.map +1 -0
- package/dist/repl/commands/search.js +74 -0
- package/dist/repl/commands/search.js.map +1 -0
- package/dist/repl/commands/types.d.ts +9 -0
- package/dist/repl/commands/types.d.ts.map +1 -0
- package/dist/repl/commands/types.js +1 -0
- package/dist/repl/commands/types.js.map +1 -0
- package/dist/repl/formatters.d.ts +13 -0
- package/dist/repl/formatters.d.ts.map +1 -0
- package/dist/repl/formatters.js +283 -0
- package/dist/repl/formatters.js.map +1 -0
- package/dist/repl/parser.d.ts +9 -0
- package/dist/repl/parser.d.ts.map +1 -0
- package/dist/repl/parser.js +86 -0
- package/dist/repl/parser.js.map +1 -0
- package/dist/repl/shell.d.ts +8 -0
- package/dist/repl/shell.d.ts.map +1 -0
- package/dist/repl/shell.js +184 -0
- package/dist/repl/shell.js.map +1 -0
- package/dist/research/branch-exploration.d.ts +14 -0
- package/dist/research/branch-exploration.d.ts.map +1 -0
- package/dist/research/branch-exploration.js +100 -0
- package/dist/research/branch-exploration.js.map +1 -0
- package/dist/research/brief.d.ts +6 -0
- package/dist/research/brief.d.ts.map +1 -0
- package/dist/research/brief.js +246 -0
- package/dist/research/brief.js.map +1 -0
- package/dist/research/citation-graph.d.ts +9 -0
- package/dist/research/citation-graph.d.ts.map +1 -0
- package/dist/research/citation-graph.js +114 -0
- package/dist/research/citation-graph.js.map +1 -0
- package/dist/research/decompose.d.ts +14 -0
- package/dist/research/decompose.d.ts.map +1 -0
- package/dist/research/decompose.js +439 -0
- package/dist/research/decompose.js.map +1 -0
- package/dist/research/pipeline.d.ts +5 -0
- package/dist/research/pipeline.d.ts.map +1 -0
- package/dist/research/pipeline.js +269 -0
- package/dist/research/pipeline.js.map +1 -0
- package/dist/research/synthesis-local.d.ts +19 -0
- package/dist/research/synthesis-local.d.ts.map +1 -0
- package/dist/research/synthesis-local.js +62 -0
- package/dist/research/synthesis-local.js.map +1 -0
- package/dist/research/synthesize.d.ts +10 -0
- package/dist/research/synthesize.d.ts.map +1 -0
- package/dist/research/synthesize.js +137 -0
- package/dist/research/synthesize.js.map +1 -0
- package/dist/search/answer-synthesis.d.ts +33 -0
- package/dist/search/answer-synthesis.d.ts.map +1 -0
- package/dist/search/answer-synthesis.js +244 -0
- package/dist/search/answer-synthesis.js.map +1 -0
- package/dist/search/context-formatter.d.ts +3 -0
- package/dist/search/context-formatter.d.ts.map +1 -0
- package/dist/search/context-formatter.js +56 -0
- package/dist/search/context-formatter.js.map +1 -0
- package/dist/search/dedup.d.ts +1 -0
- package/dist/search/dedup.d.ts.map +1 -1
- package/dist/search/dedup.js +40 -32
- package/dist/search/dedup.js.map +1 -1
- package/dist/search/engines/arxiv.d.ts +7 -0
- package/dist/search/engines/arxiv.d.ts.map +1 -0
- package/dist/search/engines/arxiv.js +70 -0
- package/dist/search/engines/arxiv.js.map +1 -0
- package/dist/search/engines/bing-news.d.ts +7 -0
- package/dist/search/engines/bing-news.d.ts.map +1 -0
- package/dist/search/engines/bing-news.js +97 -0
- package/dist/search/engines/bing-news.js.map +1 -0
- package/dist/search/engines/bing.d.ts +1 -0
- package/dist/search/engines/bing.d.ts.map +1 -1
- package/dist/search/engines/bing.js +100 -44
- package/dist/search/engines/bing.js.map +1 -1
- package/dist/search/engines/devdocs.d.ts +6 -0
- package/dist/search/engines/devdocs.d.ts.map +1 -0
- package/dist/search/engines/devdocs.js +56 -0
- package/dist/search/engines/devdocs.js.map +1 -0
- package/dist/search/engines/duckduckgo.d.ts.map +1 -1
- package/dist/search/engines/duckduckgo.js +56 -44
- package/dist/search/engines/duckduckgo.js.map +1 -1
- package/dist/search/engines/github-code.d.ts +7 -0
- package/dist/search/engines/github-code.d.ts.map +1 -0
- package/dist/search/engines/github-code.js +55 -0
- package/dist/search/engines/github-code.js.map +1 -0
- package/dist/search/engines/hn-algolia.d.ts +7 -0
- package/dist/search/engines/hn-algolia.d.ts.map +1 -0
- package/dist/search/engines/hn-algolia.js +76 -0
- package/dist/search/engines/hn-algolia.js.map +1 -0
- package/dist/search/engines/lobsters.d.ts +7 -0
- package/dist/search/engines/lobsters.d.ts.map +1 -0
- package/dist/search/engines/lobsters.js +83 -0
- package/dist/search/engines/lobsters.js.map +1 -0
- package/dist/search/engines/mdn.d.ts +7 -0
- package/dist/search/engines/mdn.d.ts.map +1 -0
- package/dist/search/engines/mdn.js +48 -0
- package/dist/search/engines/mdn.js.map +1 -0
- package/dist/search/engines/semantic-scholar.d.ts +7 -0
- package/dist/search/engines/semantic-scholar.d.ts.map +1 -0
- package/dist/search/engines/semantic-scholar.js +69 -0
- package/dist/search/engines/semantic-scholar.js.map +1 -0
- package/dist/search/engines/stackoverflow.d.ts +7 -0
- package/dist/search/engines/stackoverflow.d.ts.map +1 -0
- package/dist/search/engines/stackoverflow.js +73 -0
- package/dist/search/engines/stackoverflow.js.map +1 -0
- package/dist/search/engines/startpage.d.ts.map +1 -1
- package/dist/search/engines/startpage.js +65 -46
- package/dist/search/engines/startpage.js.map +1 -1
- package/dist/search/evidence.d.ts +25 -0
- package/dist/search/evidence.d.ts.map +1 -0
- package/dist/search/evidence.js +220 -0
- package/dist/search/evidence.js.map +1 -0
- package/dist/search/filters.d.ts.map +1 -1
- package/dist/search/filters.js +58 -54
- package/dist/search/filters.js.map +1 -1
- package/dist/search/find-similar/crawl-rank.d.ts +9 -0
- package/dist/search/find-similar/crawl-rank.d.ts.map +1 -0
- package/dist/search/find-similar/crawl-rank.js +272 -0
- package/dist/search/find-similar/crawl-rank.js.map +1 -0
- package/dist/search/find-similar/mode.d.ts +4 -0
- package/dist/search/find-similar/mode.d.ts.map +1 -0
- package/dist/search/find-similar/mode.js +12 -0
- package/dist/search/find-similar/mode.js.map +1 -0
- package/dist/search/find-similar.d.ts +5 -0
- package/dist/search/find-similar.d.ts.map +1 -0
- package/dist/search/find-similar.js +509 -0
- package/dist/search/find-similar.js.map +1 -0
- package/dist/search/highlights.d.ts +19 -0
- package/dist/search/highlights.d.ts.map +1 -0
- package/dist/search/highlights.js +167 -0
- package/dist/search/highlights.js.map +1 -0
- package/dist/search/language-filter.d.ts +29 -0
- package/dist/search/language-filter.d.ts.map +1 -0
- package/dist/search/language-filter.js +126 -0
- package/dist/search/language-filter.js.map +1 -0
- package/dist/search/legacy/searxng-orchestrator.d.ts +4 -0
- package/dist/search/legacy/searxng-orchestrator.d.ts.map +1 -0
- package/dist/search/legacy/searxng-orchestrator.js +501 -0
- package/dist/search/legacy/searxng-orchestrator.js.map +1 -0
- package/dist/search/legacy/searxng-provider.d.ts +7 -0
- package/dist/search/legacy/searxng-provider.d.ts.map +1 -0
- package/dist/search/legacy/searxng-provider.js +11 -0
- package/dist/search/legacy/searxng-provider.js.map +1 -0
- package/dist/search/multi-query.d.ts +25 -0
- package/dist/search/multi-query.d.ts.map +1 -0
- package/dist/search/multi-query.js +228 -0
- package/dist/search/multi-query.js.map +1 -0
- package/dist/search/query.js +32 -34
- package/dist/search/query.js.map +1 -1
- package/dist/search/rerank.d.ts +3 -1
- package/dist/search/rerank.d.ts.map +1 -1
- package/dist/search/rerank.js +44 -35
- package/dist/search/rerank.js.map +1 -1
- package/dist/search/reranker/authority-boost.d.ts +3 -0
- package/dist/search/reranker/authority-boost.d.ts.map +1 -0
- package/dist/search/reranker/authority-boost.js +179 -0
- package/dist/search/reranker/authority-boost.js.map +1 -0
- package/dist/search/reranker/consensus-boost.d.ts +3 -0
- package/dist/search/reranker/consensus-boost.d.ts.map +1 -0
- package/dist/search/reranker/consensus-boost.js +27 -0
- package/dist/search/reranker/consensus-boost.js.map +1 -0
- package/dist/search/reranker/recency-boost.d.ts +3 -0
- package/dist/search/reranker/recency-boost.d.ts.map +1 -0
- package/dist/search/reranker/recency-boost.js +13 -0
- package/dist/search/reranker/recency-boost.js.map +1 -0
- package/dist/search/reranker/recency.d.ts +3 -0
- package/dist/search/reranker/recency.d.ts.map +1 -0
- package/dist/search/reranker/recency.js +23 -0
- package/dist/search/reranker/recency.js.map +1 -0
- package/dist/search/reranker/transformers-rerank-provider.d.ts +13 -0
- package/dist/search/reranker/transformers-rerank-provider.d.ts.map +1 -0
- package/dist/search/reranker/transformers-rerank-provider.js +94 -0
- package/dist/search/reranker/transformers-rerank-provider.js.map +1 -0
- package/dist/search/rrf.d.ts +17 -0
- package/dist/search/rrf.d.ts.map +1 -0
- package/dist/search/rrf.js +39 -0
- package/dist/search/rrf.js.map +1 -0
- package/dist/search/sampling.d.ts +25 -0
- package/dist/search/sampling.d.ts.map +1 -0
- package/dist/search/sampling.js +52 -0
- package/dist/search/sampling.js.map +1 -0
- package/dist/search/searxng.d.ts.map +1 -1
- package/dist/search/searxng.js +69 -79
- package/dist/search/searxng.js.map +1 -1
- package/dist/search/tokens.d.ts +3 -0
- package/dist/search/tokens.d.ts.map +1 -0
- package/dist/search/tokens.js +39 -0
- package/dist/search/tokens.js.map +1 -0
- package/dist/search/truncate.d.ts +6 -0
- package/dist/search/truncate.d.ts.map +1 -0
- package/dist/search/truncate.js +26 -0
- package/dist/search/truncate.js.map +1 -0
- package/dist/search/url-unwrap.d.ts +3 -0
- package/dist/search/url-unwrap.d.ts.map +1 -0
- package/dist/search/url-unwrap.js +43 -0
- package/dist/search/url-unwrap.js.map +1 -0
- package/dist/search/v1/context-rank.d.ts +13 -0
- package/dist/search/v1/context-rank.d.ts.map +1 -0
- package/dist/search/v1/context-rank.js +74 -0
- package/dist/search/v1/context-rank.js.map +1 -0
- package/dist/search/v1/engine-base.d.ts +27 -0
- package/dist/search/v1/engine-base.d.ts.map +1 -0
- package/dist/search/v1/engine-base.js +110 -0
- package/dist/search/v1/engine-base.js.map +1 -0
- package/dist/search/v1/intent-router.d.ts +22 -0
- package/dist/search/v1/intent-router.d.ts.map +1 -0
- package/dist/search/v1/intent-router.js +138 -0
- package/dist/search/v1/intent-router.js.map +1 -0
- package/dist/search/v1/orchestrator.d.ts +24 -0
- package/dist/search/v1/orchestrator.d.ts.map +1 -0
- package/dist/search/v1/orchestrator.js +163 -0
- package/dist/search/v1/orchestrator.js.map +1 -0
- package/dist/search/v1/recency-boost.d.ts +9 -0
- package/dist/search/v1/recency-boost.d.ts.map +1 -0
- package/dist/search/v1/recency-boost.js +37 -0
- package/dist/search/v1/recency-boost.js.map +1 -0
- package/dist/search/v1/recent-cache-dedup.d.ts +6 -0
- package/dist/search/v1/recent-cache-dedup.d.ts.map +1 -0
- package/dist/search/v1/recent-cache-dedup.js +85 -0
- package/dist/search/v1/recent-cache-dedup.js.map +1 -0
- package/dist/search/v1/rss/feed-config.d.ts +21 -0
- package/dist/search/v1/rss/feed-config.d.ts.map +1 -0
- package/dist/search/v1/rss/feed-config.js +90 -0
- package/dist/search/v1/rss/feed-config.js.map +1 -0
- package/dist/search/v1/rss/feed-parser.d.ts +14 -0
- package/dist/search/v1/rss/feed-parser.d.ts.map +1 -0
- package/dist/search/v1/rss/feed-parser.js +104 -0
- package/dist/search/v1/rss/feed-parser.js.map +1 -0
- package/dist/search/v1/rss/feed-poller.d.ts +22 -0
- package/dist/search/v1/rss/feed-poller.d.ts.map +1 -0
- package/dist/search/v1/rss/feed-poller.js +102 -0
- package/dist/search/v1/rss/feed-poller.js.map +1 -0
- package/dist/search/v1/rss/feed-store.d.ts +30 -0
- package/dist/search/v1/rss/feed-store.d.ts.map +1 -0
- package/dist/search/v1/rss/feed-store.js +134 -0
- package/dist/search/v1/rss/feed-store.js.map +1 -0
- package/dist/search/v1/rss/rss-engine.d.ts +6 -0
- package/dist/search/v1/rss/rss-engine.d.ts.map +1 -0
- package/dist/search/v1/rss/rss-engine.js +28 -0
- package/dist/search/v1/rss/rss-engine.js.map +1 -0
- package/dist/search/v1/v1-provider.d.ts +7 -0
- package/dist/search/v1/v1-provider.d.ts.map +1 -0
- package/dist/search/v1/v1-provider.js +68 -0
- package/dist/search/v1/v1-provider.js.map +1 -0
- package/dist/search/v1/verticals/code.d.ts +4 -0
- package/dist/search/v1/verticals/code.d.ts.map +1 -0
- package/dist/search/v1/verticals/code.js +20 -0
- package/dist/search/v1/verticals/code.js.map +1 -0
- package/dist/search/v1/verticals/docs.d.ts +4 -0
- package/dist/search/v1/verticals/docs.d.ts.map +1 -0
- package/dist/search/v1/verticals/docs.js +20 -0
- package/dist/search/v1/verticals/docs.js.map +1 -0
- package/dist/search/v1/verticals/general.d.ts +4 -0
- package/dist/search/v1/verticals/general.d.ts.map +1 -0
- package/dist/search/v1/verticals/general.js +22 -0
- package/dist/search/v1/verticals/general.js.map +1 -0
- package/dist/search/v1/verticals/news.d.ts +10 -0
- package/dist/search/v1/verticals/news.d.ts.map +1 -0
- package/dist/search/v1/verticals/news.js +52 -0
- package/dist/search/v1/verticals/news.js.map +1 -0
- package/dist/search/v1/verticals/papers.d.ts +4 -0
- package/dist/search/v1/verticals/papers.d.ts.map +1 -0
- package/dist/search/v1/verticals/papers.js +23 -0
- package/dist/search/v1/verticals/papers.js.map +1 -0
- package/dist/search/validator.js +31 -31
- package/dist/search/validator.js.map +1 -1
- package/dist/searxng/bootstrap.d.ts +30 -0
- package/dist/searxng/bootstrap.d.ts.map +1 -1
- package/dist/searxng/bootstrap.js +223 -85
- package/dist/searxng/bootstrap.js.map +1 -1
- package/dist/searxng/docker.d.ts.map +1 -1
- package/dist/searxng/docker.js +69 -60
- package/dist/searxng/docker.js.map +1 -1
- package/dist/searxng/process.d.ts +13 -1
- package/dist/searxng/process.d.ts.map +1 -1
- package/dist/searxng/process.js +231 -164
- package/dist/searxng/process.js.map +1 -1
- package/dist/server/backend-status.d.ts +13 -0
- package/dist/server/backend-status.d.ts.map +1 -0
- package/dist/server/backend-status.js +40 -0
- package/dist/server/backend-status.js.map +1 -0
- package/dist/server/tool-schemas.d.ts +549 -0
- package/dist/server/tool-schemas.d.ts.map +1 -0
- package/dist/server/tool-schemas.js +464 -0
- package/dist/server/tool-schemas.js.map +1 -0
- package/dist/server/warmup-on-start.d.ts +9 -0
- package/dist/server/warmup-on-start.d.ts.map +1 -0
- package/dist/server/warmup-on-start.js +55 -0
- package/dist/server/warmup-on-start.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +454 -297
- package/dist/server.js.map +1 -1
- package/dist/tools/agent.d.ts +5 -0
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +128 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/cache.d.ts +2 -1
- package/dist/tools/cache.d.ts.map +1 -1
- package/dist/tools/cache.js +177 -44
- package/dist/tools/cache.js.map +1 -1
- package/dist/tools/crawl.d.ts.map +1 -1
- package/dist/tools/crawl.js +171 -88
- package/dist/tools/crawl.js.map +1 -1
- package/dist/tools/extract.d.ts +2 -2
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +175 -59
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/fetch.d.ts +2 -2
- package/dist/tools/fetch.d.ts.map +1 -1
- package/dist/tools/fetch.js +174 -68
- package/dist/tools/fetch.js.map +1 -1
- package/dist/tools/find-similar.d.ts +5 -0
- package/dist/tools/find-similar.d.ts.map +1 -0
- package/dist/tools/find-similar.js +127 -0
- package/dist/tools/find-similar.js.map +1 -0
- package/dist/tools/research.d.ts +5 -0
- package/dist/tools/research.d.ts.map +1 -0
- package/dist/tools/research.js +107 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/search.d.ts +10 -2
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +13 -158
- package/dist/tools/search.js.map +1 -1
- package/dist/types.d.ts +350 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -1
- package/dist/types.js.map +1 -1
- package/dist/util/mode.d.ts +4 -0
- package/dist/util/mode.d.ts.map +1 -0
- package/dist/util/mode.js +34 -0
- package/dist/util/mode.js.map +1 -0
- package/package.json +78 -8
- package/dist/extraction/trafilatura.d.ts +0 -6
- package/dist/extraction/trafilatura.d.ts.map +0 -1
- package/dist/extraction/trafilatura.js +0 -105
- package/dist/extraction/trafilatura.js.map +0 -1
- package/dist/search/flashrank.d.ts +0 -12
- package/dist/search/flashrank.d.ts.map +0 -1
- package/dist/search/flashrank.js +0 -63
- package/dist/search/flashrank.js.map +0 -1
|
@@ -1,138 +1,314 @@
|
|
|
1
|
-
import { chromium, firefox, webkit } from
|
|
2
|
-
import { getConfig } from
|
|
3
|
-
import { createLogger } from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { chromium, firefox, webkit } from "playwright";
|
|
2
|
+
import { getConfig } from "../config.js";
|
|
3
|
+
import { createLogger } from "../logger.js";
|
|
4
|
+
import { BrowserSelector } from "./browser-selector.js";
|
|
5
|
+
import { executeActions } from "./action-executor.js";
|
|
6
|
+
const log = createLogger("fetch");
|
|
7
|
+
function getLauncher(type) {
|
|
8
|
+
switch (type) {
|
|
9
|
+
case "firefox":
|
|
10
|
+
return firefox;
|
|
11
|
+
case "webkit":
|
|
12
|
+
return webkit;
|
|
13
|
+
default:
|
|
14
|
+
return chromium;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class MultiBrowserPool {
|
|
18
|
+
pools = /* @__PURE__ */ new Map();
|
|
19
|
+
selector;
|
|
20
|
+
configuredTypes;
|
|
21
|
+
shutdownCalled = false;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
let types = options?.browserTypes ?? ["chromium"];
|
|
24
|
+
if (types.length === 0) {
|
|
25
|
+
log.warn("empty browserTypes, defaulting to chromium");
|
|
26
|
+
types = ["chromium"];
|
|
14
27
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
this.configuredTypes = [...types];
|
|
29
|
+
this.selector = new BrowserSelector(types, options?.selectionStrategy ?? "round-robin");
|
|
30
|
+
for (const type of types) {
|
|
31
|
+
this.pools.set(type, {
|
|
32
|
+
browser: null,
|
|
33
|
+
pool: [],
|
|
34
|
+
activeCount: 0,
|
|
35
|
+
waitQueue: [],
|
|
36
|
+
idleTimers: /* @__PURE__ */ new Map()
|
|
37
|
+
});
|
|
23
38
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
log.info("multi-browser pool initialized", {
|
|
40
|
+
types: this.configuredTypes,
|
|
41
|
+
strategy: options?.selectionStrategy ?? "round-robin"
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
getConfiguredTypes() {
|
|
45
|
+
return [...this.configuredTypes];
|
|
46
|
+
}
|
|
47
|
+
getStats() {
|
|
48
|
+
return this.configuredTypes.map((type) => {
|
|
49
|
+
const p = this.pools.get(type);
|
|
50
|
+
return {
|
|
51
|
+
type,
|
|
52
|
+
activeCount: p.activeCount,
|
|
53
|
+
pooledCount: p.pool.length
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
resolveType(requested, url) {
|
|
58
|
+
if (requested && this.pools.has(requested)) {
|
|
59
|
+
return requested;
|
|
44
60
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
this.pool.push(ctx);
|
|
54
|
-
const timer = setTimeout(() => {
|
|
55
|
-
const idx = this.pool.indexOf(ctx);
|
|
56
|
-
if (idx !== -1) {
|
|
57
|
-
this.pool.splice(idx, 1);
|
|
58
|
-
this.idleTimers.delete(ctx);
|
|
59
|
-
this.activeCount = Math.max(0, this.activeCount - 1);
|
|
60
|
-
ctx.close().catch(() => { });
|
|
61
|
-
}
|
|
62
|
-
}, idleTimeoutMs);
|
|
63
|
-
this.idleTimers.set(ctx, timer);
|
|
61
|
+
if (requested && !this.pools.has(requested)) {
|
|
62
|
+
log.warn("requested browser type not configured, falling back", {
|
|
63
|
+
requested,
|
|
64
|
+
available: this.configuredTypes
|
|
65
|
+
});
|
|
66
|
+
return this.configuredTypes[0];
|
|
64
67
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
68
|
+
if (url && this.selector.getStrategy() === "hostname-hash") {
|
|
69
|
+
try {
|
|
70
|
+
const hostname = new URL(url).hostname;
|
|
71
|
+
return this.selector.selectForHostname(hostname);
|
|
72
|
+
} catch {
|
|
73
|
+
return this.selector.select();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return this.selector.select();
|
|
77
|
+
}
|
|
78
|
+
async launchBrowser(type) {
|
|
79
|
+
const typePool = this.pools.get(type);
|
|
80
|
+
if (!typePool.browser) {
|
|
81
|
+
const launcher = getLauncher(type);
|
|
82
|
+
log.debug("launching browser", { type });
|
|
83
|
+
typePool.browser = await launcher.launch({ headless: true });
|
|
84
|
+
}
|
|
85
|
+
return typePool.browser;
|
|
86
|
+
}
|
|
87
|
+
async acquireForType(type) {
|
|
88
|
+
const config = getConfig();
|
|
89
|
+
const maxBrowsers = config.maxBrowsers;
|
|
90
|
+
const typePool = this.pools.get(type);
|
|
91
|
+
if (typePool.pool.length > 0) {
|
|
92
|
+
const ctx = typePool.pool.pop();
|
|
93
|
+
const timer = typePool.idleTimers.get(ctx);
|
|
94
|
+
if (timer !== void 0) {
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
typePool.idleTimers.delete(ctx);
|
|
97
|
+
}
|
|
98
|
+
return ctx;
|
|
99
|
+
}
|
|
100
|
+
if (typePool.activeCount < maxBrowsers) {
|
|
101
|
+
typePool.activeCount++;
|
|
102
|
+
const browser = await this.launchBrowser(type);
|
|
103
|
+
return browser.newContext();
|
|
104
|
+
}
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
typePool.waitQueue.push(resolve);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
releaseForType(type, ctx) {
|
|
110
|
+
const config = getConfig();
|
|
111
|
+
const idleTimeoutMs = config.browserIdleTimeoutMs;
|
|
112
|
+
const typePool = this.pools.get(type);
|
|
113
|
+
if (typePool.waitQueue.length > 0) {
|
|
114
|
+
const resolve = typePool.waitQueue.shift();
|
|
115
|
+
resolve(ctx);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
typePool.pool.push(ctx);
|
|
119
|
+
const timer = setTimeout(() => {
|
|
120
|
+
const idx = typePool.pool.indexOf(ctx);
|
|
121
|
+
if (idx !== -1) {
|
|
122
|
+
typePool.pool.splice(idx, 1);
|
|
123
|
+
typePool.idleTimers.delete(ctx);
|
|
124
|
+
typePool.activeCount = Math.max(0, typePool.activeCount - 1);
|
|
125
|
+
ctx.close().catch(() => {
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}, idleTimeoutMs);
|
|
129
|
+
typePool.idleTimers.set(ctx, timer);
|
|
130
|
+
}
|
|
131
|
+
async fetchWithBrowser(url, options = {}) {
|
|
132
|
+
const config = getConfig();
|
|
133
|
+
const navTimeoutMs = options.timeoutMs ?? config.playwrightNavTimeoutMs;
|
|
134
|
+
const loadTimeoutMs = config.playwrightLoadTimeoutMs;
|
|
135
|
+
let ctx;
|
|
136
|
+
let cdpBrowser = null;
|
|
137
|
+
let resolvedType;
|
|
138
|
+
if (!options.cdpUrl && config.lightpandaEnabled && config.lightpandaUrl) {
|
|
139
|
+
try {
|
|
140
|
+
const domain = new URL(url).hostname;
|
|
141
|
+
const { shouldUseLightpanda, recordSuccess, recordFailure, LightpandaAdapter } = await import("./lightpanda.js");
|
|
142
|
+
if (shouldUseLightpanda(domain)) {
|
|
143
|
+
log.debug("trying lightpanda for domain", { url, domain });
|
|
144
|
+
const adapter = new LightpandaAdapter(config.lightpandaUrl);
|
|
145
|
+
const connection = await adapter.connect();
|
|
146
|
+
if (connection.connected) {
|
|
91
147
|
try {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
148
|
+
const lpCtx = await adapter.getContext();
|
|
149
|
+
if (lpCtx) {
|
|
150
|
+
const page2 = await lpCtx.newPage();
|
|
151
|
+
if (options.headers) await page2.setExtraHTTPHeaders(options.headers);
|
|
152
|
+
try {
|
|
153
|
+
const response = await page2.goto(url, {
|
|
154
|
+
timeout: navTimeoutMs,
|
|
155
|
+
waitUntil: "domcontentloaded"
|
|
156
|
+
});
|
|
157
|
+
const html = await page2.content();
|
|
158
|
+
const statusCode2 = response?.status() ?? 200;
|
|
159
|
+
const finalUrl2 = response?.url() ?? url;
|
|
160
|
+
const responseHeaders2 = response?.headers() ?? {};
|
|
161
|
+
const contentType2 = responseHeaders2["content-type"] ?? "";
|
|
162
|
+
await page2.close();
|
|
163
|
+
await adapter.disconnect();
|
|
164
|
+
recordSuccess(domain);
|
|
165
|
+
return {
|
|
166
|
+
url,
|
|
167
|
+
finalUrl: finalUrl2,
|
|
168
|
+
html,
|
|
169
|
+
contentType: contentType2,
|
|
170
|
+
statusCode: statusCode2,
|
|
171
|
+
method: "playwright",
|
|
172
|
+
headers: responseHeaders2
|
|
173
|
+
};
|
|
174
|
+
} catch (pageErr) {
|
|
175
|
+
await page2.close().catch(() => {
|
|
176
|
+
});
|
|
177
|
+
throw pageErr;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
} catch (fetchErr) {
|
|
181
|
+
log.warn("lightpanda fetch failed, falling back to chromium", {
|
|
105
182
|
url,
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
await page.close();
|
|
117
|
-
this.release(ctx);
|
|
183
|
+
domain,
|
|
184
|
+
error: fetchErr instanceof Error ? fetchErr.message : String(fetchErr)
|
|
185
|
+
});
|
|
186
|
+
recordFailure(domain);
|
|
187
|
+
await adapter.disconnect();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
118
190
|
}
|
|
191
|
+
} catch (lpErr) {
|
|
192
|
+
log.debug("lightpanda integration error, using standard pool", {
|
|
193
|
+
error: lpErr instanceof Error ? lpErr.message : String(lpErr)
|
|
194
|
+
});
|
|
195
|
+
}
|
|
119
196
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
197
|
+
if (options.cdpUrl) {
|
|
198
|
+
resolvedType = "chromium";
|
|
199
|
+
try {
|
|
200
|
+
log.info("connecting via CDP", { cdpUrl: options.cdpUrl });
|
|
201
|
+
cdpBrowser = await chromium.connectOverCDP(options.cdpUrl);
|
|
202
|
+
const contexts = cdpBrowser.contexts();
|
|
203
|
+
ctx = contexts.length > 0 ? contexts[0] : await cdpBrowser.newContext();
|
|
204
|
+
} catch (err) {
|
|
205
|
+
log.warn("CDP connection failed, falling back to launch", {
|
|
206
|
+
cdpUrl: options.cdpUrl,
|
|
207
|
+
error: err instanceof Error ? err.message : String(err)
|
|
208
|
+
});
|
|
209
|
+
ctx = await this.acquireForType(resolvedType);
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
resolvedType = this.resolveType(options.browserType, url);
|
|
213
|
+
log.debug("fetching with browser", { url, type: resolvedType });
|
|
214
|
+
ctx = await this.acquireForType(resolvedType);
|
|
215
|
+
}
|
|
216
|
+
const page = await ctx.newPage();
|
|
217
|
+
if (options.headers) {
|
|
218
|
+
await page.setExtraHTTPHeaders(options.headers);
|
|
219
|
+
}
|
|
220
|
+
let statusCode = 200;
|
|
221
|
+
let contentType = "";
|
|
222
|
+
let responseHeaders = {};
|
|
223
|
+
let finalUrl = url;
|
|
224
|
+
try {
|
|
225
|
+
const response = await page.goto(url, {
|
|
226
|
+
timeout: navTimeoutMs,
|
|
227
|
+
waitUntil: "domcontentloaded"
|
|
228
|
+
});
|
|
229
|
+
if (response) {
|
|
230
|
+
statusCode = response.status();
|
|
231
|
+
finalUrl = response.url();
|
|
232
|
+
const rawHeaders = response.headers();
|
|
233
|
+
responseHeaders = rawHeaders;
|
|
234
|
+
contentType = rawHeaders["content-type"] ?? "";
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
await page.waitForLoadState("networkidle", { timeout: loadTimeoutMs });
|
|
238
|
+
} catch {
|
|
239
|
+
log.debug("networkidle timeout, using page content as-is", { url, type: resolvedType });
|
|
240
|
+
}
|
|
241
|
+
let actionResults;
|
|
242
|
+
if (options.actions && options.actions.length > 0) {
|
|
243
|
+
actionResults = await executeActions(page, options.actions);
|
|
244
|
+
}
|
|
245
|
+
const html = await page.content();
|
|
246
|
+
let screenshotBase64;
|
|
247
|
+
if (options.screenshot) {
|
|
248
|
+
const buf = await page.screenshot({ fullPage: true });
|
|
249
|
+
screenshotBase64 = buf.toString("base64");
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
url,
|
|
253
|
+
finalUrl,
|
|
254
|
+
html,
|
|
255
|
+
contentType,
|
|
256
|
+
statusCode,
|
|
257
|
+
method: "playwright",
|
|
258
|
+
headers: responseHeaders,
|
|
259
|
+
screenshot: screenshotBase64,
|
|
260
|
+
actionResults
|
|
261
|
+
};
|
|
262
|
+
} finally {
|
|
263
|
+
await page.close();
|
|
264
|
+
if (cdpBrowser) {
|
|
265
|
+
await cdpBrowser.close().catch(() => {
|
|
266
|
+
});
|
|
267
|
+
} else {
|
|
268
|
+
this.releaseForType(resolvedType, ctx);
|
|
269
|
+
}
|
|
136
270
|
}
|
|
271
|
+
}
|
|
272
|
+
async shutdown() {
|
|
273
|
+
if (this.shutdownCalled) return;
|
|
274
|
+
this.shutdownCalled = true;
|
|
275
|
+
for (const [type, typePool] of this.pools) {
|
|
276
|
+
for (const [, timer] of typePool.idleTimers) {
|
|
277
|
+
clearTimeout(timer);
|
|
278
|
+
}
|
|
279
|
+
typePool.idleTimers.clear();
|
|
280
|
+
const closePromises = typePool.pool.map((ctx) => ctx.close().catch(() => {
|
|
281
|
+
}));
|
|
282
|
+
typePool.pool = [];
|
|
283
|
+
await Promise.all(closePromises);
|
|
284
|
+
if (typePool.browser) {
|
|
285
|
+
await typePool.browser.close().catch(() => {
|
|
286
|
+
});
|
|
287
|
+
typePool.browser = null;
|
|
288
|
+
}
|
|
289
|
+
typePool.activeCount = 0;
|
|
290
|
+
log.debug("browser pool shut down", { type });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
class BrowserPool extends MultiBrowserPool {
|
|
295
|
+
singleType;
|
|
296
|
+
constructor(options) {
|
|
297
|
+
const type = options?.browserType ?? "chromium";
|
|
298
|
+
super({
|
|
299
|
+
browserTypes: [type]
|
|
300
|
+
});
|
|
301
|
+
this.singleType = type;
|
|
302
|
+
}
|
|
303
|
+
async acquire() {
|
|
304
|
+
return this.acquireForType(this.singleType);
|
|
305
|
+
}
|
|
306
|
+
release(ctx) {
|
|
307
|
+
this.releaseForType(this.singleType, ctx);
|
|
308
|
+
}
|
|
137
309
|
}
|
|
310
|
+
export {
|
|
311
|
+
BrowserPool,
|
|
312
|
+
MultiBrowserPool
|
|
313
|
+
};
|
|
138
314
|
//# sourceMappingURL=browser-pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-pool.js","sourceRoot":"","sources":["../../src/fetch/browser-pool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/browser-pool.ts"],"sourcesContent":["import { chromium, firefox, webkit, type Browser, type BrowserContext } from 'playwright';\nimport { getConfig } from '../config.js';\nimport { createLogger } from '../logger.js';\nimport { BrowserSelector, type SelectionStrategy } from './browser-selector.js';\nimport { executeActions } from './action-executor.js';\nimport type { RawFetchResult, BrowserType, ActionResult, BrowserAction } from '../types.js';\n\nexport interface BrowserFetchOptions {\n timeoutMs?: number;\n storageStatePath?: string;\n userDataDir?: string;\n headers?: Record<string, string>;\n screenshot?: boolean;\n actions?: BrowserAction[];\n cdpUrl?: string;\n browserType?: BrowserType;\n}\n\nexport interface BrowserPoolOptions {\n browserType?: BrowserType;\n}\n\nexport interface MultiBrowserPoolOptions {\n browserTypes?: BrowserType[];\n selectionStrategy?: SelectionStrategy;\n}\n\nexport interface PoolTypeStat {\n type: BrowserType;\n activeCount: number;\n pooledCount: number;\n}\n\nconst log = createLogger('fetch');\n\nfunction getLauncher(type: BrowserType) {\n switch (type) {\n case 'firefox': return firefox;\n case 'webkit': return webkit;\n default: return chromium;\n }\n}\n\ninterface TypePool {\n browser: Browser | null;\n pool: BrowserContext[];\n activeCount: number;\n waitQueue: Array<(ctx: BrowserContext) => void>;\n idleTimers: Map<BrowserContext, ReturnType<typeof setTimeout>>;\n}\n\nexport class MultiBrowserPool {\n private readonly pools = new Map<BrowserType, TypePool>();\n private readonly selector: BrowserSelector;\n private readonly configuredTypes: BrowserType[];\n private shutdownCalled = false;\n\n constructor(options?: MultiBrowserPoolOptions) {\n let types = options?.browserTypes ?? ['chromium'];\n if (types.length === 0) {\n log.warn('empty browserTypes, defaulting to chromium');\n types = ['chromium'];\n }\n this.configuredTypes = [...types];\n this.selector = new BrowserSelector(types, options?.selectionStrategy ?? 'round-robin');\n\n for (const type of types) {\n this.pools.set(type, {\n browser: null,\n pool: [],\n activeCount: 0,\n waitQueue: [],\n idleTimers: new Map(),\n });\n }\n\n log.info('multi-browser pool initialized', {\n types: this.configuredTypes,\n strategy: options?.selectionStrategy ?? 'round-robin',\n });\n }\n\n getConfiguredTypes(): BrowserType[] {\n return [...this.configuredTypes];\n }\n\n getStats(): PoolTypeStat[] {\n return this.configuredTypes.map(type => {\n const p = this.pools.get(type)!;\n return {\n type,\n activeCount: p.activeCount,\n pooledCount: p.pool.length,\n };\n });\n }\n\n protected resolveType(requested?: BrowserType, url?: string): BrowserType {\n if (requested && this.pools.has(requested)) {\n return requested;\n }\n if (requested && !this.pools.has(requested)) {\n log.warn('requested browser type not configured, falling back', {\n requested,\n available: this.configuredTypes,\n });\n return this.configuredTypes[0];\n }\n // For hostname-hash strategy, use the URL hostname for deterministic selection\n if (url && this.selector.getStrategy() === 'hostname-hash') {\n try {\n const hostname = new URL(url).hostname;\n return this.selector.selectForHostname(hostname);\n } catch {\n return this.selector.select();\n }\n }\n return this.selector.select();\n }\n\n private async launchBrowser(type: BrowserType): Promise<Browser> {\n const typePool = this.pools.get(type)!;\n if (!typePool.browser) {\n const launcher = getLauncher(type);\n log.debug('launching browser', { type });\n typePool.browser = await launcher.launch({ headless: true });\n }\n return typePool.browser;\n }\n\n protected async acquireForType(type: BrowserType): Promise<BrowserContext> {\n const config = getConfig();\n const maxBrowsers = config.maxBrowsers;\n const typePool = this.pools.get(type)!;\n\n if (typePool.pool.length > 0) {\n const ctx = typePool.pool.pop()!;\n const timer = typePool.idleTimers.get(ctx);\n if (timer !== undefined) {\n clearTimeout(timer);\n typePool.idleTimers.delete(ctx);\n }\n return ctx;\n }\n\n if (typePool.activeCount < maxBrowsers) {\n typePool.activeCount++;\n const browser = await this.launchBrowser(type);\n return browser.newContext();\n }\n\n return new Promise<BrowserContext>((resolve) => {\n typePool.waitQueue.push(resolve);\n });\n }\n\n protected releaseForType(type: BrowserType, ctx: BrowserContext): void {\n const config = getConfig();\n const idleTimeoutMs = config.browserIdleTimeoutMs;\n const typePool = this.pools.get(type)!;\n\n if (typePool.waitQueue.length > 0) {\n const resolve = typePool.waitQueue.shift()!;\n resolve(ctx);\n return;\n }\n\n typePool.pool.push(ctx);\n\n const timer = setTimeout(() => {\n const idx = typePool.pool.indexOf(ctx);\n if (idx !== -1) {\n typePool.pool.splice(idx, 1);\n typePool.idleTimers.delete(ctx);\n typePool.activeCount = Math.max(0, typePool.activeCount - 1);\n ctx.close().catch(() => {});\n }\n }, idleTimeoutMs);\n\n typePool.idleTimers.set(ctx, timer);\n }\n\n async fetchWithBrowser(url: string, options: BrowserFetchOptions = {}): Promise<RawFetchResult> {\n const config = getConfig();\n const navTimeoutMs = options.timeoutMs ?? config.playwrightNavTimeoutMs;\n const loadTimeoutMs = config.playwrightLoadTimeoutMs;\n\n let ctx: BrowserContext;\n let cdpBrowser: Browser | null = null;\n let resolvedType: BrowserType;\n\n if (!options.cdpUrl && config.lightpandaEnabled && config.lightpandaUrl) {\n try {\n const domain = new URL(url).hostname;\n const { shouldUseLightpanda, recordSuccess, recordFailure, LightpandaAdapter } = await import('./lightpanda.js');\n\n if (shouldUseLightpanda(domain)) {\n log.debug('trying lightpanda for domain', { url, domain });\n const adapter = new LightpandaAdapter(config.lightpandaUrl);\n const connection = await adapter.connect();\n\n if (connection.connected) {\n try {\n const lpCtx = await adapter.getContext();\n if (lpCtx) {\n const page = await lpCtx.newPage();\n if (options.headers) await page.setExtraHTTPHeaders(options.headers);\n\n try {\n const response = await page.goto(url, {\n timeout: navTimeoutMs,\n waitUntil: 'domcontentloaded',\n });\n\n const html = await page.content();\n const statusCode = response?.status() ?? 200;\n const finalUrl = response?.url() ?? url;\n const responseHeaders = response?.headers() ?? {};\n const contentType = responseHeaders['content-type'] ?? '';\n\n await page.close();\n await adapter.disconnect();\n recordSuccess(domain);\n\n return {\n url,\n finalUrl,\n html,\n contentType,\n statusCode,\n method: 'playwright' as const,\n headers: responseHeaders,\n };\n } catch (pageErr) {\n await page.close().catch(() => {});\n throw pageErr;\n }\n }\n } catch (fetchErr) {\n log.warn('lightpanda fetch failed, falling back to chromium', {\n url, domain,\n error: fetchErr instanceof Error ? fetchErr.message : String(fetchErr),\n });\n recordFailure(domain);\n await adapter.disconnect();\n }\n }\n }\n } catch (lpErr) {\n log.debug('lightpanda integration error, using standard pool', {\n error: lpErr instanceof Error ? lpErr.message : String(lpErr),\n });\n }\n }\n\n if (options.cdpUrl) {\n // CDP is always Chromium\n resolvedType = 'chromium';\n try {\n log.info('connecting via CDP', { cdpUrl: options.cdpUrl });\n cdpBrowser = await chromium.connectOverCDP(options.cdpUrl);\n const contexts = cdpBrowser.contexts();\n ctx = contexts.length > 0 ? contexts[0] : await cdpBrowser.newContext();\n } catch (err) {\n log.warn('CDP connection failed, falling back to launch', {\n cdpUrl: options.cdpUrl,\n error: err instanceof Error ? err.message : String(err),\n });\n ctx = await this.acquireForType(resolvedType);\n }\n } else {\n resolvedType = this.resolveType(options.browserType, url);\n log.debug('fetching with browser', { url, type: resolvedType });\n ctx = await this.acquireForType(resolvedType);\n }\n\n const page = await ctx.newPage();\n\n if (options.headers) {\n await page.setExtraHTTPHeaders(options.headers);\n }\n\n let statusCode = 200;\n let contentType = '';\n let responseHeaders: Record<string, string> = {};\n let finalUrl = url;\n\n try {\n const response = await page.goto(url, {\n timeout: navTimeoutMs,\n waitUntil: 'domcontentloaded',\n });\n\n if (response) {\n statusCode = response.status();\n finalUrl = response.url();\n const rawHeaders = response.headers();\n responseHeaders = rawHeaders;\n contentType = rawHeaders['content-type'] ?? '';\n }\n\n try {\n await page.waitForLoadState('networkidle', { timeout: loadTimeoutMs });\n } catch {\n log.debug('networkidle timeout, using page content as-is', { url, type: resolvedType });\n }\n\n let actionResults: ActionResult[] | undefined;\n if (options.actions && options.actions.length > 0) {\n actionResults = await executeActions(page, options.actions);\n }\n\n const html = await page.content();\n\n let screenshotBase64: string | undefined;\n if (options.screenshot) {\n const buf = await page.screenshot({ fullPage: true });\n screenshotBase64 = buf.toString('base64');\n }\n\n return {\n url,\n finalUrl,\n html,\n contentType,\n statusCode,\n method: 'playwright',\n headers: responseHeaders,\n screenshot: screenshotBase64,\n actionResults,\n };\n } finally {\n await page.close();\n if (cdpBrowser) {\n await cdpBrowser.close().catch(() => {});\n } else {\n this.releaseForType(resolvedType, ctx);\n }\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.shutdownCalled) return;\n this.shutdownCalled = true;\n\n for (const [type, typePool] of this.pools) {\n for (const [, timer] of typePool.idleTimers) {\n clearTimeout(timer);\n }\n typePool.idleTimers.clear();\n\n const closePromises = typePool.pool.map(ctx => ctx.close().catch(() => {}));\n typePool.pool = [];\n await Promise.all(closePromises);\n\n if (typePool.browser) {\n await typePool.browser.close().catch(() => {});\n typePool.browser = null;\n }\n\n typePool.activeCount = 0;\n log.debug('browser pool shut down', { type });\n }\n }\n}\n\n// Backwards-compatible wrapper for existing code\nexport class BrowserPool extends MultiBrowserPool {\n private readonly singleType: BrowserType;\n\n constructor(options?: BrowserPoolOptions) {\n const type = options?.browserType ?? 'chromium';\n super({\n browserTypes: [type],\n });\n this.singleType = type;\n }\n\n async acquire(): Promise<BrowserContext> {\n return this.acquireForType(this.singleType);\n }\n\n release(ctx: BrowserContext): void {\n this.releaseForType(this.singleType, ctx);\n }\n}\n"],"mappings":"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","names":["page","statusCode","finalUrl","responseHeaders","contentType"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BrowserType } from '../types.js';
|
|
2
|
+
export type SelectionStrategy = 'round-robin' | 'hostname-hash' | 'random';
|
|
3
|
+
export declare class BrowserSelector {
|
|
4
|
+
private readonly types;
|
|
5
|
+
private readonly strategy;
|
|
6
|
+
private roundRobinIndex;
|
|
7
|
+
constructor(types: BrowserType[], strategy?: SelectionStrategy);
|
|
8
|
+
select(): BrowserType;
|
|
9
|
+
selectForHostname(hostname: string): BrowserType;
|
|
10
|
+
getTypes(): BrowserType[];
|
|
11
|
+
getStrategy(): SelectionStrategy;
|
|
12
|
+
reset(): void;
|
|
13
|
+
private selectRoundRobin;
|
|
14
|
+
private selectRandom;
|
|
15
|
+
private selectByHostnameHash;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=browser-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-selector.d.ts","sourceRoot":"","sources":["../../src/fetch/browser-selector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ,CAAC;AAY3E,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAK;gBAEhB,KAAK,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,EAAE,iBAAiB;IAY9D,MAAM,IAAI,WAAW;IAcrB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAOhD,QAAQ,IAAI,WAAW,EAAE;IAIzB,WAAW,IAAI,iBAAiB;IAIhC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,oBAAoB;CAK7B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createLogger } from "../logger.js";
|
|
2
|
+
const log = createLogger("fetch");
|
|
3
|
+
function hashString(str) {
|
|
4
|
+
let hash = 0;
|
|
5
|
+
for (let i = 0; i < str.length; i++) {
|
|
6
|
+
const char = str.charCodeAt(i);
|
|
7
|
+
hash = (hash << 5) - hash + char;
|
|
8
|
+
hash = hash & hash;
|
|
9
|
+
}
|
|
10
|
+
return Math.abs(hash);
|
|
11
|
+
}
|
|
12
|
+
class BrowserSelector {
|
|
13
|
+
types;
|
|
14
|
+
strategy;
|
|
15
|
+
roundRobinIndex = 0;
|
|
16
|
+
constructor(types, strategy) {
|
|
17
|
+
if (types.length === 0) {
|
|
18
|
+
throw new Error("BrowserSelector requires at least one browser type");
|
|
19
|
+
}
|
|
20
|
+
this.types = [...types];
|
|
21
|
+
this.strategy = strategy ?? "round-robin";
|
|
22
|
+
log.debug("browser selector initialized", {
|
|
23
|
+
types: this.types,
|
|
24
|
+
strategy: this.strategy
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
select() {
|
|
28
|
+
switch (this.strategy) {
|
|
29
|
+
case "round-robin":
|
|
30
|
+
return this.selectRoundRobin();
|
|
31
|
+
case "random":
|
|
32
|
+
return this.selectRandom();
|
|
33
|
+
case "hostname-hash":
|
|
34
|
+
return this.selectRoundRobin();
|
|
35
|
+
default:
|
|
36
|
+
return this.selectRoundRobin();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
selectForHostname(hostname) {
|
|
40
|
+
if (this.strategy === "hostname-hash" && hostname) {
|
|
41
|
+
return this.selectByHostnameHash(hostname);
|
|
42
|
+
}
|
|
43
|
+
return this.select();
|
|
44
|
+
}
|
|
45
|
+
getTypes() {
|
|
46
|
+
return [...this.types];
|
|
47
|
+
}
|
|
48
|
+
getStrategy() {
|
|
49
|
+
return this.strategy;
|
|
50
|
+
}
|
|
51
|
+
reset() {
|
|
52
|
+
this.roundRobinIndex = 0;
|
|
53
|
+
}
|
|
54
|
+
selectRoundRobin() {
|
|
55
|
+
const type = this.types[this.roundRobinIndex % this.types.length];
|
|
56
|
+
this.roundRobinIndex++;
|
|
57
|
+
return type;
|
|
58
|
+
}
|
|
59
|
+
selectRandom() {
|
|
60
|
+
const index = Math.floor(Math.random() * this.types.length);
|
|
61
|
+
return this.types[index];
|
|
62
|
+
}
|
|
63
|
+
selectByHostnameHash(hostname) {
|
|
64
|
+
const hash = hashString(hostname);
|
|
65
|
+
const index = hash % this.types.length;
|
|
66
|
+
return this.types[index];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
BrowserSelector
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=browser-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fetch/browser-selector.ts"],"sourcesContent":["import { createLogger } from '../logger.js';\nimport type { BrowserType } from '../types.js';\n\nconst log = createLogger('fetch');\n\nexport type SelectionStrategy = 'round-robin' | 'hostname-hash' | 'random';\n\nfunction hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash);\n}\n\nexport class BrowserSelector {\n private readonly types: BrowserType[];\n private readonly strategy: SelectionStrategy;\n private roundRobinIndex = 0;\n\n constructor(types: BrowserType[], strategy?: SelectionStrategy) {\n if (types.length === 0) {\n throw new Error('BrowserSelector requires at least one browser type');\n }\n this.types = [...types];\n this.strategy = strategy ?? 'round-robin';\n log.debug('browser selector initialized', {\n types: this.types,\n strategy: this.strategy,\n });\n }\n\n select(): BrowserType {\n switch (this.strategy) {\n case 'round-robin':\n return this.selectRoundRobin();\n case 'random':\n return this.selectRandom();\n case 'hostname-hash':\n // Without a hostname, fall back to round-robin\n return this.selectRoundRobin();\n default:\n return this.selectRoundRobin();\n }\n }\n\n selectForHostname(hostname: string): BrowserType {\n if (this.strategy === 'hostname-hash' && hostname) {\n return this.selectByHostnameHash(hostname);\n }\n return this.select();\n }\n\n getTypes(): BrowserType[] {\n return [...this.types];\n }\n\n getStrategy(): SelectionStrategy {\n return this.strategy;\n }\n\n reset(): void {\n this.roundRobinIndex = 0;\n }\n\n private selectRoundRobin(): BrowserType {\n const type = this.types[this.roundRobinIndex % this.types.length];\n this.roundRobinIndex++;\n return type;\n }\n\n private selectRandom(): BrowserType {\n const index = Math.floor(Math.random() * this.types.length);\n return this.types[index];\n }\n\n private selectByHostnameHash(hostname: string): BrowserType {\n const hash = hashString(hostname);\n const index = hash % this.types.length;\n return this.types[index];\n }\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAG7B,MAAM,MAAM,aAAa,OAAO;AAIhC,SAAS,WAAW,KAAqB;AACvC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,OAAO,IAAI,WAAW,CAAC;AAC7B,YAAS,QAAQ,KAAK,OAAQ;AAC9B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,KAAK,IAAI,IAAI;AACtB;AAEO,MAAM,gBAAgB;AAAA,EACV;AAAA,EACA;AAAA,EACT,kBAAkB;AAAA,EAE1B,YAAY,OAAsB,UAA8B;AAC9D,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AACA,SAAK,QAAQ,CAAC,GAAG,KAAK;AACtB,SAAK,WAAW,YAAY;AAC5B,QAAI,MAAM,gCAAgC;AAAA,MACxC,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,SAAsB;AACpB,YAAQ,KAAK,UAAU;AAAA,MACrB,KAAK;AACH,eAAO,KAAK,iBAAiB;AAAA,MAC/B,KAAK;AACH,eAAO,KAAK,aAAa;AAAA,MAC3B,KAAK;AAEH,eAAO,KAAK,iBAAiB;AAAA,MAC/B;AACE,eAAO,KAAK,iBAAiB;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,kBAAkB,UAA+B;AAC/C,QAAI,KAAK,aAAa,mBAAmB,UAAU;AACjD,aAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC3C;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,WAA0B;AACxB,WAAO,CAAC,GAAG,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,cAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAc;AACZ,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,mBAAgC;AACtC,UAAM,OAAO,KAAK,MAAM,KAAK,kBAAkB,KAAK,MAAM,MAAM;AAChE,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEQ,eAA4B;AAClC,UAAM,QAAQ,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,MAAM,MAAM;AAC1D,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEQ,qBAAqB,UAA+B;AAC1D,UAAM,OAAO,WAAW,QAAQ;AAChC,UAAM,QAAQ,OAAO,KAAK,MAAM;AAChC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-types.d.ts","sourceRoot":"","sources":["../../src/fetch/browser-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,EAAE,CA6CjF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const VALID_BROWSER_TYPES = /* @__PURE__ */ new Set(["chromium", "firefox", "webkit", "lightpanda"]);
|
|
2
|
+
const DEFAULT_BROWSER_TYPES = ["chromium"];
|
|
3
|
+
function warn(msg, data) {
|
|
4
|
+
const line = JSON.stringify({ ts: (/* @__PURE__ */ new Date()).toISOString(), level: "warn", msg, module: "fetch", data });
|
|
5
|
+
process.stderr.write(line + "\n");
|
|
6
|
+
}
|
|
7
|
+
function parseBrowserTypes(input) {
|
|
8
|
+
if (!input || typeof input !== "string") {
|
|
9
|
+
return [...DEFAULT_BROWSER_TYPES];
|
|
10
|
+
}
|
|
11
|
+
const trimmed = input.trim();
|
|
12
|
+
if (trimmed.length === 0) {
|
|
13
|
+
return [...DEFAULT_BROWSER_TYPES];
|
|
14
|
+
}
|
|
15
|
+
const parts = trimmed.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
16
|
+
if (parts.length === 0) {
|
|
17
|
+
return [...DEFAULT_BROWSER_TYPES];
|
|
18
|
+
}
|
|
19
|
+
const seen = /* @__PURE__ */ new Set();
|
|
20
|
+
const valid = [];
|
|
21
|
+
const invalid = [];
|
|
22
|
+
for (const part of parts) {
|
|
23
|
+
if (!VALID_BROWSER_TYPES.has(part)) {
|
|
24
|
+
invalid.push(part);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (seen.has(part)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
seen.add(part);
|
|
31
|
+
valid.push(part);
|
|
32
|
+
}
|
|
33
|
+
if (invalid.length > 0) {
|
|
34
|
+
warn("ignored invalid browser types", { invalid, valid: [...valid] });
|
|
35
|
+
}
|
|
36
|
+
if (valid.length === 0) {
|
|
37
|
+
warn("no valid browser types found, falling back to chromium", { input });
|
|
38
|
+
return [...DEFAULT_BROWSER_TYPES];
|
|
39
|
+
}
|
|
40
|
+
return valid;
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
parseBrowserTypes
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=browser-types.js.map
|