@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
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface BranchOptions {
|
|
2
|
+
maxConcurrent?: number;
|
|
3
|
+
totalBudgetMs?: number;
|
|
4
|
+
perQueryBudgetMs?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface BranchResult<T> {
|
|
7
|
+
query: string;
|
|
8
|
+
ok: boolean;
|
|
9
|
+
result?: T;
|
|
10
|
+
error?: string;
|
|
11
|
+
timedOut?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function exploreInParallel<T>(queries: string[], executor: (q: string, signal: AbortSignal) => Promise<T>, options?: BranchOptions): Promise<BranchResult<T>[]>;
|
|
14
|
+
//# sourceMappingURL=branch-exploration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-exploration.d.ts","sourceRoot":"","sources":["../../src/research/branch-exploration.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACxD,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CA2D5B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createLogger } from "../logger.js";
|
|
2
|
+
const log = createLogger("research");
|
|
3
|
+
const DEFAULT_MAX_CONCURRENT = 3;
|
|
4
|
+
const DEFAULT_TOTAL_BUDGET_MS = 3e4;
|
|
5
|
+
const DEFAULT_PER_QUERY_BUDGET_MS = 1e4;
|
|
6
|
+
async function exploreInParallel(queries, executor, options = {}) {
|
|
7
|
+
if (queries.length === 0) return [];
|
|
8
|
+
const maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;
|
|
9
|
+
const totalBudgetMs = options.totalBudgetMs ?? DEFAULT_TOTAL_BUDGET_MS;
|
|
10
|
+
const perQueryBudgetMs = options.perQueryBudgetMs ?? DEFAULT_PER_QUERY_BUDGET_MS;
|
|
11
|
+
const results = new Array(queries.length);
|
|
12
|
+
let totalExceeded = false;
|
|
13
|
+
const inFlightControllers = /* @__PURE__ */ new Set();
|
|
14
|
+
const totalTimer = setTimeout(() => {
|
|
15
|
+
totalExceeded = true;
|
|
16
|
+
for (const c of inFlightControllers) c.abort();
|
|
17
|
+
}, totalBudgetMs);
|
|
18
|
+
try {
|
|
19
|
+
for (let chunkStart = 0; chunkStart < queries.length; chunkStart += maxConcurrent) {
|
|
20
|
+
const chunk = [];
|
|
21
|
+
for (let j = chunkStart; j < Math.min(chunkStart + maxConcurrent, queries.length); j++) {
|
|
22
|
+
chunk.push(j);
|
|
23
|
+
}
|
|
24
|
+
if (totalExceeded) {
|
|
25
|
+
for (const idx of chunk) {
|
|
26
|
+
results[idx] = {
|
|
27
|
+
query: queries[idx],
|
|
28
|
+
ok: false,
|
|
29
|
+
error: "total budget exceeded",
|
|
30
|
+
timedOut: true
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const settled = await Promise.allSettled(
|
|
36
|
+
chunk.map(
|
|
37
|
+
(idx) => runOne(queries[idx], executor, perQueryBudgetMs, inFlightControllers, () => totalExceeded)
|
|
38
|
+
)
|
|
39
|
+
);
|
|
40
|
+
for (let k = 0; k < chunk.length; k++) {
|
|
41
|
+
const idx = chunk[k];
|
|
42
|
+
const s = settled[k];
|
|
43
|
+
if (s.status === "fulfilled") {
|
|
44
|
+
results[idx] = s.value;
|
|
45
|
+
} else {
|
|
46
|
+
results[idx] = {
|
|
47
|
+
query: queries[idx],
|
|
48
|
+
ok: false,
|
|
49
|
+
error: errorMessage(s.reason)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
} finally {
|
|
55
|
+
clearTimeout(totalTimer);
|
|
56
|
+
}
|
|
57
|
+
return results;
|
|
58
|
+
}
|
|
59
|
+
async function runOne(query, executor, perQueryBudgetMs, inFlight, isTotalExceeded) {
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
inFlight.add(controller);
|
|
62
|
+
let timedOut = false;
|
|
63
|
+
const timer = setTimeout(() => {
|
|
64
|
+
timedOut = true;
|
|
65
|
+
controller.abort();
|
|
66
|
+
}, perQueryBudgetMs);
|
|
67
|
+
try {
|
|
68
|
+
const result = await executor(query, controller.signal);
|
|
69
|
+
return { query, ok: true, result };
|
|
70
|
+
} catch (err) {
|
|
71
|
+
if (isTotalExceeded()) {
|
|
72
|
+
return {
|
|
73
|
+
query,
|
|
74
|
+
ok: false,
|
|
75
|
+
error: "total budget exceeded",
|
|
76
|
+
timedOut: true
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (timedOut) {
|
|
80
|
+
return {
|
|
81
|
+
query,
|
|
82
|
+
ok: false,
|
|
83
|
+
error: `per-query budget ${perQueryBudgetMs}ms exceeded`,
|
|
84
|
+
timedOut: true
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
log.debug("branch executor failed", { query, error: errorMessage(err) });
|
|
88
|
+
return { query, ok: false, error: errorMessage(err) };
|
|
89
|
+
} finally {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
inFlight.delete(controller);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function errorMessage(err) {
|
|
95
|
+
return err instanceof Error ? err.message : String(err);
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
exploreInParallel
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=branch-exploration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/research/branch-exploration.ts"],"sourcesContent":["import { createLogger } from '../logger.js';\n\nconst log = createLogger('research');\n\nexport interface BranchOptions {\n maxConcurrent?: number;\n totalBudgetMs?: number;\n perQueryBudgetMs?: number;\n}\n\nexport interface BranchResult<T> {\n query: string;\n ok: boolean;\n result?: T;\n error?: string;\n timedOut?: boolean;\n}\n\nconst DEFAULT_MAX_CONCURRENT = 3;\nconst DEFAULT_TOTAL_BUDGET_MS = 30_000;\nconst DEFAULT_PER_QUERY_BUDGET_MS = 10_000;\n\nexport async function exploreInParallel<T>(\n queries: string[],\n executor: (q: string, signal: AbortSignal) => Promise<T>,\n options: BranchOptions = {},\n): Promise<BranchResult<T>[]> {\n if (queries.length === 0) return [];\n\n const maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n const totalBudgetMs = options.totalBudgetMs ?? DEFAULT_TOTAL_BUDGET_MS;\n const perQueryBudgetMs = options.perQueryBudgetMs ?? DEFAULT_PER_QUERY_BUDGET_MS;\n\n const results: BranchResult<T>[] = new Array(queries.length);\n let totalExceeded = false;\n const inFlightControllers = new Set<AbortController>();\n\n const totalTimer = setTimeout(() => {\n totalExceeded = true;\n for (const c of inFlightControllers) c.abort();\n }, totalBudgetMs);\n\n try {\n for (let chunkStart = 0; chunkStart < queries.length; chunkStart += maxConcurrent) {\n const chunk: number[] = [];\n for (let j = chunkStart; j < Math.min(chunkStart + maxConcurrent, queries.length); j++) {\n chunk.push(j);\n }\n\n if (totalExceeded) {\n for (const idx of chunk) {\n results[idx] = {\n query: queries[idx],\n ok: false,\n error: 'total budget exceeded',\n timedOut: true,\n };\n }\n continue;\n }\n\n const settled = await Promise.allSettled(\n chunk.map((idx) =>\n runOne(queries[idx], executor, perQueryBudgetMs, inFlightControllers, () => totalExceeded),\n ),\n );\n for (let k = 0; k < chunk.length; k++) {\n const idx = chunk[k];\n const s = settled[k];\n if (s.status === 'fulfilled') {\n results[idx] = s.value;\n } else {\n results[idx] = {\n query: queries[idx],\n ok: false,\n error: errorMessage(s.reason),\n };\n }\n }\n }\n } finally {\n clearTimeout(totalTimer);\n }\n\n return results;\n}\n\nasync function runOne<T>(\n query: string,\n executor: (q: string, signal: AbortSignal) => Promise<T>,\n perQueryBudgetMs: number,\n inFlight: Set<AbortController>,\n isTotalExceeded: () => boolean,\n): Promise<BranchResult<T>> {\n const controller = new AbortController();\n inFlight.add(controller);\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, perQueryBudgetMs);\n\n try {\n const result = await executor(query, controller.signal);\n return { query, ok: true, result };\n } catch (err) {\n if (isTotalExceeded()) {\n return {\n query,\n ok: false,\n error: 'total budget exceeded',\n timedOut: true,\n };\n }\n if (timedOut) {\n return {\n query,\n ok: false,\n error: `per-query budget ${perQueryBudgetMs}ms exceeded`,\n timedOut: true,\n };\n }\n log.debug('branch executor failed', { query, error: errorMessage(err) });\n return { query, ok: false, error: errorMessage(err) };\n } finally {\n clearTimeout(timer);\n inFlight.delete(controller);\n }\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,MAAM,MAAM,aAAa,UAAU;AAgBnC,MAAM,yBAAyB;AAC/B,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AAEpC,eAAsB,kBACpB,SACA,UACA,UAAyB,CAAC,GACE;AAC5B,MAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAElC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,mBAAmB,QAAQ,oBAAoB;AAErD,QAAM,UAA6B,IAAI,MAAM,QAAQ,MAAM;AAC3D,MAAI,gBAAgB;AACpB,QAAM,sBAAsB,oBAAI,IAAqB;AAErD,QAAM,aAAa,WAAW,MAAM;AAClC,oBAAgB;AAChB,eAAW,KAAK,oBAAqB,GAAE,MAAM;AAAA,EAC/C,GAAG,aAAa;AAEhB,MAAI;AACF,aAAS,aAAa,GAAG,aAAa,QAAQ,QAAQ,cAAc,eAAe;AACjF,YAAM,QAAkB,CAAC;AACzB,eAAS,IAAI,YAAY,IAAI,KAAK,IAAI,aAAa,eAAe,QAAQ,MAAM,GAAG,KAAK;AACtF,cAAM,KAAK,CAAC;AAAA,MACd;AAEA,UAAI,eAAe;AACjB,mBAAW,OAAO,OAAO;AACvB,kBAAQ,GAAG,IAAI;AAAA,YACb,OAAO,QAAQ,GAAG;AAAA,YAClB,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,MAAM;AAAA,UAAI,CAAC,QACT,OAAO,QAAQ,GAAG,GAAG,UAAU,kBAAkB,qBAAqB,MAAM,aAAa;AAAA,QAC3F;AAAA,MACF;AACA,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,MAAM,MAAM,CAAC;AACnB,cAAM,IAAI,QAAQ,CAAC;AACnB,YAAI,EAAE,WAAW,aAAa;AAC5B,kBAAQ,GAAG,IAAI,EAAE;AAAA,QACnB,OAAO;AACL,kBAAQ,GAAG,IAAI;AAAA,YACb,OAAO,QAAQ,GAAG;AAAA,YAClB,IAAI;AAAA,YACJ,OAAO,aAAa,EAAE,MAAM;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,iBAAa,UAAU;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,eAAe,OACb,OACA,UACA,kBACA,UACA,iBAC0B;AAC1B,QAAM,aAAa,IAAI,gBAAgB;AACvC,WAAS,IAAI,UAAU;AACvB,MAAI,WAAW;AACf,QAAM,QAAQ,WAAW,MAAM;AAC7B,eAAW;AACX,eAAW,MAAM;AAAA,EACnB,GAAG,gBAAgB;AAEnB,MAAI;AACF,UAAM,SAAS,MAAM,SAAS,OAAO,WAAW,MAAM;AACtD,WAAO,EAAE,OAAO,IAAI,MAAM,OAAO;AAAA,EACnC,SAAS,KAAK;AACZ,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,QACL;AAAA,QACA,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL;AAAA,QACA,IAAI;AAAA,QACJ,OAAO,oBAAoB,gBAAgB;AAAA,QAC3C,UAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,MAAM,0BAA0B,EAAE,OAAO,OAAO,aAAa,GAAG,EAAE,CAAC;AACvE,WAAO,EAAE,OAAO,IAAI,OAAO,OAAO,aAAa,GAAG,EAAE;AAAA,EACtD,UAAE;AACA,iBAAa,KAAK;AAClB,aAAS,OAAO,UAAU;AAAA,EAC5B;AACF;AAEA,SAAS,aAAa,KAAsB;AAC1C,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ResearchBrief, ResearchSource, CrossReference } from '../types.js';
|
|
2
|
+
import type { QueryType } from './decompose.js';
|
|
3
|
+
export declare function buildResearchBrief(question: string, sources: ResearchSource[], subQueries: string[], perSourceCharCap: number, totalSourcesCharCap: number, queryType?: QueryType, comparisonEntities?: string[], synthesisText?: string): Promise<ResearchBrief>;
|
|
4
|
+
export declare function detectCrossReferences(sources: ResearchSource[]): CrossReference[];
|
|
5
|
+
export declare function stripMarkdownLinks(text: string): string;
|
|
6
|
+
//# sourceMappingURL=brief.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../src/research/brief.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAoB,cAAc,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAahD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,EAAE,MAAM,EAAE,EACpB,gBAAgB,EAAE,MAAM,EACxB,mBAAmB,EAAE,MAAM,EAC3B,SAAS,GAAE,SAAqB,EAChC,kBAAkB,GAAE,MAAM,EAAO,EACjC,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,aAAa,CAAC,CAgDxB;AA6BD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAuCjF;AA6FD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { extractHighlights } from "../search/highlights.js";
|
|
2
|
+
import { buildCitationGraph } from "./citation-graph.js";
|
|
3
|
+
const MAX_HIGHLIGHTS = 12;
|
|
4
|
+
const MAX_KEY_FINDING_LEN = 280;
|
|
5
|
+
const MAX_TOPICS = 8;
|
|
6
|
+
const MAX_CROSS_REFS = 10;
|
|
7
|
+
const MIN_PHRASE_LEN = 4;
|
|
8
|
+
async function buildResearchBrief(question, sources, subQueries, perSourceCharCap, totalSourcesCharCap, queryType = "general", comparisonEntities = [], synthesisText) {
|
|
9
|
+
const fetched = sources.filter((s) => s.fetched && s.markdown_content.length > 0);
|
|
10
|
+
const searchItems = fetched.map((s) => ({
|
|
11
|
+
title: s.title,
|
|
12
|
+
url: s.url,
|
|
13
|
+
snippet: s.markdown_content.slice(0, 200),
|
|
14
|
+
markdown_content: s.markdown_content,
|
|
15
|
+
relevance_score: s.relevance_score
|
|
16
|
+
}));
|
|
17
|
+
const { highlights } = await extractHighlights(question, searchItems, MAX_HIGHLIGHTS);
|
|
18
|
+
const topics = buildTopics(subQueries, fetched);
|
|
19
|
+
const keyFindings = buildKeyFindings(fetched);
|
|
20
|
+
const crossReferences = detectCrossReferences(fetched);
|
|
21
|
+
const gaps = detectGaps(subQueries, fetched);
|
|
22
|
+
const comparison = queryType === "comparison" && comparisonEntities.length >= 2 ? buildComparisonSection(comparisonEntities, fetched) : void 0;
|
|
23
|
+
const citationGraph = synthesisText && synthesisText.trim().length > 0 && fetched.length > 0 ? buildCitationGraph(
|
|
24
|
+
synthesisText,
|
|
25
|
+
fetched.map((s) => ({ url: s.url, title: s.title, markdown: s.markdown_content }))
|
|
26
|
+
) : void 0;
|
|
27
|
+
return {
|
|
28
|
+
topics,
|
|
29
|
+
highlights,
|
|
30
|
+
key_findings: keyFindings,
|
|
31
|
+
per_source_char_cap: perSourceCharCap,
|
|
32
|
+
total_sources_char_cap: totalSourcesCharCap,
|
|
33
|
+
sections: {
|
|
34
|
+
overview: {
|
|
35
|
+
key_findings: keyFindings.slice(0, 5),
|
|
36
|
+
cross_references: crossReferences
|
|
37
|
+
},
|
|
38
|
+
...comparison ? { comparison } : {},
|
|
39
|
+
gaps
|
|
40
|
+
},
|
|
41
|
+
query_type: queryType,
|
|
42
|
+
...citationGraph && citationGraph.length > 0 ? { citation_graph: citationGraph } : {}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function buildTopics(subQueries, sources) {
|
|
46
|
+
if (subQueries.length > 0) {
|
|
47
|
+
return dedupe(subQueries).slice(0, MAX_TOPICS);
|
|
48
|
+
}
|
|
49
|
+
const labels = sources.map((s) => s.title.split(/[–|:·-]/)[0].trim()).filter((t) => t.length >= 5 && t.length <= 100);
|
|
50
|
+
return dedupe(labels).slice(0, MAX_TOPICS);
|
|
51
|
+
}
|
|
52
|
+
function buildKeyFindings(sources) {
|
|
53
|
+
const out = [];
|
|
54
|
+
for (const s of [...sources].sort((a, b) => b.relevance_score - a.relevance_score)) {
|
|
55
|
+
const first = firstSubstantiveParagraph(s.markdown_content);
|
|
56
|
+
if (!first) continue;
|
|
57
|
+
const trimmed = first.length > MAX_KEY_FINDING_LEN ? first.slice(0, MAX_KEY_FINDING_LEN - 1).trimEnd() + "\u2026" : first;
|
|
58
|
+
out.push(trimmed);
|
|
59
|
+
}
|
|
60
|
+
return dedupe(out);
|
|
61
|
+
}
|
|
62
|
+
function detectCrossReferences(sources) {
|
|
63
|
+
if (sources.length < 2) return [];
|
|
64
|
+
const phraseMap = /* @__PURE__ */ new Map();
|
|
65
|
+
for (let idx = 0; idx < sources.length; idx++) {
|
|
66
|
+
const content = sources[idx].markdown_content.toLowerCase();
|
|
67
|
+
const words = content.replace(/[^a-z0-9\s]/g, " ").split(/\s+/).filter((w) => w.length >= MIN_PHRASE_LEN && !STOP_WORDS.has(w));
|
|
68
|
+
const seenForSource = /* @__PURE__ */ new Set();
|
|
69
|
+
for (let i = 0; i < words.length - 2; i++) {
|
|
70
|
+
const phrase = words.slice(i, i + 3).join(" ");
|
|
71
|
+
if (seenForSource.has(phrase)) continue;
|
|
72
|
+
seenForSource.add(phrase);
|
|
73
|
+
if (!phraseMap.has(phrase)) phraseMap.set(phrase, /* @__PURE__ */ new Set());
|
|
74
|
+
phraseMap.get(phrase).add(idx);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const candidates = [];
|
|
78
|
+
for (const [phrase, sourceIndices] of phraseMap) {
|
|
79
|
+
if (sourceIndices.size >= 2) {
|
|
80
|
+
candidates.push({
|
|
81
|
+
finding: phrase,
|
|
82
|
+
source_indices: [...sourceIndices].sort(),
|
|
83
|
+
confidence: sourceIndices.size >= 3 ? "high" : "medium"
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
candidates.sort((a, b) => b.source_indices.length - a.source_indices.length);
|
|
88
|
+
return deduplicateOverlapping(candidates).slice(0, MAX_CROSS_REFS);
|
|
89
|
+
}
|
|
90
|
+
function deduplicateOverlapping(refs) {
|
|
91
|
+
const kept = [];
|
|
92
|
+
const usedWords = /* @__PURE__ */ new Set();
|
|
93
|
+
for (const ref of refs) {
|
|
94
|
+
const words = ref.finding.split(" ");
|
|
95
|
+
const overlapCount = words.filter((w) => usedWords.has(w)).length;
|
|
96
|
+
if (overlapCount >= words.length - 1 && kept.length > 0) continue;
|
|
97
|
+
kept.push(ref);
|
|
98
|
+
for (const w of words) usedWords.add(w);
|
|
99
|
+
}
|
|
100
|
+
return kept;
|
|
101
|
+
}
|
|
102
|
+
function detectGaps(subQueries, sources) {
|
|
103
|
+
if (subQueries.length === 0) return [];
|
|
104
|
+
const gaps = [];
|
|
105
|
+
const contentLower = sources.map((s) => s.markdown_content.toLowerCase()).join(" ");
|
|
106
|
+
for (const query of subQueries) {
|
|
107
|
+
const words = query.toLowerCase().replace(/[^a-z0-9\s]/g, " ").split(/\s+/).filter((w) => w.length >= MIN_PHRASE_LEN && !STOP_WORDS.has(w));
|
|
108
|
+
if (words.length === 0) continue;
|
|
109
|
+
const found = words.filter((w) => contentLower.includes(w)).length;
|
|
110
|
+
const coverage = found / words.length;
|
|
111
|
+
if (coverage < 0.5) {
|
|
112
|
+
gaps.push(`Limited coverage for: "${query}"`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return gaps;
|
|
116
|
+
}
|
|
117
|
+
function buildComparisonSection(entities, sources) {
|
|
118
|
+
const comparisonPoints = [];
|
|
119
|
+
const contentLower = sources.map((s) => s.markdown_content.toLowerCase()).join("\n");
|
|
120
|
+
const comparisonTerms = [
|
|
121
|
+
"faster",
|
|
122
|
+
"slower",
|
|
123
|
+
"better",
|
|
124
|
+
"worse",
|
|
125
|
+
"more",
|
|
126
|
+
"less",
|
|
127
|
+
"easier",
|
|
128
|
+
"harder",
|
|
129
|
+
"simpler",
|
|
130
|
+
"complex",
|
|
131
|
+
"lightweight",
|
|
132
|
+
"heavy",
|
|
133
|
+
"performance",
|
|
134
|
+
"scalability",
|
|
135
|
+
"ecosystem",
|
|
136
|
+
"community",
|
|
137
|
+
"support"
|
|
138
|
+
];
|
|
139
|
+
for (const term of comparisonTerms) {
|
|
140
|
+
if (!contentLower.includes(term)) continue;
|
|
141
|
+
const nearEntity = entities.some((e) => {
|
|
142
|
+
const entityLower = e.toLowerCase();
|
|
143
|
+
const idx = contentLower.indexOf(entityLower);
|
|
144
|
+
if (idx === -1) return false;
|
|
145
|
+
const neighborhood = contentLower.slice(Math.max(0, idx - 200), idx + e.length + 200);
|
|
146
|
+
return neighborhood.includes(term);
|
|
147
|
+
});
|
|
148
|
+
if (nearEntity) {
|
|
149
|
+
comparisonPoints.push(term);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { entities, comparison_points: [...new Set(comparisonPoints)] };
|
|
153
|
+
}
|
|
154
|
+
function firstSubstantiveParagraph(markdown) {
|
|
155
|
+
const paragraphs = markdown.split(/\n\n+/).map((p) => p.trim());
|
|
156
|
+
for (const p of paragraphs) {
|
|
157
|
+
if (p.length < 80) continue;
|
|
158
|
+
if (p.startsWith("#") || p.startsWith("|") || p.startsWith("```")) continue;
|
|
159
|
+
const cleaned = stripMarkdownLinks(p);
|
|
160
|
+
if (cleaned.length < 80) continue;
|
|
161
|
+
return cleaned.replace(/\s+/g, " ");
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
function stripMarkdownLinks(text) {
|
|
166
|
+
return text.replace(/!\[[^\]]*\]\([^)]*\)/g, "").replace(/\[!\[[^\]]*\]\([^)]*\)\]\([^)]*\)/g, "").replace(/\[([^\]]+)\]\([^)]*\)/g, "$1").replace(/<https?:\/\/[^>]+>/g, "").trim();
|
|
167
|
+
}
|
|
168
|
+
function dedupe(list) {
|
|
169
|
+
const seen = /* @__PURE__ */ new Set();
|
|
170
|
+
const out = [];
|
|
171
|
+
for (const item of list) {
|
|
172
|
+
const key = item.toLowerCase();
|
|
173
|
+
if (seen.has(key)) continue;
|
|
174
|
+
seen.add(key);
|
|
175
|
+
out.push(item);
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
const STOP_WORDS = /* @__PURE__ */ new Set([
|
|
180
|
+
"about",
|
|
181
|
+
"after",
|
|
182
|
+
"also",
|
|
183
|
+
"been",
|
|
184
|
+
"before",
|
|
185
|
+
"being",
|
|
186
|
+
"between",
|
|
187
|
+
"both",
|
|
188
|
+
"could",
|
|
189
|
+
"does",
|
|
190
|
+
"doing",
|
|
191
|
+
"done",
|
|
192
|
+
"each",
|
|
193
|
+
"even",
|
|
194
|
+
"every",
|
|
195
|
+
"from",
|
|
196
|
+
"have",
|
|
197
|
+
"here",
|
|
198
|
+
"into",
|
|
199
|
+
"just",
|
|
200
|
+
"like",
|
|
201
|
+
"made",
|
|
202
|
+
"make",
|
|
203
|
+
"many",
|
|
204
|
+
"more",
|
|
205
|
+
"most",
|
|
206
|
+
"much",
|
|
207
|
+
"must",
|
|
208
|
+
"need",
|
|
209
|
+
"only",
|
|
210
|
+
"other",
|
|
211
|
+
"over",
|
|
212
|
+
"same",
|
|
213
|
+
"should",
|
|
214
|
+
"some",
|
|
215
|
+
"such",
|
|
216
|
+
"than",
|
|
217
|
+
"that",
|
|
218
|
+
"their",
|
|
219
|
+
"them",
|
|
220
|
+
"then",
|
|
221
|
+
"there",
|
|
222
|
+
"these",
|
|
223
|
+
"they",
|
|
224
|
+
"this",
|
|
225
|
+
"those",
|
|
226
|
+
"through",
|
|
227
|
+
"very",
|
|
228
|
+
"want",
|
|
229
|
+
"well",
|
|
230
|
+
"were",
|
|
231
|
+
"what",
|
|
232
|
+
"when",
|
|
233
|
+
"where",
|
|
234
|
+
"which",
|
|
235
|
+
"while",
|
|
236
|
+
"will",
|
|
237
|
+
"with",
|
|
238
|
+
"would",
|
|
239
|
+
"your"
|
|
240
|
+
]);
|
|
241
|
+
export {
|
|
242
|
+
buildResearchBrief,
|
|
243
|
+
detectCrossReferences,
|
|
244
|
+
stripMarkdownLinks
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/research/brief.ts"],"sourcesContent":["import type { ResearchBrief, ResearchSource, SearchResultItem, CrossReference } from '../types.js';\nimport type { QueryType } from './decompose.js';\nimport { extractHighlights } from '../search/highlights.js';\nimport { buildCitationGraph } from './citation-graph.js';\n\nconst MAX_HIGHLIGHTS = 12;\nconst MAX_KEY_FINDING_LEN = 280;\nconst MAX_TOPICS = 8;\nconst MAX_CROSS_REFS = 10;\nconst MIN_PHRASE_LEN = 4;\n\n// Build a host-LLM-friendly structured brief when internal sampling is\n// unavailable. The host model (Claude Code / Cursor / etc.) consumes this\n// shape to produce the final report without needing to re-read raw sources.\nexport async function buildResearchBrief(\n question: string,\n sources: ResearchSource[],\n subQueries: string[],\n perSourceCharCap: number,\n totalSourcesCharCap: number,\n queryType: QueryType = 'general',\n comparisonEntities: string[] = [],\n synthesisText?: string,\n): Promise<ResearchBrief> {\n const fetched = sources.filter((s) => s.fetched && s.markdown_content.length > 0);\n\n // Highlights reuse the ONNX-reranker-or-paragraph scorer so briefs align with\n // whatever format='highlights' produces for single-query searches.\n const searchItems: SearchResultItem[] = fetched.map((s) => ({\n title: s.title,\n url: s.url,\n snippet: s.markdown_content.slice(0, 200),\n markdown_content: s.markdown_content,\n relevance_score: s.relevance_score,\n }));\n\n const { highlights } = await extractHighlights(question, searchItems, MAX_HIGHLIGHTS);\n\n const topics = buildTopics(subQueries, fetched);\n const keyFindings = buildKeyFindings(fetched);\n const crossReferences = detectCrossReferences(fetched);\n const gaps = detectGaps(subQueries, fetched);\n\n const comparison = queryType === 'comparison' && comparisonEntities.length >= 2\n ? buildComparisonSection(comparisonEntities, fetched)\n : undefined;\n\n const citationGraph = synthesisText && synthesisText.trim().length > 0 && fetched.length > 0\n ? buildCitationGraph(\n synthesisText,\n fetched.map((s) => ({ url: s.url, title: s.title, markdown: s.markdown_content })),\n )\n : undefined;\n\n return {\n topics,\n highlights,\n key_findings: keyFindings,\n per_source_char_cap: perSourceCharCap,\n total_sources_char_cap: totalSourcesCharCap,\n sections: {\n overview: {\n key_findings: keyFindings.slice(0, 5),\n cross_references: crossReferences,\n },\n ...(comparison ? { comparison } : {}),\n gaps,\n },\n query_type: queryType,\n ...(citationGraph && citationGraph.length > 0 ? { citation_graph: citationGraph } : {}),\n };\n}\n\n// Prefer sub-queries (planner's view of the topic space) when available;\n// otherwise derive compact topic labels from source titles.\nfunction buildTopics(subQueries: string[], sources: ResearchSource[]): string[] {\n if (subQueries.length > 0) {\n return dedupe(subQueries).slice(0, MAX_TOPICS);\n }\n const labels = sources\n .map((s) => s.title.split(/[–|:·-]/)[0].trim())\n .filter((t) => t.length >= 5 && t.length <= 100);\n return dedupe(labels).slice(0, MAX_TOPICS);\n}\n\n// First substantive paragraph per source, trimmed to a finding-sized blurb.\n// Ordered by source relevance so the most-weighted finding is first.\nfunction buildKeyFindings(sources: ResearchSource[]): string[] {\n const out: string[] = [];\n for (const s of [...sources].sort((a, b) => b.relevance_score - a.relevance_score)) {\n const first = firstSubstantiveParagraph(s.markdown_content);\n if (!first) continue;\n const trimmed = first.length > MAX_KEY_FINDING_LEN\n ? first.slice(0, MAX_KEY_FINDING_LEN - 1).trimEnd() + '…'\n : first;\n out.push(trimmed);\n }\n return dedupe(out);\n}\n\nexport function detectCrossReferences(sources: ResearchSource[]): CrossReference[] {\n if (sources.length < 2) return [];\n\n // Extract significant phrases from each source's content\n const phraseMap = new Map<string, Set<number>>();\n\n for (let idx = 0; idx < sources.length; idx++) {\n const content = sources[idx].markdown_content.toLowerCase();\n const words = content\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length >= MIN_PHRASE_LEN && !STOP_WORDS.has(w));\n\n const seenForSource = new Set<string>();\n for (let i = 0; i < words.length - 2; i++) {\n const phrase = words.slice(i, i + 3).join(' ');\n if (seenForSource.has(phrase)) continue;\n seenForSource.add(phrase);\n\n if (!phraseMap.has(phrase)) phraseMap.set(phrase, new Set());\n phraseMap.get(phrase)!.add(idx);\n }\n }\n\n // Phrases found in 2+ sources are cross-references\n const candidates: CrossReference[] = [];\n for (const [phrase, sourceIndices] of phraseMap) {\n if (sourceIndices.size >= 2) {\n candidates.push({\n finding: phrase,\n source_indices: [...sourceIndices].sort(),\n confidence: sourceIndices.size >= 3 ? 'high' : 'medium',\n });\n }\n }\n\n // Sort by number of sources (desc), then deduplicate overlapping phrases\n candidates.sort((a, b) => b.source_indices.length - a.source_indices.length);\n return deduplicateOverlapping(candidates).slice(0, MAX_CROSS_REFS);\n}\n\nfunction deduplicateOverlapping(refs: CrossReference[]): CrossReference[] {\n const kept: CrossReference[] = [];\n const usedWords = new Set<string>();\n\n for (const ref of refs) {\n const words = ref.finding.split(' ');\n // Skip if most words already covered by a higher-ranked cross-reference\n const overlapCount = words.filter((w) => usedWords.has(w)).length;\n if (overlapCount >= words.length - 1 && kept.length > 0) continue;\n\n kept.push(ref);\n for (const w of words) usedWords.add(w);\n }\n\n return kept;\n}\n\nfunction detectGaps(subQueries: string[], sources: ResearchSource[]): string[] {\n if (subQueries.length === 0) return [];\n\n const gaps: string[] = [];\n const contentLower = sources.map((s) => s.markdown_content.toLowerCase()).join(' ');\n\n for (const query of subQueries) {\n // Extract significant words from sub-query\n const words = query.toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length >= MIN_PHRASE_LEN && !STOP_WORDS.has(w));\n\n if (words.length === 0) continue;\n\n // Count how many significant words appear in any source\n const found = words.filter((w) => contentLower.includes(w)).length;\n const coverage = found / words.length;\n\n if (coverage < 0.5) {\n gaps.push(`Limited coverage for: \"${query}\"`);\n }\n }\n\n return gaps;\n}\n\nfunction buildComparisonSection(\n entities: string[],\n sources: ResearchSource[],\n): { entities: string[]; comparison_points: string[] } {\n const comparisonPoints: string[] = [];\n const contentLower = sources.map((s) => s.markdown_content.toLowerCase()).join('\\n');\n\n // Look for comparison keywords near entity mentions\n const comparisonTerms = ['faster', 'slower', 'better', 'worse', 'more', 'less',\n 'easier', 'harder', 'simpler', 'complex', 'lightweight', 'heavy',\n 'performance', 'scalability', 'ecosystem', 'community', 'support'];\n\n for (const term of comparisonTerms) {\n if (!contentLower.includes(term)) continue;\n\n // Check if term appears near any entity\n const nearEntity = entities.some((e) => {\n const entityLower = e.toLowerCase();\n const idx = contentLower.indexOf(entityLower);\n if (idx === -1) return false;\n // Check within 200 chars of entity mention\n const neighborhood = contentLower.slice(Math.max(0, idx - 200), idx + e.length + 200);\n return neighborhood.includes(term);\n });\n\n if (nearEntity) {\n comparisonPoints.push(term);\n }\n }\n\n return { entities, comparison_points: [...new Set(comparisonPoints)] };\n}\n\nfunction firstSubstantiveParagraph(markdown: string): string | null {\n const paragraphs = markdown.split(/\\n\\n+/).map((p) => p.trim());\n for (const p of paragraphs) {\n if (p.length < 80) continue;\n if (p.startsWith('#') || p.startsWith('|') || p.startsWith('```')) continue;\n const cleaned = stripMarkdownLinks(p);\n if (cleaned.length < 80) continue;\n return cleaned.replace(/\\s+/g, ' ');\n }\n return null;\n}\n\n// Flatten markdown link/image syntax to plain text so a downstream char-slice\n// can't chop mid-link and leak `](/?source=post_page...` into key_findings.\nexport function stripMarkdownLinks(text: string): string {\n return text\n .replace(/!\\[[^\\]]*\\]\\([^)]*\\)/g, '')\n .replace(/\\[!\\[[^\\]]*\\]\\([^)]*\\)\\]\\([^)]*\\)/g, '')\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1')\n .replace(/<https?:\\/\\/[^>]+>/g, '')\n .trim();\n}\n\nfunction dedupe(list: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const item of list) {\n const key = item.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(item);\n }\n return out;\n}\n\nconst STOP_WORDS = new Set([\n 'about', 'after', 'also', 'been', 'before', 'being', 'between',\n 'both', 'could', 'does', 'doing', 'done', 'each', 'even', 'every',\n 'from', 'have', 'here', 'into', 'just', 'like', 'made', 'make',\n 'many', 'more', 'most', 'much', 'must', 'need', 'only', 'other',\n 'over', 'same', 'should', 'some', 'such', 'than', 'that', 'their',\n 'them', 'then', 'there', 'these', 'they', 'this', 'those', 'through',\n 'very', 'want', 'well', 'were', 'what', 'when', 'where', 'which',\n 'while', 'will', 'with', 'would', 'your',\n]);\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CitationGraphEntry } from '../types.js';
|
|
2
|
+
export type { CitationGraphEntry };
|
|
3
|
+
export interface CitationGraphSource {
|
|
4
|
+
url: string;
|
|
5
|
+
title: string;
|
|
6
|
+
markdown: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildCitationGraph(synthesisText: string, sources: CitationGraphSource[]): CitationGraphEntry[];
|
|
9
|
+
//# sourceMappingURL=citation-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citation-graph.d.ts","sourceRoot":"","sources":["../../src/research/citation-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAcD,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,mBAAmB,EAAE,GAC7B,kBAAkB,EAAE,CAmDtB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
const MAX_ENTRIES = 50;
|
|
2
|
+
const MAX_SOURCES_PER_CLAIM = 3;
|
|
3
|
+
const JACCARD_THRESHOLD = 0.2;
|
|
4
|
+
const MIN_SENTENCE_LEN = 10;
|
|
5
|
+
const MIN_TOKEN_LEN = 4;
|
|
6
|
+
const STOPWORDS = /* @__PURE__ */ new Set([
|
|
7
|
+
"a",
|
|
8
|
+
"an",
|
|
9
|
+
"the",
|
|
10
|
+
"is",
|
|
11
|
+
"are",
|
|
12
|
+
"was",
|
|
13
|
+
"were",
|
|
14
|
+
"and",
|
|
15
|
+
"or",
|
|
16
|
+
"but",
|
|
17
|
+
"in",
|
|
18
|
+
"on",
|
|
19
|
+
"at",
|
|
20
|
+
"to",
|
|
21
|
+
"for",
|
|
22
|
+
"of",
|
|
23
|
+
"with",
|
|
24
|
+
"by",
|
|
25
|
+
"from",
|
|
26
|
+
"as",
|
|
27
|
+
"that",
|
|
28
|
+
"this",
|
|
29
|
+
"it",
|
|
30
|
+
"its",
|
|
31
|
+
"be",
|
|
32
|
+
"been",
|
|
33
|
+
"has",
|
|
34
|
+
"have",
|
|
35
|
+
"had"
|
|
36
|
+
]);
|
|
37
|
+
function buildCitationGraph(synthesisText, sources) {
|
|
38
|
+
if (!synthesisText || synthesisText.trim().length === 0) return [];
|
|
39
|
+
const sentenceMatches = synthesisText.match(/[^.!?]+[.!?]+(?:\s|$)/g);
|
|
40
|
+
const sentences = sentenceMatches && sentenceMatches.length > 0 ? sentenceMatches.map((s) => s.trim()) : [synthesisText.trim()];
|
|
41
|
+
const sourceTokens = sources.map((s) => tokenize(s.markdown));
|
|
42
|
+
const entries = [];
|
|
43
|
+
for (const sentence of sentences) {
|
|
44
|
+
if (entries.length >= MAX_ENTRIES) break;
|
|
45
|
+
if (sentence.length < MIN_SENTENCE_LEN) continue;
|
|
46
|
+
const markerIndices = extractMarkers(sentence, sources.length);
|
|
47
|
+
if (markerIndices.length > 0) {
|
|
48
|
+
entries.push({
|
|
49
|
+
claim: sentence,
|
|
50
|
+
source_indices: markerIndices,
|
|
51
|
+
confidence: "high"
|
|
52
|
+
});
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const sentenceTokens = tokenize(sentence);
|
|
56
|
+
if (sentenceTokens.size === 0 || sourceTokens.length === 0) {
|
|
57
|
+
entries.push({ claim: sentence, source_indices: [], confidence: "low" });
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const scored = [];
|
|
61
|
+
for (let i = 0; i < sourceTokens.length; i++) {
|
|
62
|
+
const score = jaccard(sentenceTokens, sourceTokens[i]);
|
|
63
|
+
if (score >= JACCARD_THRESHOLD) scored.push({ idx: i, score });
|
|
64
|
+
}
|
|
65
|
+
scored.sort((a, b) => b.score - a.score);
|
|
66
|
+
if (scored.length === 0) {
|
|
67
|
+
entries.push({ claim: sentence, source_indices: [], confidence: "low" });
|
|
68
|
+
} else {
|
|
69
|
+
entries.push({
|
|
70
|
+
claim: sentence,
|
|
71
|
+
source_indices: scored.slice(0, MAX_SOURCES_PER_CLAIM).map((s) => s.idx),
|
|
72
|
+
confidence: "medium"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return entries;
|
|
77
|
+
}
|
|
78
|
+
function extractMarkers(sentence, sourceCount) {
|
|
79
|
+
const matches = sentence.match(/\[(\d+)\]/g);
|
|
80
|
+
if (!matches) return [];
|
|
81
|
+
const indices = [];
|
|
82
|
+
const seen = /* @__PURE__ */ new Set();
|
|
83
|
+
for (const m of matches) {
|
|
84
|
+
const n = Number(m.slice(1, -1));
|
|
85
|
+
if (!Number.isFinite(n) || n < 1) continue;
|
|
86
|
+
const idx = n - 1;
|
|
87
|
+
if (idx >= sourceCount) continue;
|
|
88
|
+
if (seen.has(idx)) continue;
|
|
89
|
+
seen.add(idx);
|
|
90
|
+
indices.push(idx);
|
|
91
|
+
}
|
|
92
|
+
return indices;
|
|
93
|
+
}
|
|
94
|
+
function tokenize(text) {
|
|
95
|
+
const tokens = /* @__PURE__ */ new Set();
|
|
96
|
+
const words = text.toLowerCase().replace(/[^a-z0-9\s]/g, " ").split(/\s+/);
|
|
97
|
+
for (const w of words) {
|
|
98
|
+
if (w.length < MIN_TOKEN_LEN) continue;
|
|
99
|
+
if (STOPWORDS.has(w)) continue;
|
|
100
|
+
tokens.add(w);
|
|
101
|
+
}
|
|
102
|
+
return tokens;
|
|
103
|
+
}
|
|
104
|
+
function jaccard(a, b) {
|
|
105
|
+
if (a.size === 0 || b.size === 0) return 0;
|
|
106
|
+
let intersection = 0;
|
|
107
|
+
for (const t of a) if (b.has(t)) intersection++;
|
|
108
|
+
const union = a.size + b.size - intersection;
|
|
109
|
+
return union === 0 ? 0 : intersection / union;
|
|
110
|
+
}
|
|
111
|
+
export {
|
|
112
|
+
buildCitationGraph
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=citation-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/research/citation-graph.ts"],"sourcesContent":["import type { CitationGraphEntry } from '../types.js';\n\nexport type { CitationGraphEntry };\n\nexport interface CitationGraphSource {\n url: string;\n title: string;\n markdown: string;\n}\n\nconst MAX_ENTRIES = 50;\nconst MAX_SOURCES_PER_CLAIM = 3;\nconst JACCARD_THRESHOLD = 0.2;\nconst MIN_SENTENCE_LEN = 10;\nconst MIN_TOKEN_LEN = 4;\n\nconst STOPWORDS = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'and', 'or', 'but', 'in', 'on',\n 'at', 'to', 'for', 'of', 'with', 'by', 'from', 'as', 'that', 'this', 'it',\n 'its', 'be', 'been', 'has', 'have', 'had',\n]);\n\nexport function buildCitationGraph(\n synthesisText: string,\n sources: CitationGraphSource[],\n): CitationGraphEntry[] {\n if (!synthesisText || synthesisText.trim().length === 0) return [];\n\n const sentenceMatches = synthesisText.match(/[^.!?]+[.!?]+(?:\\s|$)/g);\n const sentences = sentenceMatches && sentenceMatches.length > 0\n ? sentenceMatches.map((s) => s.trim())\n : [synthesisText.trim()];\n\n const sourceTokens = sources.map((s) => tokenize(s.markdown));\n const entries: CitationGraphEntry[] = [];\n\n for (const sentence of sentences) {\n if (entries.length >= MAX_ENTRIES) break;\n if (sentence.length < MIN_SENTENCE_LEN) continue;\n\n const markerIndices = extractMarkers(sentence, sources.length);\n if (markerIndices.length > 0) {\n entries.push({\n claim: sentence,\n source_indices: markerIndices,\n confidence: 'high',\n });\n continue;\n }\n\n // No (valid) markers -> Jaccard overlap\n const sentenceTokens = tokenize(sentence);\n if (sentenceTokens.size === 0 || sourceTokens.length === 0) {\n entries.push({ claim: sentence, source_indices: [], confidence: 'low' });\n continue;\n }\n\n const scored: { idx: number; score: number }[] = [];\n for (let i = 0; i < sourceTokens.length; i++) {\n const score = jaccard(sentenceTokens, sourceTokens[i]);\n if (score >= JACCARD_THRESHOLD) scored.push({ idx: i, score });\n }\n scored.sort((a, b) => b.score - a.score);\n\n if (scored.length === 0) {\n entries.push({ claim: sentence, source_indices: [], confidence: 'low' });\n } else {\n entries.push({\n claim: sentence,\n source_indices: scored.slice(0, MAX_SOURCES_PER_CLAIM).map((s) => s.idx),\n confidence: 'medium',\n });\n }\n }\n\n return entries;\n}\n\nfunction extractMarkers(sentence: string, sourceCount: number): number[] {\n const matches = sentence.match(/\\[(\\d+)\\]/g);\n if (!matches) return [];\n const indices: number[] = [];\n const seen = new Set<number>();\n for (const m of matches) {\n const n = Number(m.slice(1, -1));\n if (!Number.isFinite(n) || n < 1) continue;\n const idx = n - 1;\n if (idx >= sourceCount) continue;\n if (seen.has(idx)) continue;\n seen.add(idx);\n indices.push(idx);\n }\n return indices;\n}\n\nfunction tokenize(text: string): Set<string> {\n const tokens = new Set<string>();\n const words = text.toLowerCase().replace(/[^a-z0-9\\s]/g, ' ').split(/\\s+/);\n for (const w of words) {\n if (w.length < MIN_TOKEN_LEN) continue;\n if (STOPWORDS.has(w)) continue;\n tokens.add(w);\n }\n return tokens;\n}\n\nfunction jaccard(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 || b.size === 0) return 0;\n let intersection = 0;\n for (const t of a) if (b.has(t)) intersection++;\n const union = a.size + b.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type SamplingCapableServer } from '../search/sampling.js';
|
|
2
|
+
export type QueryType = 'comparison' | 'how-to' | 'concept' | 'general';
|
|
3
|
+
export interface DecomposeResult {
|
|
4
|
+
subQueries: string[];
|
|
5
|
+
samplingUsed: boolean;
|
|
6
|
+
queryType: QueryType;
|
|
7
|
+
}
|
|
8
|
+
export declare function decomposeQuestion(question: string, depth: 'quick' | 'standard' | 'comprehensive', server?: SamplingCapableServer): Promise<DecomposeResult>;
|
|
9
|
+
export declare function detectQueryType(question: string): QueryType;
|
|
10
|
+
export declare function extractComparisonEntities(question: string): {
|
|
11
|
+
entities: string[];
|
|
12
|
+
context: string;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=decompose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decompose.d.ts","sourceRoot":"","sources":["../../src/research/decompose.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,uBAAuB,CAAC;AAU/B,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,EAC7C,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAuC1B;AA8ED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CA0B3D;AA8BD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqCnG"}
|