@staticn0va/wigolo 0.1.0 → 0.1.1
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 +195 -73
- 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 +208 -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 +46 -1
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +362 -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 +318 -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/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 +58 -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/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 +185 -81
- package/dist/fetch/router.js.map +1 -1
- package/dist/index.js +97 -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/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/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/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 +16 -0
- package/dist/providers/rerank-provider.d.ts.map +1 -0
- package/dist/providers/rerank-provider.js +28 -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 +5 -0
- package/dist/research/brief.d.ts.map +1 -0
- package/dist/research/brief.js +242 -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 +16 -0
- package/dist/research/synthesis-local.d.ts.map +1 -0
- package/dist/research/synthesis-local.js +73 -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.js +49 -55
- 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 +12 -0
- package/dist/search/reranker/transformers-rerank-provider.d.ts.map +1 -0
- package/dist/search/reranker/transformers-rerank-provider.js +78 -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 +175 -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 +161 -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
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import {
|
|
2
|
+
checkSamplingSupport,
|
|
3
|
+
requestSampling,
|
|
4
|
+
extractTextFromSamplingResponse
|
|
5
|
+
} from "./sampling.js";
|
|
6
|
+
import { createLogger } from "../logger.js";
|
|
7
|
+
const log = createLogger("search");
|
|
8
|
+
const MAX_CHARS_PER_SOURCE = 3e3;
|
|
9
|
+
const MAX_RESPONSE_TOKENS = 1500;
|
|
10
|
+
const FALLBACK_MAX_BULLETS = 5;
|
|
11
|
+
const FALLBACK_KEYPOINT_MAX_CHARS = 240;
|
|
12
|
+
async function synthesizeAnswer(results, query, server) {
|
|
13
|
+
try {
|
|
14
|
+
const sourcesText = buildSourcesText(results);
|
|
15
|
+
if (!sourcesText) {
|
|
16
|
+
log.info("no content available for synthesis");
|
|
17
|
+
return {
|
|
18
|
+
fallback: true,
|
|
19
|
+
warning: "No results with content available for answer synthesis"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (!checkSamplingSupport(server)) {
|
|
23
|
+
log.info("sampling not supported by client, falling back to context format");
|
|
24
|
+
return {
|
|
25
|
+
fallback: true,
|
|
26
|
+
warning: "Client does not support MCP sampling; falling back to context format"
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const prompt = buildSynthesisPrompt(query, sourcesText);
|
|
30
|
+
const response = await requestSampling(
|
|
31
|
+
server,
|
|
32
|
+
[{ role: "user", content: { type: "text", text: prompt } }],
|
|
33
|
+
MAX_RESPONSE_TOKENS
|
|
34
|
+
);
|
|
35
|
+
const answerText = extractTextFromSamplingResponse(response);
|
|
36
|
+
if (!answerText) {
|
|
37
|
+
log.warn("sampling returned empty response");
|
|
38
|
+
return {
|
|
39
|
+
fallback: true,
|
|
40
|
+
warning: "Sampling returned empty response; falling back to context format"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const citations = extractCitations(answerText, results);
|
|
44
|
+
log.info("answer synthesis complete", {
|
|
45
|
+
answerLength: answerText.length,
|
|
46
|
+
citationCount: citations.length
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
answer: answerText,
|
|
50
|
+
citations,
|
|
51
|
+
fallback: false
|
|
52
|
+
};
|
|
53
|
+
} catch (err) {
|
|
54
|
+
log.error("answer synthesis failed", { error: String(err) });
|
|
55
|
+
return {
|
|
56
|
+
fallback: true,
|
|
57
|
+
warning: `Answer synthesis failed: ${err instanceof Error ? err.message : String(err)}; falling back to context format`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function buildSourcesText(results) {
|
|
62
|
+
try {
|
|
63
|
+
const blocks = [];
|
|
64
|
+
let sourceIndex = 1;
|
|
65
|
+
for (const result of results) {
|
|
66
|
+
const content = result.markdown_content || result.snippet || "";
|
|
67
|
+
if (!content.trim()) continue;
|
|
68
|
+
const truncated = content.length > MAX_CHARS_PER_SOURCE ? content.slice(0, MAX_CHARS_PER_SOURCE) : content;
|
|
69
|
+
blocks.push(`[${sourceIndex}] ${result.title} (${result.url})
|
|
70
|
+
${truncated}`);
|
|
71
|
+
sourceIndex++;
|
|
72
|
+
}
|
|
73
|
+
if (blocks.length === 0) return "";
|
|
74
|
+
return blocks.join("\n\n---\n\n");
|
|
75
|
+
} catch (err) {
|
|
76
|
+
log.error("buildSourcesText failed", { error: String(err) });
|
|
77
|
+
return "";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function buildSynthesisPrompt(query, sourcesText) {
|
|
81
|
+
return `Based on the following sources, provide a concise and direct answer to the question. Use numbered citations like [1], [2] to reference specific sources.
|
|
82
|
+
|
|
83
|
+
Question: ${query}
|
|
84
|
+
|
|
85
|
+
Sources:
|
|
86
|
+
${sourcesText}
|
|
87
|
+
|
|
88
|
+
Instructions:
|
|
89
|
+
- Be concise and direct. Answer in 2-4 paragraphs maximum.
|
|
90
|
+
- Cite sources using [1], [2], etc. matching the source numbers above.
|
|
91
|
+
- If sources contain conflicting information, note the discrepancy.
|
|
92
|
+
- If the sources don't adequately answer the question, say so.
|
|
93
|
+
- Do not include information not found in the provided sources.`;
|
|
94
|
+
}
|
|
95
|
+
function buildStructuredFallback(results, query) {
|
|
96
|
+
const bullets = [];
|
|
97
|
+
const citations = [];
|
|
98
|
+
let n = 0;
|
|
99
|
+
for (const r of results) {
|
|
100
|
+
if (n >= FALLBACK_MAX_BULLETS) break;
|
|
101
|
+
const body = r.markdown_content && r.markdown_content.trim() || r.snippet && r.snippet.trim() || "";
|
|
102
|
+
if (!body) continue;
|
|
103
|
+
const keypoint = extractKeypoint(body, FALLBACK_KEYPOINT_MAX_CHARS);
|
|
104
|
+
if (!keypoint) continue;
|
|
105
|
+
n += 1;
|
|
106
|
+
bullets.push(`- **${r.title}** \u2014 ${keypoint} [${n}]`);
|
|
107
|
+
citations.push({ index: n, url: r.url, title: r.title, snippet: r.snippet });
|
|
108
|
+
}
|
|
109
|
+
if (bullets.length === 0) {
|
|
110
|
+
return { answer: "", citations: [], warning: "No sampling server available; no content to summarize" };
|
|
111
|
+
}
|
|
112
|
+
const q = query && query.trim() ? query.trim() : "this query";
|
|
113
|
+
const answer = `Based on the top ${bullets.length} sources for "${q}":
|
|
114
|
+
|
|
115
|
+
${bullets.join("\n")}
|
|
116
|
+
|
|
117
|
+
Sources:
|
|
118
|
+
${citations.map((c) => `[${c.index}] ${c.title} \u2014 ${c.url}`).join("\n")}`;
|
|
119
|
+
return {
|
|
120
|
+
answer,
|
|
121
|
+
citations,
|
|
122
|
+
warning: "Client does not support MCP sampling; returning heuristic key-point summary instead of synthesized answer"
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function extractKeypoint(body, maxChars) {
|
|
126
|
+
const trimmed = body.trim();
|
|
127
|
+
if (!trimmed) return "";
|
|
128
|
+
const firstPara = trimmed.split(/\n\s*\n/)[0].trim();
|
|
129
|
+
if (!firstPara) return "";
|
|
130
|
+
const stripped = firstPara.replace(/^#+\s*/, "").trim();
|
|
131
|
+
if (!stripped) return "";
|
|
132
|
+
if (stripped.length <= maxChars) return stripped;
|
|
133
|
+
const window = stripped.slice(0, maxChars);
|
|
134
|
+
const lastStop = Math.max(window.lastIndexOf(". "), window.lastIndexOf("! "), window.lastIndexOf("? "));
|
|
135
|
+
if (lastStop > maxChars * 0.6) {
|
|
136
|
+
return window.slice(0, lastStop + 1);
|
|
137
|
+
}
|
|
138
|
+
return window + "\u2026";
|
|
139
|
+
}
|
|
140
|
+
async function runSynthesis(input) {
|
|
141
|
+
const { query, results, samplingServer } = input;
|
|
142
|
+
if (!results || results.length === 0) {
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
error: "no_content",
|
|
146
|
+
error_reason: "No sources returned content for this query",
|
|
147
|
+
stage: "synthesize",
|
|
148
|
+
hint: "Broaden the query, increase max_results, or remove restrictive filters"
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (samplingServer) {
|
|
152
|
+
try {
|
|
153
|
+
const r = await synthesizeAnswer(results, query, samplingServer);
|
|
154
|
+
if (r.answer && !r.fallback) {
|
|
155
|
+
return {
|
|
156
|
+
ok: true,
|
|
157
|
+
data: {
|
|
158
|
+
answer: r.answer,
|
|
159
|
+
citations: r.citations ?? [],
|
|
160
|
+
warning: r.warning,
|
|
161
|
+
fallback_level: 1
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
} catch (err) {
|
|
166
|
+
log.warn("synthesis level-1 sampling failed, falling through to heuristic", { error: String(err) });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const fb = buildStructuredFallback(results, query);
|
|
170
|
+
if (fb.answer && fb.answer.length > 0) {
|
|
171
|
+
return {
|
|
172
|
+
ok: true,
|
|
173
|
+
data: {
|
|
174
|
+
answer: fb.answer,
|
|
175
|
+
citations: fb.citations,
|
|
176
|
+
warning: fb.warning,
|
|
177
|
+
fallback_level: 2
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const top = results.slice(0, 5);
|
|
182
|
+
const citations = top.map((r, i) => ({
|
|
183
|
+
index: i + 1,
|
|
184
|
+
url: r.url,
|
|
185
|
+
title: r.title,
|
|
186
|
+
snippet: r.snippet
|
|
187
|
+
}));
|
|
188
|
+
if (citations.length > 0) {
|
|
189
|
+
const lines = citations.map((c) => `[${c.index}] ${c.title} \u2014 ${c.url}
|
|
190
|
+
${c.snippet ?? ""}`);
|
|
191
|
+
return {
|
|
192
|
+
ok: true,
|
|
193
|
+
data: {
|
|
194
|
+
answer: `Evidence for "${query}" (no synthesis available \u2014 content too sparse to summarize):
|
|
195
|
+
|
|
196
|
+
${lines.join("\n\n")}`,
|
|
197
|
+
citations,
|
|
198
|
+
warning: "sparse_content: returned raw evidence dump instead of synthesized answer",
|
|
199
|
+
fallback_level: 3
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
ok: false,
|
|
205
|
+
error: "no_content",
|
|
206
|
+
error_reason: "Sources returned but contained no usable text",
|
|
207
|
+
stage: "synthesize"
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function extractCitations(answer, results) {
|
|
211
|
+
try {
|
|
212
|
+
if (!answer || results.length === 0) return [];
|
|
213
|
+
const citationRegex = /\[(\d+)\]/g;
|
|
214
|
+
const seen = /* @__PURE__ */ new Set();
|
|
215
|
+
const citations = [];
|
|
216
|
+
let match;
|
|
217
|
+
while ((match = citationRegex.exec(answer)) !== null) {
|
|
218
|
+
const index = parseInt(match[1], 10);
|
|
219
|
+
if (isNaN(index) || index < 1 || index > results.length) continue;
|
|
220
|
+
if (seen.has(index)) continue;
|
|
221
|
+
seen.add(index);
|
|
222
|
+
const result = results[index - 1];
|
|
223
|
+
citations.push({
|
|
224
|
+
index,
|
|
225
|
+
url: result.url,
|
|
226
|
+
title: result.title,
|
|
227
|
+
snippet: result.snippet
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return citations;
|
|
231
|
+
} catch (err) {
|
|
232
|
+
log.error("citation extraction failed", { error: String(err) });
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export {
|
|
237
|
+
buildSourcesText,
|
|
238
|
+
buildStructuredFallback,
|
|
239
|
+
buildSynthesisPrompt,
|
|
240
|
+
extractCitations,
|
|
241
|
+
runSynthesis,
|
|
242
|
+
synthesizeAnswer
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=answer-synthesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/search/answer-synthesis.ts"],"sourcesContent":["import type { SearchResultItem, Citation, StageResult } from '../types.js';\nimport type { SamplingCapableServer } from './sampling.js';\nimport {\n checkSamplingSupport,\n requestSampling,\n extractTextFromSamplingResponse,\n} from './sampling.js';\nimport { createLogger } from '../logger.js';\n\nconst log = createLogger('search');\n\nconst MAX_CHARS_PER_SOURCE = 3000;\nconst MAX_RESPONSE_TOKENS = 1500;\nconst FALLBACK_MAX_BULLETS = 5;\nconst FALLBACK_KEYPOINT_MAX_CHARS = 240;\n\nexport interface SynthesisResult {\n answer?: string;\n citations?: Citation[];\n fallback: boolean;\n warning?: string;\n}\n\nexport async function synthesizeAnswer(\n results: SearchResultItem[],\n query: string,\n server: SamplingCapableServer,\n): Promise<SynthesisResult> {\n try {\n const sourcesText = buildSourcesText(results);\n if (!sourcesText) {\n log.info('no content available for synthesis');\n return {\n fallback: true,\n warning: 'No results with content available for answer synthesis',\n };\n }\n\n if (!checkSamplingSupport(server)) {\n log.info('sampling not supported by client, falling back to context format');\n return {\n fallback: true,\n warning: 'Client does not support MCP sampling; falling back to context format',\n };\n }\n\n const prompt = buildSynthesisPrompt(query, sourcesText);\n\n const response = await requestSampling(\n server,\n [{ role: 'user', content: { type: 'text', text: prompt } }],\n MAX_RESPONSE_TOKENS,\n );\n\n const answerText = extractTextFromSamplingResponse(response);\n\n if (!answerText) {\n log.warn('sampling returned empty response');\n return {\n fallback: true,\n warning: 'Sampling returned empty response; falling back to context format',\n };\n }\n\n const citations = extractCitations(answerText, results);\n\n log.info('answer synthesis complete', {\n answerLength: answerText.length,\n citationCount: citations.length,\n });\n\n return {\n answer: answerText,\n citations,\n fallback: false,\n };\n } catch (err) {\n log.error('answer synthesis failed', { error: String(err) });\n return {\n fallback: true,\n warning: `Answer synthesis failed: ${err instanceof Error ? err.message : String(err)}; falling back to context format`,\n };\n }\n}\n\nexport function buildSourcesText(results: SearchResultItem[]): string {\n try {\n const blocks: string[] = [];\n let sourceIndex = 1;\n\n for (const result of results) {\n const content = result.markdown_content || result.snippet || '';\n if (!content.trim()) continue;\n\n const truncated = content.length > MAX_CHARS_PER_SOURCE\n ? content.slice(0, MAX_CHARS_PER_SOURCE)\n : content;\n\n blocks.push(`[${sourceIndex}] ${result.title} (${result.url})\\n${truncated}`);\n sourceIndex++;\n }\n\n if (blocks.length === 0) return '';\n\n return blocks.join('\\n\\n---\\n\\n');\n } catch (err) {\n log.error('buildSourcesText failed', { error: String(err) });\n return '';\n }\n}\n\nexport function buildSynthesisPrompt(query: string, sourcesText: string): string {\n return `Based on the following sources, provide a concise and direct answer to the question. Use numbered citations like [1], [2] to reference specific sources.\n\nQuestion: ${query}\n\nSources:\n${sourcesText}\n\nInstructions:\n- Be concise and direct. Answer in 2-4 paragraphs maximum.\n- Cite sources using [1], [2], etc. matching the source numbers above.\n- If sources contain conflicting information, note the discrepancy.\n- If the sources don't adequately answer the question, say so.\n- Do not include information not found in the provided sources.`;\n}\n\nexport interface StructuredFallbackResult {\n answer: string;\n citations: Citation[];\n warning: string;\n}\n\n// Heuristic answer without LLM sampling: top-N sources as bulleted key points\n// with numeric citations. Used when client lacks sampling capability.\nexport function buildStructuredFallback(\n results: SearchResultItem[],\n query: string,\n): StructuredFallbackResult {\n const bullets: string[] = [];\n const citations: Citation[] = [];\n let n = 0;\n\n for (const r of results) {\n if (n >= FALLBACK_MAX_BULLETS) break;\n const body = (r.markdown_content && r.markdown_content.trim()) || (r.snippet && r.snippet.trim()) || '';\n if (!body) continue;\n\n const keypoint = extractKeypoint(body, FALLBACK_KEYPOINT_MAX_CHARS);\n if (!keypoint) continue;\n\n n += 1;\n bullets.push(`- **${r.title}** — ${keypoint} [${n}]`);\n citations.push({ index: n, url: r.url, title: r.title, snippet: r.snippet });\n }\n\n if (bullets.length === 0) {\n return { answer: '', citations: [], warning: 'No sampling server available; no content to summarize' };\n }\n\n const q = query && query.trim() ? query.trim() : 'this query';\n const answer = `Based on the top ${bullets.length} sources for \"${q}\":\\n\\n${bullets.join('\\n')}\\n\\nSources:\\n${citations.map(c => `[${c.index}] ${c.title} — ${c.url}`).join('\\n')}`;\n\n return {\n answer,\n citations,\n warning: 'Client does not support MCP sampling; returning heuristic key-point summary instead of synthesized answer',\n };\n}\n\nfunction extractKeypoint(body: string, maxChars: number): string {\n const trimmed = body.trim();\n if (!trimmed) return '';\n\n // First paragraph before a blank line\n const firstPara = trimmed.split(/\\n\\s*\\n/)[0].trim();\n if (!firstPara) return '';\n\n // Strip markdown headings at the start\n const stripped = firstPara.replace(/^#+\\s*/, '').trim();\n if (!stripped) return '';\n\n if (stripped.length <= maxChars) return stripped;\n\n // Try to cut at sentence end within budget\n const window = stripped.slice(0, maxChars);\n const lastStop = Math.max(window.lastIndexOf('. '), window.lastIndexOf('! '), window.lastIndexOf('? '));\n if (lastStop > maxChars * 0.6) {\n return window.slice(0, lastStop + 1);\n }\n return window + '…';\n}\n\nexport interface SynthesisInput {\n query: string;\n results: SearchResultItem[];\n samplingServer?: SamplingCapableServer;\n /** Reserved for future per-source truncation; T6 currently relies on MAX_CHARS_PER_SOURCE. */\n maxTotalChars: number;\n}\n\nexport interface SynthesizedAnswer {\n answer: string;\n citations: Citation[];\n warning?: string;\n fallback_level: 1 | 2 | 3;\n}\n\nexport async function runSynthesis(\n input: SynthesisInput,\n): Promise<StageResult<SynthesizedAnswer>> {\n const { query, results, samplingServer } = input;\n\n if (!results || results.length === 0) {\n return {\n ok: false,\n error: 'no_content',\n error_reason: 'No sources returned content for this query',\n stage: 'synthesize',\n hint: 'Broaden the query, increase max_results, or remove restrictive filters',\n };\n }\n\n if (samplingServer) {\n try {\n const r = await synthesizeAnswer(results, query, samplingServer);\n if (r.answer && !r.fallback) {\n return {\n ok: true,\n data: {\n answer: r.answer,\n citations: r.citations ?? [],\n warning: r.warning,\n fallback_level: 1,\n },\n };\n }\n } catch (err) {\n log.warn('synthesis level-1 sampling failed, falling through to heuristic', { error: String(err) });\n }\n }\n\n const fb = buildStructuredFallback(results, query);\n if (fb.answer && fb.answer.length > 0) {\n return {\n ok: true,\n data: {\n answer: fb.answer,\n citations: fb.citations,\n warning: fb.warning,\n fallback_level: 2,\n },\n };\n }\n\n const top = results.slice(0, 5);\n const citations: Citation[] = top.map((r, i) => ({\n index: i + 1, url: r.url, title: r.title, snippet: r.snippet,\n }));\n if (citations.length > 0) {\n const lines = citations.map(c => `[${c.index}] ${c.title} — ${c.url}\\n${c.snippet ?? ''}`);\n return {\n ok: true,\n data: {\n answer: `Evidence for \"${query}\" (no synthesis available — content too sparse to summarize):\\n\\n${lines.join('\\n\\n')}`,\n citations,\n warning: 'sparse_content: returned raw evidence dump instead of synthesized answer',\n fallback_level: 3,\n },\n };\n }\n\n return {\n ok: false,\n error: 'no_content',\n error_reason: 'Sources returned but contained no usable text',\n stage: 'synthesize',\n };\n}\n\nexport function extractCitations(\n answer: string,\n results: SearchResultItem[],\n): Citation[] {\n try {\n if (!answer || results.length === 0) return [];\n\n const citationRegex = /\\[(\\d+)\\]/g;\n const seen = new Set<number>();\n const citations: Citation[] = [];\n\n let match: RegExpExecArray | null;\n while ((match = citationRegex.exec(answer)) !== null) {\n const index = parseInt(match[1], 10);\n if (isNaN(index) || index < 1 || index > results.length) continue;\n if (seen.has(index)) continue;\n seen.add(index);\n\n const result = results[index - 1];\n citations.push({\n index,\n url: result.url,\n title: result.title,\n snippet: result.snippet,\n });\n }\n\n return citations;\n } catch (err) {\n log.error('citation extraction failed', { error: String(err) });\n return [];\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-formatter.d.ts","sourceRoot":"","sources":["../../src/search/context-formatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CA0D9F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createLogger } from "../logger.js";
|
|
2
|
+
const log = createLogger("search");
|
|
3
|
+
function formatSearchContext(results, maxTotalChars) {
|
|
4
|
+
if (results.length === 0 || maxTotalChars <= 0) {
|
|
5
|
+
return "";
|
|
6
|
+
}
|
|
7
|
+
const blocks = [];
|
|
8
|
+
let charsUsed = 0;
|
|
9
|
+
for (let i = 0; i < results.length; i++) {
|
|
10
|
+
const result = results[i];
|
|
11
|
+
const content = result.markdown_content || result.snippet || "";
|
|
12
|
+
const header = `Source: ${result.title} (${result.url})`;
|
|
13
|
+
const separator = "\n";
|
|
14
|
+
const blockSeparator = i > 0 ? "\n\n" : "";
|
|
15
|
+
const minBlockSize = blockSeparator.length + header.length + separator.length;
|
|
16
|
+
if (i > 0 && charsUsed + minBlockSize >= maxTotalChars) {
|
|
17
|
+
log.debug("context formatter stopping: next header exceeds budget", {
|
|
18
|
+
resultIndex: i,
|
|
19
|
+
charsUsed,
|
|
20
|
+
maxTotalChars
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
const remainingBudget = maxTotalChars - charsUsed - blockSeparator.length - header.length - separator.length;
|
|
25
|
+
let truncatedContent;
|
|
26
|
+
if (remainingBudget <= 0) {
|
|
27
|
+
const totalAvailable = maxTotalChars - charsUsed - blockSeparator.length;
|
|
28
|
+
if (totalAvailable <= 0 && i > 0) break;
|
|
29
|
+
const headerTruncated = totalAvailable > 3 ? header.slice(0, totalAvailable - 3) + "..." : header.slice(0, Math.max(totalAvailable, 0));
|
|
30
|
+
blocks.push(blockSeparator + headerTruncated);
|
|
31
|
+
charsUsed += blockSeparator.length + headerTruncated.length;
|
|
32
|
+
break;
|
|
33
|
+
} else if (content.length > remainingBudget) {
|
|
34
|
+
const truncLen = Math.max(remainingBudget - 3, 0);
|
|
35
|
+
truncatedContent = truncLen > 0 ? content.slice(0, truncLen) + "..." : "...";
|
|
36
|
+
log.debug("context formatter truncated result content", {
|
|
37
|
+
resultIndex: i,
|
|
38
|
+
originalLength: content.length,
|
|
39
|
+
truncatedTo: truncatedContent.length
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
truncatedContent = content;
|
|
43
|
+
}
|
|
44
|
+
const block = blockSeparator + header + separator + truncatedContent;
|
|
45
|
+
blocks.push(block);
|
|
46
|
+
charsUsed += block.length;
|
|
47
|
+
if (charsUsed >= maxTotalChars) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return blocks.join("").trimEnd();
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
formatSearchContext
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=context-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/search/context-formatter.ts"],"sourcesContent":["import { createLogger } from '../logger.js';\nimport type { SearchResultItem } from '../types.js';\n\nconst log = createLogger('search');\n\nexport function formatSearchContext(results: SearchResultItem[], maxTotalChars: number): string {\n if (results.length === 0 || maxTotalChars <= 0) {\n return '';\n }\n\n const blocks: string[] = [];\n let charsUsed = 0;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const content = result.markdown_content || result.snippet || '';\n const header = `Source: ${result.title} (${result.url})`;\n const separator = '\\n';\n const blockSeparator = i > 0 ? '\\n\\n' : '';\n\n const minBlockSize = blockSeparator.length + header.length + separator.length;\n\n if (i > 0 && charsUsed + minBlockSize >= maxTotalChars) {\n log.debug('context formatter stopping: next header exceeds budget', {\n resultIndex: i,\n charsUsed,\n maxTotalChars,\n });\n break;\n }\n\n const remainingBudget = maxTotalChars - charsUsed - blockSeparator.length - header.length - separator.length;\n\n let truncatedContent: string;\n if (remainingBudget <= 0) {\n const totalAvailable = maxTotalChars - charsUsed - blockSeparator.length;\n if (totalAvailable <= 0 && i > 0) break;\n const headerTruncated = totalAvailable > 3 ? header.slice(0, totalAvailable - 3) + '...' : header.slice(0, Math.max(totalAvailable, 0));\n blocks.push(blockSeparator + headerTruncated);\n charsUsed += blockSeparator.length + headerTruncated.length;\n break;\n } else if (content.length > remainingBudget) {\n const truncLen = Math.max(remainingBudget - 3, 0);\n truncatedContent = truncLen > 0 ? content.slice(0, truncLen) + '...' : '...';\n log.debug('context formatter truncated result content', {\n resultIndex: i,\n originalLength: content.length,\n truncatedTo: truncatedContent.length,\n });\n } else {\n truncatedContent = content;\n }\n\n const block = blockSeparator + header + separator + truncatedContent;\n blocks.push(block);\n charsUsed += block.length;\n\n if (charsUsed >= maxTotalChars) {\n break;\n }\n }\n\n return blocks.join('').trimEnd();\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAG7B,MAAM,MAAM,aAAa,QAAQ;AAE1B,SAAS,oBAAoB,SAA6B,eAA+B;AAC9F,MAAI,QAAQ,WAAW,KAAK,iBAAiB,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,SAAmB,CAAC;AAC1B,MAAI,YAAY;AAEhB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,UAAU,OAAO,oBAAoB,OAAO,WAAW;AAC7D,UAAM,SAAS,WAAW,OAAO,KAAK,KAAK,OAAO,GAAG;AACrD,UAAM,YAAY;AAClB,UAAM,iBAAiB,IAAI,IAAI,SAAS;AAExC,UAAM,eAAe,eAAe,SAAS,OAAO,SAAS,UAAU;AAEvE,QAAI,IAAI,KAAK,YAAY,gBAAgB,eAAe;AACtD,UAAI,MAAM,0DAA0D;AAAA,QAClE,aAAa;AAAA,QACb;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,kBAAkB,gBAAgB,YAAY,eAAe,SAAS,OAAO,SAAS,UAAU;AAEtG,QAAI;AACJ,QAAI,mBAAmB,GAAG;AACxB,YAAM,iBAAiB,gBAAgB,YAAY,eAAe;AAClE,UAAI,kBAAkB,KAAK,IAAI,EAAG;AAClC,YAAM,kBAAkB,iBAAiB,IAAI,OAAO,MAAM,GAAG,iBAAiB,CAAC,IAAI,QAAQ,OAAO,MAAM,GAAG,KAAK,IAAI,gBAAgB,CAAC,CAAC;AACtI,aAAO,KAAK,iBAAiB,eAAe;AAC5C,mBAAa,eAAe,SAAS,gBAAgB;AACrD;AAAA,IACF,WAAW,QAAQ,SAAS,iBAAiB;AAC3C,YAAM,WAAW,KAAK,IAAI,kBAAkB,GAAG,CAAC;AAChD,yBAAmB,WAAW,IAAI,QAAQ,MAAM,GAAG,QAAQ,IAAI,QAAQ;AACvE,UAAI,MAAM,8CAA8C;AAAA,QACtD,aAAa;AAAA,QACb,gBAAgB,QAAQ;AAAA,QACxB,aAAa,iBAAiB;AAAA,MAChC,CAAC;AAAA,IACH,OAAO;AACL,yBAAmB;AAAA,IACrB;AAEA,UAAM,QAAQ,iBAAiB,SAAS,YAAY;AACpD,WAAO,KAAK,KAAK;AACjB,iBAAa,MAAM;AAEnB,QAAI,aAAa,eAAe;AAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,EAAE,EAAE,QAAQ;AACjC;","names":[]}
|
package/dist/search/dedup.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface MergedSearchResult {
|
|
|
5
5
|
snippet: string;
|
|
6
6
|
relevance_score: number;
|
|
7
7
|
engines: string[];
|
|
8
|
+
published_date?: string;
|
|
8
9
|
}
|
|
9
10
|
export declare function deduplicateResults(results: RawSearchResult[]): MergedSearchResult[];
|
|
10
11
|
//# sourceMappingURL=dedup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../src/search/dedup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../src/search/dedup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,kBAAkB,EAAE,CAwCnF"}
|
package/dist/search/dedup.js
CHANGED
|
@@ -1,35 +1,43 @@
|
|
|
1
|
-
import { normalizeUrl } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (existing) {
|
|
14
|
-
if (result.relevance_score > existing.relevance_score) {
|
|
15
|
-
existing.relevance_score = result.relevance_score;
|
|
16
|
-
existing.title = result.title;
|
|
17
|
-
existing.snippet = result.snippet;
|
|
18
|
-
}
|
|
19
|
-
if (!existing.engines.includes(result.engine)) {
|
|
20
|
-
existing.engines.push(result.engine);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
urlMap.set(normalized, {
|
|
25
|
-
title: result.title,
|
|
26
|
-
url: result.url,
|
|
27
|
-
snippet: result.snippet,
|
|
28
|
-
relevance_score: result.relevance_score,
|
|
29
|
-
engines: [result.engine],
|
|
30
|
-
});
|
|
31
|
-
}
|
|
1
|
+
import { normalizeUrl } from "../cache/store.js";
|
|
2
|
+
import { normalizeResultUrl } from "./url-unwrap.js";
|
|
3
|
+
function deduplicateResults(results) {
|
|
4
|
+
const urlMap = /* @__PURE__ */ new Map();
|
|
5
|
+
for (const raw of results) {
|
|
6
|
+
const unwrappedUrl = normalizeResultUrl(raw.url);
|
|
7
|
+
const result = unwrappedUrl !== raw.url ? { ...raw, url: unwrappedUrl } : raw;
|
|
8
|
+
let normalized;
|
|
9
|
+
try {
|
|
10
|
+
normalized = normalizeUrl(result.url);
|
|
11
|
+
} catch {
|
|
12
|
+
normalized = result.url;
|
|
32
13
|
}
|
|
33
|
-
|
|
14
|
+
const existing = urlMap.get(normalized);
|
|
15
|
+
if (existing) {
|
|
16
|
+
if (result.relevance_score > existing.relevance_score) {
|
|
17
|
+
existing.relevance_score = result.relevance_score;
|
|
18
|
+
existing.title = result.title;
|
|
19
|
+
existing.snippet = result.snippet;
|
|
20
|
+
}
|
|
21
|
+
if (result.published_date && !existing.published_date) {
|
|
22
|
+
existing.published_date = result.published_date;
|
|
23
|
+
}
|
|
24
|
+
if (!existing.engines.includes(result.engine)) {
|
|
25
|
+
existing.engines.push(result.engine);
|
|
26
|
+
}
|
|
27
|
+
} else {
|
|
28
|
+
urlMap.set(normalized, {
|
|
29
|
+
title: result.title,
|
|
30
|
+
url: result.url,
|
|
31
|
+
snippet: result.snippet,
|
|
32
|
+
relevance_score: result.relevance_score,
|
|
33
|
+
engines: [result.engine],
|
|
34
|
+
...result.published_date ? { published_date: result.published_date } : {}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [...urlMap.values()].sort((a, b) => b.relevance_score - a.relevance_score);
|
|
34
39
|
}
|
|
40
|
+
export {
|
|
41
|
+
deduplicateResults
|
|
42
|
+
};
|
|
35
43
|
//# sourceMappingURL=dedup.js.map
|
package/dist/search/dedup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/search/dedup.ts"],"sourcesContent":["import { normalizeUrl } from '../cache/store.js';\nimport type { RawSearchResult } from '../types.js';\nimport { normalizeResultUrl } from './url-unwrap.js';\n\nexport interface MergedSearchResult {\n title: string;\n url: string;\n snippet: string;\n relevance_score: number;\n engines: string[];\n published_date?: string;\n}\n\nexport function deduplicateResults(results: RawSearchResult[]): MergedSearchResult[] {\n const urlMap = new Map<string, MergedSearchResult>();\n\n for (const raw of results) {\n const unwrappedUrl = normalizeResultUrl(raw.url);\n const result = unwrappedUrl !== raw.url ? { ...raw, url: unwrappedUrl } : raw;\n let normalized: string;\n try {\n normalized = normalizeUrl(result.url);\n } catch {\n normalized = result.url;\n }\n\n const existing = urlMap.get(normalized);\n\n if (existing) {\n if (result.relevance_score > existing.relevance_score) {\n existing.relevance_score = result.relevance_score;\n existing.title = result.title;\n existing.snippet = result.snippet;\n }\n if (result.published_date && !existing.published_date) {\n existing.published_date = result.published_date;\n }\n if (!existing.engines.includes(result.engine)) {\n existing.engines.push(result.engine);\n }\n } else {\n urlMap.set(normalized, {\n title: result.title,\n url: result.url,\n snippet: result.snippet,\n relevance_score: result.relevance_score,\n engines: [result.engine],\n ...(result.published_date ? { published_date: result.published_date } : {}),\n });\n }\n }\n\n return [...urlMap.values()].sort((a, b) => b.relevance_score - a.relevance_score);\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,SAAS,0BAA0B;AAW5B,SAAS,mBAAmB,SAAkD;AACnF,QAAM,SAAS,oBAAI,IAAgC;AAEnD,aAAW,OAAO,SAAS;AACzB,UAAM,eAAe,mBAAmB,IAAI,GAAG;AAC/C,UAAM,SAAS,iBAAiB,IAAI,MAAM,EAAE,GAAG,KAAK,KAAK,aAAa,IAAI;AAC1E,QAAI;AACJ,QAAI;AACF,mBAAa,aAAa,OAAO,GAAG;AAAA,IACtC,QAAQ;AACN,mBAAa,OAAO;AAAA,IACtB;AAEA,UAAM,WAAW,OAAO,IAAI,UAAU;AAEtC,QAAI,UAAU;AACZ,UAAI,OAAO,kBAAkB,SAAS,iBAAiB;AACrD,iBAAS,kBAAkB,OAAO;AAClC,iBAAS,QAAQ,OAAO;AACxB,iBAAS,UAAU,OAAO;AAAA,MAC5B;AACA,UAAI,OAAO,kBAAkB,CAAC,SAAS,gBAAgB;AACrD,iBAAS,iBAAiB,OAAO;AAAA,MACnC;AACA,UAAI,CAAC,SAAS,QAAQ,SAAS,OAAO,MAAM,GAAG;AAC7C,iBAAS,QAAQ,KAAK,OAAO,MAAM;AAAA,MACrC;AAAA,IACF,OAAO;AACL,aAAO,IAAI,YAAY;AAAA,QACrB,OAAO,OAAO;AAAA,QACd,KAAK,OAAO;AAAA,QACZ,SAAS,OAAO;AAAA,QAChB,iBAAiB,OAAO;AAAA,QACxB,SAAS,CAAC,OAAO,MAAM;AAAA,QACvB,GAAI,OAAO,iBAAiB,EAAE,gBAAgB,OAAO,eAAe,IAAI,CAAC;AAAA,MAC3E,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,kBAAkB,EAAE,eAAe;AAClF;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SearchEngine, SearchEngineOptions, RawSearchResult } from '../../types.js';
|
|
2
|
+
export declare class ArxivEngine implements SearchEngine {
|
|
3
|
+
name: string;
|
|
4
|
+
search(query: string, options?: SearchEngineOptions): Promise<RawSearchResult[]>;
|
|
5
|
+
private parseAtom;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=arxiv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arxiv.d.ts","sourceRoot":"","sources":["../../../src/search/engines/arxiv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAWzF,qBAAa,WAAY,YAAW,YAAY;IAC9C,IAAI,SAAW;IAET,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAoB1F,OAAO,CAAC,SAAS;CAgClB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { parseHTML } from "linkedom";
|
|
2
|
+
import { createLogger } from "../../logger.js";
|
|
3
|
+
const log = createLogger("search");
|
|
4
|
+
const SNIPPET_LIMIT = 200;
|
|
5
|
+
function textContent(el) {
|
|
6
|
+
return (el?.textContent ?? "").replace(/\s+/g, " ").trim();
|
|
7
|
+
}
|
|
8
|
+
class ArxivEngine {
|
|
9
|
+
name = "arxiv";
|
|
10
|
+
async search(query, options = {}) {
|
|
11
|
+
const timeoutMs = options.timeoutMs ?? 1e4;
|
|
12
|
+
const maxResults = options.maxResults ?? 10;
|
|
13
|
+
const params = new URLSearchParams({
|
|
14
|
+
search_query: `all:${query}`,
|
|
15
|
+
max_results: String(maxResults),
|
|
16
|
+
sortBy: "relevance"
|
|
17
|
+
});
|
|
18
|
+
const url = `http://export.arxiv.org/api/query?${params}`;
|
|
19
|
+
log.debug("arxiv search", { query });
|
|
20
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });
|
|
21
|
+
if (!response.ok) throw new Error(`arXiv returned ${response.status}`);
|
|
22
|
+
const xml = await response.text();
|
|
23
|
+
const mapped = this.parseAtom(xml);
|
|
24
|
+
return applyDateFilter(mapped, options);
|
|
25
|
+
}
|
|
26
|
+
parseAtom(xml) {
|
|
27
|
+
const { document } = parseHTML(xml);
|
|
28
|
+
const entries = Array.from(document.querySelectorAll("entry"));
|
|
29
|
+
const results = [];
|
|
30
|
+
const total = entries.length;
|
|
31
|
+
for (let i = 0; i < total; i++) {
|
|
32
|
+
const entry = entries[i];
|
|
33
|
+
const id = textContent(entry.querySelector("id"));
|
|
34
|
+
const title = textContent(entry.querySelector("title"));
|
|
35
|
+
const summary = textContent(entry.querySelector("summary"));
|
|
36
|
+
const published = textContent(entry.querySelector("published"));
|
|
37
|
+
if (!id || !title) continue;
|
|
38
|
+
let published_date;
|
|
39
|
+
if (published) {
|
|
40
|
+
const d = new Date(published);
|
|
41
|
+
if (!isNaN(d.getTime())) published_date = d.toISOString();
|
|
42
|
+
}
|
|
43
|
+
results.push({
|
|
44
|
+
title,
|
|
45
|
+
url: id,
|
|
46
|
+
snippet: summary.slice(0, SNIPPET_LIMIT),
|
|
47
|
+
relevance_score: 1 - i / Math.max(total, 1),
|
|
48
|
+
engine: "arxiv",
|
|
49
|
+
...published_date ? { published_date } : {}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function applyDateFilter(results, options) {
|
|
56
|
+
if (!options.fromDate && !options.toDate) return results;
|
|
57
|
+
const from = options.fromDate ? new Date(options.fromDate).getTime() : -Infinity;
|
|
58
|
+
const to = options.toDate ? new Date(options.toDate).getTime() : Infinity;
|
|
59
|
+
if (isNaN(from) || isNaN(to)) return results;
|
|
60
|
+
return results.filter((r) => {
|
|
61
|
+
if (!r.published_date) return false;
|
|
62
|
+
const t = new Date(r.published_date).getTime();
|
|
63
|
+
if (isNaN(t)) return false;
|
|
64
|
+
return t >= from && t <= to;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
ArxivEngine
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=arxiv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/search/engines/arxiv.ts"],"sourcesContent":["import { parseHTML } from 'linkedom';\nimport type { SearchEngine, SearchEngineOptions, RawSearchResult } from '../../types.js';\nimport { createLogger } from '../../logger.js';\n\nconst log = createLogger('search');\n\nconst SNIPPET_LIMIT = 200;\n\nfunction textContent(el: Element | null): string {\n return (el?.textContent ?? '').replace(/\\s+/g, ' ').trim();\n}\n\nexport class ArxivEngine implements SearchEngine {\n name = 'arxiv';\n\n async search(query: string, options: SearchEngineOptions = {}): Promise<RawSearchResult[]> {\n const timeoutMs = options.timeoutMs ?? 10000;\n const maxResults = options.maxResults ?? 10;\n\n const params = new URLSearchParams({\n search_query: `all:${query}`,\n max_results: String(maxResults),\n sortBy: 'relevance',\n });\n const url = `http://export.arxiv.org/api/query?${params}`;\n log.debug('arxiv search', { query });\n\n const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });\n if (!response.ok) throw new Error(`arXiv returned ${response.status}`);\n\n const xml = await response.text();\n const mapped = this.parseAtom(xml);\n return applyDateFilter(mapped, options);\n }\n\n private parseAtom(xml: string): RawSearchResult[] {\n const { document } = parseHTML(xml);\n const entries = Array.from(document.querySelectorAll('entry'));\n const results: RawSearchResult[] = [];\n const total = entries.length;\n\n for (let i = 0; i < total; i++) {\n const entry = entries[i];\n const id = textContent(entry.querySelector('id'));\n const title = textContent(entry.querySelector('title'));\n const summary = textContent(entry.querySelector('summary'));\n const published = textContent(entry.querySelector('published'));\n if (!id || !title) continue;\n\n let published_date: string | undefined;\n if (published) {\n const d = new Date(published);\n if (!isNaN(d.getTime())) published_date = d.toISOString();\n }\n\n results.push({\n title,\n url: id,\n snippet: summary.slice(0, SNIPPET_LIMIT),\n relevance_score: 1 - i / Math.max(total, 1),\n engine: 'arxiv',\n ...(published_date ? { published_date } : {}),\n });\n }\n\n return results;\n }\n}\n\nfunction applyDateFilter(results: RawSearchResult[], options: SearchEngineOptions): RawSearchResult[] {\n if (!options.fromDate && !options.toDate) return results;\n const from = options.fromDate ? new Date(options.fromDate).getTime() : -Infinity;\n const to = options.toDate ? new Date(options.toDate).getTime() : Infinity;\n if (isNaN(from) || isNaN(to)) return results;\n return results.filter((r) => {\n if (!r.published_date) return false;\n const t = new Date(r.published_date).getTime();\n if (isNaN(t)) return false;\n return t >= from && t <= to;\n });\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAE1B,SAAS,oBAAoB;AAE7B,MAAM,MAAM,aAAa,QAAQ;AAEjC,MAAM,gBAAgB;AAEtB,SAAS,YAAY,IAA4B;AAC/C,UAAQ,IAAI,eAAe,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC3D;AAEO,MAAM,YAAoC;AAAA,EAC/C,OAAO;AAAA,EAEP,MAAM,OAAO,OAAe,UAA+B,CAAC,GAA+B;AACzF,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,aAAa,QAAQ,cAAc;AAEzC,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,cAAc,OAAO,KAAK;AAAA,MAC1B,aAAa,OAAO,UAAU;AAAA,MAC9B,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,MAAM,qCAAqC,MAAM;AACvD,QAAI,MAAM,gBAAgB,EAAE,MAAM,CAAC;AAEnC,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,YAAY,QAAQ,SAAS,EAAE,CAAC;AAC5E,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,kBAAkB,SAAS,MAAM,EAAE;AAErE,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,UAAM,SAAS,KAAK,UAAU,GAAG;AACjC,WAAO,gBAAgB,QAAQ,OAAO;AAAA,EACxC;AAAA,EAEQ,UAAU,KAAgC;AAChD,UAAM,EAAE,SAAS,IAAI,UAAU,GAAG;AAClC,UAAM,UAAU,MAAM,KAAK,SAAS,iBAAiB,OAAO,CAAC;AAC7D,UAAM,UAA6B,CAAC;AACpC,UAAM,QAAQ,QAAQ;AAEtB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,QAAQ,QAAQ,CAAC;AACvB,YAAM,KAAK,YAAY,MAAM,cAAc,IAAI,CAAC;AAChD,YAAM,QAAQ,YAAY,MAAM,cAAc,OAAO,CAAC;AACtD,YAAM,UAAU,YAAY,MAAM,cAAc,SAAS,CAAC;AAC1D,YAAM,YAAY,YAAY,MAAM,cAAc,WAAW,CAAC;AAC9D,UAAI,CAAC,MAAM,CAAC,MAAO;AAEnB,UAAI;AACJ,UAAI,WAAW;AACb,cAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,YAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAG,kBAAiB,EAAE,YAAY;AAAA,MAC1D;AAEA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,KAAK;AAAA,QACL,SAAS,QAAQ,MAAM,GAAG,aAAa;AAAA,QACvC,iBAAiB,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC;AAAA,QAC1C,QAAQ;AAAA,QACR,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAA4B,SAAiD;AACpG,MAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,OAAQ,QAAO;AACjD,QAAM,OAAO,QAAQ,WAAW,IAAI,KAAK,QAAQ,QAAQ,EAAE,QAAQ,IAAI;AACvE,QAAM,KAAK,QAAQ,SAAS,IAAI,KAAK,QAAQ,MAAM,EAAE,QAAQ,IAAI;AACjE,MAAI,MAAM,IAAI,KAAK,MAAM,EAAE,EAAG,QAAO;AACrC,SAAO,QAAQ,OAAO,CAAC,MAAM;AAC3B,QAAI,CAAC,EAAE,eAAgB,QAAO;AAC9B,UAAM,IAAI,IAAI,KAAK,EAAE,cAAc,EAAE,QAAQ;AAC7C,QAAI,MAAM,CAAC,EAAG,QAAO;AACrB,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SearchEngine, SearchEngineOptions, RawSearchResult } from '../../types.js';
|
|
2
|
+
export declare class BingNewsEngine implements SearchEngine {
|
|
3
|
+
name: string;
|
|
4
|
+
search(query: string, options?: SearchEngineOptions): Promise<RawSearchResult[]>;
|
|
5
|
+
parseResults(html: string, maxResults: number): RawSearchResult[];
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=bing-news.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bing-news.d.ts","sourceRoot":"","sources":["../../../src/search/engines/bing-news.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAsDzF,qBAAa,cAAe,YAAW,YAAY;IACjD,IAAI,SAAe;IAEb,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA2B1F,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE;CAwClE"}
|