#264 by GitHub stars
KnockOutEZ/wigolo
The go-to web for your AI coding agent — local-first search, fetch, crawl & research over MCP. No API keys, no cloud, $0/query. Public beta.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-agent/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-cache/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-crawl/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-diff/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-extract/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-fetch/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-find-similar/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-research/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-search/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/wigolo-watch/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
9180e9344422 → 0b38aebe4719
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Verified commit 0b38aebe471952c4412a07d7a08e615824ff36e1
git clone --filter=blob:none --no-checkout https://github.com/KnockOutEZ/wigolo.git .hotskills/knockoutez-wigolo && git -C .hotskills/knockoutez-wigolo checkout --detach 0b38aebe471952c4412a07d7a08e615824ff36e1
# Copy each selected skill directory from .hotskills/knockoutez-wigolo into .agents/skills/<skill-name>/Heat
5.7- Star growth, last 7 daysAhead of 70% of tracked repositories
- Star growth, last 24 hoursAhead of 70% of tracked repositories
- Rank movement, last 7 daysAhead of 30% of tracked repositories
- Commits, last 30 daysAhead of 94% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- wigolo
/ - wigolo
skills/wigolo - wigolo-agent
skills/wigolo-agent - wigolo-cache
skills/wigolo-cache - wigolo-crawl
skills/wigolo-crawl - wigolo-diff
skills/wigolo-diff - wigolo-extract
skills/wigolo-extract - wigolo-fetch
skills/wigolo-fetch - wigolo-find-similar
skills/wigolo-find-similar - wigolo-research
skills/wigolo-research - wigolo-search
skills/wigolo-search - wigolo-watch
skills/wigolo-watch
How it works
wigolo
When your agent uses it
Local-first web intelligence MCP server for AI coding agents. Ten tools for search, fetch, crawl, cache, extract, find similar, research, agent-driven data gathering, page diffing, and change watching. No API keys. Results cached in a local knowledge store.
What it loads into context
Frontmatter
534 tokensAlways available to the agent
SKILL.md
5,382 tokensWhen the skill is activated
Reference documents
106,807 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Host-LLM synthesis (read me first)
- Quick Setup
- Tools
- Workflow Patterns
- Parameter Cheat Sheet
- Anti-Patterns
- CLI Commands
- Configuration
- Links
Scripts executed separately
DockerfileMakefileassets/brand/generate.cjsbenchmarks/agent/evaluator.tsbenchmarks/agent/metrics.tsbenchmarks/agent/report.tsbenchmarks/agent/runner.tsbenchmarks/agent/task-executor.tsbenchmarks/agent/types.tsbenchmarks/embedding/runner.tsbenchmarks/extraction/metrics.tsbenchmarks/extraction/per-category.tsbenchmarks/extraction/report.tsbenchmarks/extraction/runner.tsbenchmarks/extraction/tokenizer.tsbenchmarks/extraction/types.tsbenchmarks/perf/tool-latency.tsbenchmarks/search/metrics.tsbenchmarks/search/mock-engine.tsbenchmarks/search/report.tsbenchmarks/search/rerank-quality.tsbenchmarks/search/runner.tsbenchmarks/search/types.tsexamples/one-shot-cli/run.shexamples/plugin-search-engine/index.mjsexamples/plugin-search-engine/package.jsonexamples/rest-curl/demo.shexamples/sdk-python-agent/gather.pyexamples/sdk-typescript-research/package.jsonexamples/sdk-typescript-research/research.mjsexamples/shell-ndjson-pipeline/pipeline.shexamples/vercel-ai-sdk-tools/package.jsonexamples/vercel-ai-sdk-tools/tools.tsexamples/watch-changelog-webhook/watch.shmcpb/server/index.cjspackage.jsonpackages/wigolo-crewai/tests/__init__.pypackages/wigolo-crewai/tests/conftest.pypackages/wigolo-crewai/tests/test_core.pypackages/wigolo-crewai/tests/test_tools.pypackages/wigolo-crewai/wigolo_crewai/__init__.pypackages/wigolo-crewai/wigolo_crewai/_core.pypackages/wigolo-crewai/wigolo_crewai/tools.pypackages/wigolo-crewai/wigolo_crewai/types.pypackages/wigolo-langchain/tests/__init__.pypackages/wigolo-langchain/tests/conftest.pypackages/wigolo-langchain/tests/test_client.pypackages/wigolo-langchain/tests/test_retrievers.pypackages/wigolo-langchain/tests/test_tools.pypackages/wigolo-langchain/wigolo_langchain/__init__.pypackages/wigolo-langchain/wigolo_langchain/client.pypackages/wigolo-langchain/wigolo_langchain/retrievers.pypackages/wigolo-langchain/wigolo_langchain/tools.pypackages/wigolo-langchain/wigolo_langchain/types.pypackages/wigolo-llamaindex/tests/__init__.pypackages/wigolo-llamaindex/tests/conftest.pypackages/wigolo-llamaindex/tests/test_client.pypackages/wigolo-llamaindex/tests/test_reader.pypackages/wigolo-llamaindex/wigolo_llamaindex/__init__.pypackages/wigolo-llamaindex/wigolo_llamaindex/client.pypackages/wigolo-llamaindex/wigolo_llamaindex/reader.pypackages/wigolo-llamaindex/wigolo_llamaindex/types.pypackages/wigolo-vercel-ai-sdk/package.jsonpackages/wigolo-vercel-ai-sdk/src/client.tspackages/wigolo-vercel-ai-sdk/src/index.tspackages/wigolo-vercel-ai-sdk/src/tools.tspackages/wigolo-vercel-ai-sdk/src/types.tspackages/wigolo-vercel-ai-sdk/tests/client.test.tspackages/wigolo-vercel-ai-sdk/tests/tools.test.tspackages/wigolo-vercel-ai-sdk/vitest.config.tspackaging/binary/bundle.mjspackaging/binary/pack.shpackaging/binary/react-devtools-core-stub.mjspackaging/homebrew/wigolo.rbpackaging/install.shscripts/gen-legacy-skill-hashes.mjsscripts/release-sponsor-notes.tsscripts/run-sdk-py-tests.mjsscripts/star-chart.mjsscripts/verify-channel-binary.shscripts/verify-channel-brew.shscripts/verify-channel-docker.shscripts/verify-channel-npm.shscripts/verify-channel-rest.shscripts/verify-channel-sh.shscripts/verify-sdks.shsdks/python/conftest.pysdks/python/src/wigolo/__init__.pysdks/python/src/wigolo/_aio.pysdks/python/src/wigolo/_client.pysdks/python/src/wigolo/_errors.pysdks/python/src/wigolo/_local.pysdks/python/src/wigolo/_manifest.pysdks/python/tests/_fake_serve.pysdks/python/tests/conftest.pysdks/python/tests/test_integration.pysdks/python/tests/test_integration_local.pysdks/python/tests/test_package_build.pysdks/python/tests/test_runtime_drift.pysdks/python/tests/test_unit_async.pysdks/python/tests/test_unit_env_and_surface.pysdks/python/tests/test_unit_local.pysdks/python/tests/test_unit_transport.pysdks/typescript/package.jsonsdks/typescript/src/client.tssdks/typescript/src/errors.tssdks/typescript/src/index.tssdks/typescript/src/local.tssdks/typescript/src/manifest.tssdks/typescript/src/node-shims.d.tssdks/typescript/src/types.tssdks/typescript/tests/client.unit.test.tssdks/typescript/tests/drift.type-test.tssdks/typescript/tests/embedded.test.tssdks/typescript/tests/helpers.tssdks/typescript/tests/integration.test.tssdks/typescript/tests/local.unit.test.tssdks/typescript/tests/runtime-drift.test.tssdks/typescript/tests/serve-harness.tssdks/typescript/vitest.config.tssite/eslint.config.mjssite/next.config.mjssite/package.jsonsite/postcss.config.mjssite/scripts/indexnow.mjssite/scripts/logo-wall/fetch-logos.mjssite/scripts/logo-wall/mine.mjssite/scripts/logo-wall/normalize.mjssite/scripts/logo-wall/normalize.test.mjssite/scripts/logo-wall/silhouette.mjssite/scripts/logo-wall/silhouette.test.mjssite/scripts/sync-content.mjssite/scripts/sync-content.test.mjssite/src/app/alternatives/[slug]/page.tsxsite/src/app/alternatives/page.tsxsite/src/app/docs/[[...slug]]/page.tsxsite/src/app/docs/layout.tsxsite/src/app/go/[slug]/SponsorCard.tsxsite/src/app/go/[slug]/SponsorRedirect.tsxsite/src/app/go/[slug]/page.tsxsite/src/app/layout.tsxsite/src/app/llms-full.txt/route.tssite/src/app/llms.txt/route.tssite/src/app/logo-wall.svg/route.tssite/src/app/page.tsxsite/src/app/robots.tssite/src/app/search.json/route.tssite/src/app/sitemap.tssite/src/app/sponsors/page.tsxsite/src/components/Analytics.tsxsite/src/components/AnnouncementBar.tsxsite/src/components/FeatureMarquee.tsxsite/src/components/Feedback.tsxsite/src/components/Footer.tsxsite/src/components/Hero.tsxsite/src/components/HowItWorks.tsxsite/src/components/LogoWall.tsxsite/src/components/Nav.tsxsite/src/components/OpenSource.tsxsite/src/components/Parity.tsxsite/src/components/Quickstart.tsxsite/src/components/Reveal.tsxsite/src/components/SponsorStrip.tsxsite/src/components/Sponsors.tsxsite/src/components/StartShipping.tsxsite/src/components/Stats.tsxsite/src/components/Testimonials.tsxsite/src/components/Tools.tsxsite/src/components/TrustedBy.tsxsite/src/components/alternatives/Inline.tsxsite/src/components/docs/SearchDialog.tsxsite/src/content/alternatives.tssite/src/lib/analytics.tssite/src/lib/jsonld.tssite/src/lib/lastmod.tssite/src/lib/llms.tssite/src/lib/logo-wall.tssite/src/lib/site.tssite/src/lib/source.tssite/src/lib/sponsors.tssite/src/lib/stats.tssite/tests/alternatives.test.tssite/tests/analytics.test.tssite/tests/logo-wall.test.tssite/vitest.config.mtssrc/agent/executor.tssrc/agent/pipeline.tssrc/agent/planner.tssrc/agent/rank.tssrc/agent/relevance.tssrc/cache/backfill-embeddings.tssrc/cache/change-detector.tssrc/cache/db.tssrc/cache/diff-engine.tssrc/cache/diff-summary.tssrc/cache/lcs.tssrc/cache/migrations/runner.tssrc/cache/sqlite-vec-store.tssrc/cache/store.tssrc/cli/agents/antigravity.tssrc/cli/agents/claude-code.tssrc/cli/agents/cline.tssrc/cli/agents/codex.tssrc/cli/agents/cursor.tssrc/cli/agents/gemini-cli.tssrc/cli/agents/opencode.tssrc/cli/agents/registry.tssrc/cli/agents/skills/catalog.tssrc/cli/agents/skills/executor.tssrc/cli/agents/skills/index.tssrc/cli/agents/skills/planner.tssrc/cli/agents/skills/receipts.tssrc/cli/agents/skills/snapshot.tssrc/cli/agents/skills/targets.tssrc/cli/agents/skills/types.tssrc/cli/agents/utils.tssrc/cli/agents/vscode.tssrc/cli/agents/windsurf.tssrc/cli/agents/zed.tssrc/cli/auth.tssrc/cli/backfill.tssrc/cli/config.tssrc/cli/daemon.tssrc/cli/doctor.tssrc/cli/flag-bridge.tssrc/cli/health.tssrc/cli/help.tssrc/cli/index.tssrc/cli/init.tssrc/cli/mcp.tssrc/cli/ollama-probe.tssrc/cli/plugin.tssrc/cli/setup-mcp.tssrc/cli/shell.tssrc/cli/shutdown.tssrc/cli/skills.tssrc/cli/status.tssrc/cli/telemetry.tssrc/cli/tool-run.tssrc/cli/tui/actions/cache-stats.tssrc/cli/tui/actions/cleanup.tssrc/cli/tui/actions/compute-storage.tssrc/cli/tui/actions/detect-system.tssrc/cli/tui/actions/export-import-config.tssrc/cli/tui/actions/headless-set.tssrc/cli/tui/actions/index.tssrc/cli/tui/actions/provider-keys.tssrc/cli/tui/actions/setup-status.tssrc/cli/tui/actions/types.tssrc/cli/tui/actions/uninstall.tssrc/cli/tui/actions/verify-e2e.tssrc/cli/tui/actions/verify-router.tssrc/cli/tui/actions/write-config.tssrc/cli/tui/agents-types.tssrc/cli/tui/agents.tssrc/cli/tui/banner.tssrc/cli/tui/components/ActionBar.tsxsrc/cli/tui/components/Banner.tsxsrc/cli/tui/components/CategoryScreen.tsxsrc/cli/tui/components/DashboardExport.tsxsrc/cli/tui/components/DashboardUninstall.tsxsrc/cli/tui/components/DoctorScreen.tsxsrc/cli/tui/components/FieldRenderer.tsxsrc/cli/tui/components/ImportScreen.tsxsrc/cli/tui/components/SettingsHome.tsxsrc/cli/tui/components/Verification.tsxsrc/cli/tui/components/VerifyScreen.tsxsrc/cli/tui/components/WizardSteps.tsxsrc/cli/tui/config-writer-cli.tssrc/cli/tui/config-writer-json.tssrc/cli/tui/config-writer-toml.tssrc/cli/tui/config-writer.tssrc/cli/tui/detect-helpers.tssrc/cli/tui/entry.tssrc/cli/tui/extras-prompt.tssrc/cli/tui/flags-types.tssrc/cli/tui/flags.tssrc/cli/tui/format.tssrc/cli/tui/hooks/useVerify.tssrc/cli/tui/reporter-auto.tssrc/cli/tui/reporter.tssrc/cli/tui/router/ink.tsxsrc/cli/tui/run-command.tssrc/cli/tui/schema/advanced.tssrc/cli/tui/schema/agents.tssrc/cli/tui/schema/browser.tssrc/cli/tui/schema/cache.tssrc/cli/tui/schema/catalog.tssrc/cli/tui/schema/llm.tssrc/cli/tui/schema/migrate.tssrc/cli/tui/schema/search.tssrc/cli/tui/schema/types.tssrc/cli/tui/select-agents.tssrc/cli/tui/shell/App.tsxsrc/cli/tui/shell/CommandPalette.tsxsrc/cli/tui/shell/Footer.tsxsrc/cli/tui/shell/Header.tsxsrc/cli/tui/shell/HelpOverlay.tsxsrc/cli/tui/shell/MainPane.tsxsrc/cli/tui/shell/Sidebar.tsxsrc/cli/tui/shell/Spinner.tsxsrc/cli/tui/shell/palette-index.tssrc/cli/tui/shell/width.tssrc/cli/tui/state/activity-store-instance.tssrc/cli/tui/state/activity-store.tssrc/cli/tui/state/agent-install-hints.tssrc/cli/tui/state/agent-targets.tssrc/cli/tui/state/propagation.tssrc/cli/tui/state/required-fields.tssrc/cli/tui/state/secret-store.tssrc/cli/tui/state/settings-store.tssrc/cli/tui/state/toast-store-instance.tssrc/cli/tui/state/toast-store.tssrc/cli/tui/state/uninstall-signal.tssrc/cli/tui/status-agents.tssrc/cli/tui/status-cache.tssrc/cli/tui/status-format.tssrc/cli/tui/status-python.tssrc/cli/tui/system-check.tssrc/cli/tui/theme/borders.tssrc/cli/tui/theme/motion-guard.tssrc/cli/tui/theme/motion.tssrc/cli/tui/theme/palette.tssrc/cli/tui/tui-reporter.tssrc/cli/tui/utils/config-writer.tssrc/cli/tui/utils/suppress-logs.tssrc/cli/tui/verify-suggestions.tssrc/cli/tui/verify.tssrc/cli/tui/version.tssrc/cli/tune.tssrc/cli/uninstall.tssrc/cli/verify.tssrc/cli/warmup.tssrc/config.tssrc/crawl/crawler.tssrc/crawl/dedup.tssrc/crawl/etag-incremental.tssrc/crawl/index-to-vec.tssrc/crawl/mapper.tssrc/crawl/rate-limiter.tssrc/crawl/robots.tssrc/crawl/sitemap-first.tssrc/crawl/sitemap.tssrc/crawl/url-utils.tssrc/daemon/admin-token.tssrc/daemon/health-check.tssrc/daemon/http-server.tssrc/daemon/proxy.tssrc/daemon/rest/auth.tssrc/daemon/rest/dispatch.tssrc/daemon/rest/errors.tssrc/daemon/rest/firecrawl-compat.tssrc/daemon/rest/limits.tssrc/daemon/rest/openapi.tssrc/daemon/rest/router.tssrc/daemon/rest/target-guard.tssrc/daemon/rest/validate.tssrc/embedding/background-queue.tssrc/embedding/embed.tssrc/embedding/fastembed-provider.tssrc/embedding/key-terms.tssrc/extraction/boilerplate.tssrc/extraction/brand-palette.tssrc/extraction/brand-provenance.tssrc/extraction/brand.tssrc/extraction/defuddle.tssrc/extraction/div-grid.tssrc/extraction/extract.tssrc/extraction/jsonld.tssrc/extraction/lang-hints.tssrc/extraction/list.tssrc/extraction/llm-fallback.tssrc/extraction/markdown-sanitize.tssrc/extraction/markdown.tssrc/extraction/metadata.tssrc/extraction/pipeline.tssrc/extraction/readability.tssrc/extraction/schema-truth.tssrc/extraction/schema.tssrc/extraction/site-extractors/amazon.tssrc/extraction/site-extractors/docs-generic.tssrc/extraction/site-extractors/github.tssrc/extraction/site-extractors/mdn.tssrc/extraction/site-extractors/reddit.tssrc/extraction/site-extractors/stackoverflow.tssrc/extraction/site-extractors/youtube.tssrc/extraction/structured-data.tssrc/extraction/structured.tssrc/extraction/v1/classifier.tssrc/extraction/v1/content-root.tssrc/extraction/v1/extract-provider.tssrc/extraction/v1/local-llm.tssrc/extraction/v1/news.tssrc/extraction/v1/product.tssrc/extraction/v1/recipe.tssrc/extraction/v1/routed.tssrc/extraction/v1/schemas/Article.tssrc/extraction/v1/schemas/CodeSnippet.tssrc/extraction/v1/schemas/EventListing.tssrc/extraction/v1/schemas/JobPosting.tssrc/extraction/v1/schemas/Paper.tssrc/extraction/v1/schemas/Product.tssrc/extraction/v1/schemas/Recipe.tssrc/extraction/v1/schemas/index.tssrc/extraction/v1/site-extractors.tssrc/fetch/action-executor.tssrc/fetch/ai-solve.tssrc/fetch/auth.tssrc/fetch/auto-pass.tssrc/fetch/behavior.tssrc/fetch/browser-acquire.tssrc/fetch/browser-pool.tssrc/fetch/browser-probe.tssrc/fetch/browser-selector.tssrc/fetch/browser-types.tssrc/fetch/cdp-client.tssrc/fetch/cdp-direct.tssrc/fetch/challenge-classify.tssrc/fetch/challenge-completion.tssrc/fetch/clearance-reuse.tssrc/fetch/content-check.tssrc/fetch/error-describe.tssrc/fetch/escape-hatch.tssrc/fetch/http-client.tssrc/fetch/human-solve.tssrc/fetch/hydration-probe.tssrc/fetch/pinned-dispatcher.tssrc/fetch/playwright-tier.tssrc/fetch/politeness.tssrc/fetch/proxy-credentials.tssrc/fetch/reddit-api.tssrc/fetch/router.tssrc/fetch/scraping-browser.tssrc/fetch/settle.tssrc/fetch/solve-ladder.tssrc/fetch/stealth.tssrc/fetch/tls-tier.tssrc/index.tssrc/instructions.tssrc/integrations/cloud/llm/anthropic.tssrc/integrations/cloud/llm/cache.tssrc/integrations/cloud/llm/custom-backend.tssrc/integrations/cloud/llm/gemini.tssrc/integrations/cloud/llm/groq.tssrc/integrations/cloud/llm/hash.tssrc/integrations/cloud/llm/local-tier.tssrc/integrations/cloud/llm/model-select.tssrc/integrations/cloud/llm/openai.tssrc/integrations/cloud/llm/run.tssrc/integrations/cloud/llm/select.tssrc/integrations/cloud/llm/text-adapters.tssrc/integrations/cloud/llm/types.tssrc/integrations/cloud/llm/validate.tssrc/logger.tssrc/pdf-parse.d.tssrc/persisted-config.tssrc/plugins/loader.tssrc/plugins/registry.tssrc/plugins/validate.tssrc/providers/embed-provider.tssrc/providers/extract-provider.tssrc/providers/idle-unload.tssrc/providers/rerank-provider.tssrc/providers/search-provider.tssrc/providers/vector-store.tssrc/python-env.tssrc/repl/commands/agent.tssrc/repl/commands/cache.tssrc/repl/commands/crawl.tssrc/repl/commands/diff.tssrc/repl/commands/extract.tssrc/repl/commands/fetch.tssrc/repl/commands/find-similar.tssrc/repl/commands/research.tssrc/repl/commands/search.tssrc/repl/commands/types.tssrc/repl/commands/watch.tssrc/repl/completer.tssrc/repl/formatters.tssrc/repl/parser.tssrc/repl/shell.tssrc/research/branch-exploration.tssrc/research/brief.tssrc/research/citation-graph.tssrc/research/decompose.tssrc/research/entity-extractor.tssrc/research/pipeline.tssrc/research/render-brief.tssrc/research/source-validation.tssrc/research/synthesis-local.tssrc/research/synthesize.tssrc/search/answer-synthesis.tssrc/search/content-fetch.tssrc/search/context-formatter.tssrc/search/core/brand-collision.tssrc/search/core/canonical-url.tssrc/search/core/context-rank.tssrc/search/core/core-provider.tssrc/search/core/domain-quality.tssrc/search/core/engine-base.tssrc/search/core/engine-health.tssrc/search/core/engine-quality.tssrc/search/core/engine-warnings.tssrc/search/core/error-intent.tssrc/search/core/favicon.tssrc/search/core/freshness.tssrc/search/core/intent-router.tssrc/search/core/lexical-alignment.tssrc/search/core/orchestrator.tssrc/search/core/query-expansion.tssrc/search/core/query-understanding.tssrc/search/core/rare-terms.tssrc/search/core/recency-boost.tssrc/search/core/recent-cache-dedup.tssrc/search/core/rerank-fold.tssrc/search/core/rss/feed-config.tssrc/search/core/rss/feed-parser.tssrc/search/core/rss/feed-poller.tssrc/search/core/rss/feed-store.tssrc/search/core/rss/rss-engine.tssrc/search/core/score-floor.tssrc/search/core/text-tokenizer.tssrc/search/core/time-range.tssrc/search/core/verticals/code.tssrc/search/core/verticals/docs.tssrc/search/core/verticals/general.tssrc/search/core/verticals/images.tssrc/search/core/verticals/news.tssrc/search/core/verticals/papers.tssrc/search/dedup.tssrc/search/engines/arxiv.tssrc/search/engines/bing-news.tssrc/search/engines/bing.tssrc/search/engines/brave-image.tssrc/search/engines/brave.tssrc/search/engines/crates-io.tssrc/search/engines/dblp.tssrc/search/engines/ddg-image.tssrc/search/engines/devdocs.tssrc/search/engines/duckduckgo.tssrc/search/engines/github-code.tssrc/search/engines/hn-algolia.tssrc/search/engines/lobsters.tssrc/search/engines/marginalia.tssrc/search/engines/mdn.tssrc/search/engines/mojeek.tssrc/search/engines/openalex.tssrc/search/engines/openreview.tssrc/search/engines/semantic-scholar.tssrc/search/engines/stackoverflow.tssrc/search/engines/user-agents.tssrc/search/engines/wikipedia.tssrc/search/evidence.tssrc/search/filters.tssrc/search/find-similar.tssrc/search/find-similar/crawl-rank.tssrc/search/find-similar/mode.tssrc/search/highlights.tssrc/search/hybrid/common-nouns.tssrc/search/hybrid/merge.tssrc/search/hybrid/router.tssrc/search/hybrid/signals.tssrc/search/language-filter.tssrc/search/legacy/searxng-orchestrator.tssrc/search/legacy/searxng-provider.tssrc/search/multi-query.tssrc/search/query.tssrc/search/rerank.tssrc/search/reranker/authority-boost.tssrc/search/reranker/consensus-boost.tssrc/search/reranker/recency-boost.tssrc/search/reranker/recency.tssrc/search/reranker/remote-rerank-provider.tssrc/search/reranker/transformers-rerank-provider.tssrc/search/rrf.tssrc/search/sampling.tssrc/search/searxng.tssrc/search/tokens.tssrc/search/truncate.tssrc/search/url-unwrap.tssrc/search/validator.tssrc/searxng/bootstrap.tssrc/searxng/docker.tssrc/searxng/enabled.tssrc/searxng/process.tssrc/security/key-crypto.tssrc/security/key-store.tssrc/security/keychain.tssrc/server.tssrc/server/backend-status.tssrc/server/search-response.tssrc/server/tool-schemas.tssrc/server/warmup-on-start.tssrc/tools/agent.tssrc/tools/cache.tssrc/tools/crawl.tssrc/tools/diff.tssrc/tools/extract.tssrc/tools/fetch.tssrc/tools/find-similar.tssrc/tools/research.tssrc/tools/search.tssrc/tools/watch.tssrc/types.tssrc/util/abort.tssrc/util/child-env.tssrc/util/engine-list.tssrc/util/mode.tssrc/util/native-abi.tssrc/util/packaged.tssrc/util/redact-url.tssrc/watch/scheduler.tssrc/watch/ssrf.tssrc/watch/store.tstests/e2e/doctor-clean-exit.e2e.test.tstests/e2e/fetch-tool.test.tstests/e2e/init-command.e2e.test.tstests/e2e/mcp-startup.test.tstests/e2e/search-tool.test.tstests/e2e/searxng-cold-bootstrap.e2e.test.tstests/fetch/pinned-dispatcher.test.tstests/fetch/pinned-e2e.test.tstests/fetch/pinned-failclosed.test.tstests/fetch/pinned-rebind.test.tstests/fetch/pinned-redirect-body.test.tstests/fetch/pinned-redirect.test.tstests/fixtures/dump_tokens.pytests/fixtures/plugins/bad-json/package.jsontests/fixtures/plugins/invalid-shape/index.mjstests/fixtures/plugins/invalid-shape/package.jsontests/fixtures/plugins/no-main/package.jsontests/fixtures/plugins/throws-on-load/index.mjstests/fixtures/plugins/throws-on-load/package.jsontests/fixtures/plugins/valid-both/index.mjstests/fixtures/plugins/valid-both/package.jsontests/fixtures/plugins/valid-extractor/index.mjstests/fixtures/plugins/valid-extractor/package.jsontests/fixtures/plugins/valid-search-engine/index.mjstests/fixtures/plugins/valid-search-engine/package.jsontests/helpers/wait-for.tstests/integration/agent-defaults-token-discipline.test.tstests/integration/agent-local-tier.test.tstests/integration/agent-top-mcp-servers.test.tstests/integration/agent.test.tstests/integration/browser-actions.test.tstests/integration/build-output.test.tstests/integration/cache-defaults-token-discipline.test.tstests/integration/cache-tool.test.tstests/integration/cdp-discovery.test.tstests/integration/change-detection.test.tstests/integration/citation-id-stability.test.tstests/integration/config-writer-fs.test.tstests/integration/crawl-index-latency.test.tstests/integration/crawl-pipeline.test.tstests/integration/crawl/nav-dedupe.test.tstests/integration/daemon-mode.test.tstests/integration/embedding-cache-fastembed.test.tstests/integration/embedding.test.tstests/integration/extract-pipeline-v1.test.tstests/integration/extract-pipeline.test.tstests/integration/extract-schema-evidence-only.test.tstests/integration/extract-structured.test.tstests/integration/extract-tables-truncation.test.tstests/integration/extract-wikipedia-chrome.test.tstests/integration/extraction-pipeline-structured-data.test.tstests/integration/extraction/markdown-post-process.test.tstests/integration/extras-prompt-roundtrip.test.tstests/integration/fetch-cache-completeness-gate.test.tstests/integration/fetch-cache-miss.test.tstests/integration/fetch-method-visibility.test.tstests/integration/fetch-pdf.test.tstests/integration/fetch-pipeline.test.tstests/integration/fetch-router-tuning.test.tstests/integration/fetch-site-data.test.tstests/integration/fetch-vs-extract-metadata.test.tstests/integration/fetch/browser-pool.test.tstests/integration/fetch/no-lightpanda.test.tstests/integration/fetch/playwright-tier.test.tstests/integration/fetch/spa-settle-corpus.test.tstests/integration/fetch/spa-settle-corpus/fixtures.tstests/integration/fetch/spa-settle-corpus/server.tstests/integration/filter-enforcement.test.tstests/integration/find-similar.test.tstests/integration/hybrid-mode.test.tstests/integration/instructions-v3.test.tstests/integration/llm-fallback-e2e.test.tstests/integration/llm-fallback-schema.test.tstests/integration/map-mode.test.tstests/integration/mode-deep.test.tstests/integration/multi-browser.test.tstests/integration/multi-query.test.tstests/integration/onnx-rerank-e2e.test.tstests/integration/pipeline-success-criteria.test.tstests/integration/plugins/plugin-lifecycle.test.tstests/integration/remote-rerank-pipeline.test.tstests/integration/repl-e2e.test.tstests/integration/rerank-pipeline.test.tstests/integration/research-local-tier.test.tstests/integration/research.test.tstests/integration/rest-api.test.tstests/integration/rest-firecrawl-compat.test.tstests/integration/rest-tools.test.tstests/integration/router-stealth.test.tstests/integration/schema-extract-pipeline.test.tstests/integration/search-adapter-quality.test.tstests/integration/search-answer.test.tstests/integration/search-depth.test.tstests/integration/search-evidence-default.test.tstests/integration/search-filtering-pipeline.test.tstests/integration/search-format-answer-empty.test.tstests/integration/search-format-answer-slim.test.tstests/integration/search-language-filter.test.tstests/integration/search-legacy-parity.test.tstests/integration/search-pipeline.test.tstests/integration/search-rerank-fold.test.tstests/integration/search-rerank-pipeline.test.tstests/integration/search-s11c-ranking.test.tstests/integration/search-v1-context.test.tstests/integration/search-v1-pipeline.test.tstests/integration/searxng-retry.test.tstests/integration/setup-roundtrip.test.tstests/integration/skills-install.test.tstests/integration/tui-autosave-roundtrip.test.tstests/integration/tui-narrow-terminal.test.tstests/integration/tui-shell-integration.test.tstests/integration/warmup-force.test.tstests/integration/warmup-tui.test.tstests/integration/watch/watch-handler.test.tstests/integration/zero-touch-just-works.test.tstests/perf/embedding.bench.tstests/perf/rerank.bench.tstests/perf/search-v1.bench.tstests/perf/vector-search.bench.tstests/setup.tstests/unit/agent/agent-defaults.test.tstests/unit/agent/executor.test.tstests/unit/agent/pipeline.llm-gate-keystore.test.tstests/unit/agent/pipeline.local-tier.test.tstests/unit/agent/pipeline.provider-priority.test.tstests/unit/agent/pipeline.test.tstests/unit/agent/planner.test.tstests/unit/agent/rank.test.tstests/unit/agent/relevance.test.tstests/unit/benchmarks/agent/evaluator.test.tstests/unit/benchmarks/agent/metrics.test.tstests/unit/benchmarks/agent/report.test.tstests/unit/benchmarks/agent/runner.test.tstests/unit/benchmarks/agent/task-executor.test.tstests/unit/benchmarks/extraction/metrics.test.tstests/unit/benchmarks/extraction/report.test.tstests/unit/benchmarks/extraction/runner.test.tstests/unit/benchmarks/extraction/tokenizer.test.tstests/unit/benchmarks/search/metrics.test.tstests/unit/benchmarks/search/mock-engine.test.tstests/unit/benchmarks/search/report.test.tstests/unit/benchmarks/search/runner.test.tstests/unit/cache/antibot-clearance.test.tstests/unit/cache/backfill-embeddings.test.tstests/unit/cache/change-detector.test.tstests/unit/cache/clearance-route-secret.test.tstests/unit/cache/db-embedding.test.tstests/unit/cache/db-exit-hook.test.tstests/unit/cache/db-vec-packaged.test.tstests/unit/cache/db.test.tstests/unit/cache/diff-engine.test.tstests/unit/cache/diff-summary.test.tstests/unit/cache/domain-routing-admin.test.tstests/unit/cache/lcs.test.tstests/unit/cache/migrations-runner.test.tstests/unit/cache/sanitize-fts-query.test.tstests/unit/cache/sqlite-vec-store.test.tstests/unit/cache/stale-window.test.tstests/unit/cache/store-embedding.test.tstests/unit/cache/store-search-key.test.tstests/unit/cache/store.test.tstests/unit/cache/tls-routing.test.tstests/unit/cli/agents/agent-support-consistency.test.tstests/unit/cli/agents/claude-code.test.tstests/unit/cli/agents/cline.test.tstests/unit/cli/agents/codex.test.tstests/unit/cli/agents/opencode.test.tstests/unit/cli/agents/registry.test.tstests/unit/cli/agents/skills-content.test.tstests/unit/cli/agents/skills/catalog.test.tstests/unit/cli/agents/skills/executor.test.tstests/unit/cli/agents/skills/planner.test.tstests/unit/cli/agents/skills/receipts.test.tstests/unit/cli/agents/skills/targets.test.tstests/unit/cli/agents/utils.test.tstests/unit/cli/agents/vscode.test.tstests/unit/cli/agents/windsurf.test.tstests/unit/cli/agents/zed.test.tstests/unit/cli/auth.test.tstests/unit/cli/config-dispatch.test.tstests/unit/cli/config.test.tstests/unit/cli/daemon.test.tstests/unit/cli/doctor-engine-health.test.tstests/unit/cli/doctor-fixes.test.tstests/unit/cli/doctor-isolated.test.tstests/unit/cli/doctor-lazy.test.tstests/unit/cli/doctor-ollama.test.tstests/unit/cli/doctor-provider.test.tstests/unit/cli/doctor-tls-tier.test.tstests/unit/cli/doctor.test.tstests/unit/cli/flag-bridge.test.tstests/unit/cli/health.test.tstests/unit/cli/help-completeness.test.tstests/unit/cli/help.test.tstests/unit/cli/index.test.tstests/unit/cli/init-non-interactive.test.tstests/unit/cli/init-ollama-hint.test.tstests/unit/cli/init-packaged-binary.test.tstests/unit/cli/init.test.tstests/unit/cli/json-contracts.test.tstests/unit/cli/ollama-probe.test.tstests/unit/cli/plugin.test.tstests/unit/cli/router-config.test.tstests/unit/cli/setup-mcp-integration.test.tstests/unit/cli/setup-mcp-non-interactive.test.tstests/unit/cli/setup-mcp.test.tstests/unit/cli/shell.test.tstests/unit/cli/skills-command.test.tstests/unit/cli/status.test.tstests/unit/cli/telemetry.test.tstests/unit/cli/tool-flag-parity.test.tstests/unit/cli/tool-run.test.tstests/unit/cli/tui/actions/cache-stats.test.tstests/unit/cli/tui/actions/cleanup.test.tstests/unit/cli/tui/actions/compute-storage.test.tstests/unit/cli/tui/actions/detect-system.test.tstests/unit/cli/tui/actions/export-import-config.test.tstests/unit/cli/tui/actions/headless-set.test.tstests/unit/cli/tui/actions/mcp-stdio-no-ink.test.tstests/unit/cli/tui/actions/provider-actions.test.tstests/unit/cli/tui/actions/uninstall.test.tstests/unit/cli/tui/actions/write-config-no-silent.test.tstests/unit/cli/tui/actions/write-config.test.tstests/unit/cli/tui/agents.test.tstests/unit/cli/tui/banner.test.tstests/unit/cli/tui/banner.test.tsxtests/unit/cli/tui/components/ActionBar.test.tsxtests/unit/cli/tui/components/CategoryScreen.blur.test.tsxtests/unit/cli/tui/components/CategoryScreen.test.tsxtests/unit/cli/tui/components/DoctorScreen.test.tsxtests/unit/cli/tui/components/FieldRenderer.enter-select.test.tsxtests/unit/cli/tui/components/FieldRenderer.saved-check.test.tsxtests/unit/cli/tui/components/FieldRenderer.test.tsxtests/unit/cli/tui/components/ImportScreen.test.tsxtests/unit/cli/tui/components/SettingsHome.multiselect-preview.test.tsxtests/unit/cli/tui/components/SettingsHome.quit.test.tsxtests/unit/cli/tui/components/SettingsHome.test.tsxtests/unit/cli/tui/components/SettingsHome.threeway.test.tsxtests/unit/cli/tui/components/VerifyScreen.test.tsxtests/unit/cli/tui/components/WizardSteps.ceremony.test.tsxtests/unit/cli/tui/components/WizardSteps.continue-quit.test.tsxtests/unit/cli/tui/components/WizardSteps.test.tsxtests/unit/cli/tui/config-force-wizard.test.tstests/unit/cli/tui/config-writer-cli.test.tstests/unit/cli/tui/config-writer-json.test.tstests/unit/cli/tui/config-writer-toml.test.tstests/unit/cli/tui/config-writer.test.tstests/unit/cli/tui/dashboard-screens.test.tsxtests/unit/cli/tui/detect-helpers.test.tstests/unit/cli/tui/entry-required-fields.test.tstests/unit/cli/tui/entry.test.tstests/unit/cli/tui/extras-prompt.test.tstests/unit/cli/tui/flags.test.tstests/unit/cli/tui/format.test.tstests/unit/cli/tui/init-config-writer.test.tstests/unit/cli/tui/mount-root-phase-sync.test.tsxtests/unit/cli/tui/plain-override.test.tstests/unit/cli/tui/reporter-auto.test.tstests/unit/cli/tui/reporter.test.tstests/unit/cli/tui/router/entry-wire.test.tsxtests/unit/cli/tui/router/ink-root.apply-verify.test.tsxtests/unit/cli/tui/router/ink-root.phase3-integration.test.tsxtests/unit/cli/tui/router/ink-root.save-state.test.tsxtests/unit/cli/tui/router/ink-root.test.tsxtests/unit/cli/tui/run-command.test.tstests/unit/cli/tui/schema/advanced.test.tstests/unit/cli/tui/schema/agents.test.tstests/unit/cli/tui/schema/browser.test.tstests/unit/cli/tui/schema/cache.test.tstests/unit/cli/tui/schema/catalog.test.tstests/unit/cli/tui/schema/llm-no-custom.test.tstests/unit/cli/tui/schema/llm.test.tstests/unit/cli/tui/schema/migrate.test.tstests/unit/cli/tui/schema/search.test.tstests/unit/cli/tui/schema/types.test.tstests/unit/cli/tui/select-agents.test.tstests/unit/cli/tui/shell/App.test.tsxtests/unit/cli/tui/shell/CommandPalette.test.tsxtests/unit/cli/tui/shell/CommandPalette.width.test.tsxtests/unit/cli/tui/shell/Footer.test.tsxtests/unit/cli/tui/shell/Header.liveness.test.tsxtests/unit/cli/tui/shell/Header.test.tsxtests/unit/cli/tui/shell/HelpOverlay.test.tsxtests/unit/cli/tui/shell/HelpOverlay.width.test.tsxtests/unit/cli/tui/shell/MainPane.test.tsxtests/unit/cli/tui/shell/MainPane.transition.test.tsxtests/unit/cli/tui/shell/Sidebar.pulse.test.tsxtests/unit/cli/tui/shell/Sidebar.quit.test.tsxtests/unit/cli/tui/shell/Sidebar.test.tsxtests/unit/cli/tui/shell/Spinner.test.tsxtests/unit/cli/tui/shell/palette-index.test.tstests/unit/cli/tui/shell/width.test.tstests/unit/cli/tui/state/activity-store.test.tstests/unit/cli/tui/state/agent-install-hints.test.tstests/unit/cli/tui/state/agent-targets.test.tstests/unit/cli/tui/state/propagation.test.tstests/unit/cli/tui/state/required-fields.test.tstests/unit/cli/tui/state/secret-store.test.tstests/unit/cli/tui/state/settings-store.blur.test.tstests/unit/cli/tui/state/settings-store.test.tstests/unit/cli/tui/state/settings-store.toast.test.tstests/unit/cli/tui/state/toast-store.action.test.tstests/unit/cli/tui/state/toast-store.test.tstests/unit/cli/tui/state/uninstall-signal.test.tstests/unit/cli/tui/status-agents.test.tstests/unit/cli/tui/status-cache.test.tstests/unit/cli/tui/status-format.test.tstests/unit/cli/tui/status-python.test.tstests/unit/cli/tui/system-check.test.tstests/unit/cli/tui/theme/borders.test.tstests/unit/cli/tui/theme/motion-guard.test.tstests/unit/cli/tui/theme/motion.test.tstests/unit/cli/tui/theme/palette.test.tstests/unit/cli/tui/tui-reporter.test.tstests/unit/cli/tui/verification.test.tsxtests/unit/cli/tui/verify-suggestions.test.tstests/unit/cli/tui/verify.test.tstests/unit/cli/tui/version.test.tstests/unit/cli/tune.test.tstests/unit/cli/uninstall.test.tstests/unit/cli/verify-command.test.tstests/unit/cli/warmup-browser-deps.test.tstests/unit/cli/warmup-embedding.test.tstests/unit/cli/warmup-firefox.test.tstests/unit/cli/warmup-force.test.tstests/unit/cli/warmup-local-llm.test.tstests/unit/cli/warmup-python-env.test.tstests/unit/cli/warmup-setup-json-contract.test.tstests/unit/cli/warmup-verify.test.tstests/unit/cli/warmup.test.tstests/unit/config-persistence.test.tstests/unit/config-search-budgets.test.tstests/unit/config.test.tstests/unit/config/crawl-pacing.test.tstests/unit/config/hardcore-mode.test.tstests/unit/config/proxy-credential-persistence.test.tstests/unit/config/proxy-credential-resolve.test.tstests/unit/config/reddit-credentials.test.tstests/unit/crawl/crawler.test.tstests/unit/crawl/dedup.test.tstests/unit/crawl/etag-incremental.test.tstests/unit/crawl/index-to-vec.test.tstests/unit/crawl/mapper.test.tstests/unit/crawl/rate-limiter.test.tstests/unit/crawl/robots.test.tstests/unit/crawl/sitemap-first.test.tstests/unit/crawl/sitemap.test.tstests/unit/crawl/url-utils.test.tstests/unit/daemon/admin-reset-integration.test.tstests/unit/daemon/admin-token.test.tstests/unit/daemon/firecrawl-compat.test.tstests/unit/daemon/health-check.test.tstests/unit/daemon/http-server.test.tstests/unit/daemon/proxy.test.tstests/unit/daemon/rest-auth.test.tstests/unit/daemon/rest-dispatch.test.tstests/unit/daemon/rest-errors.test.tstests/unit/daemon/rest-limits.test.tstests/unit/daemon/rest-openapi.test.tstests/unit/daemon/rest-router.test.tstests/unit/daemon/rest-target-guard.test.tstests/unit/daemon/rest-validate.test.tstests/unit/documentation/docker-image-tags.test.tstests/unit/embedding/background-queue.test.tstests/unit/embedding/embed-provider-resolution.test.tstests/unit/embedding/embed.test.tstests/unit/embedding/fastembed-provider-dispose.test.tstests/unit/embedding/fastembed-provider.test.tstests/unit/embedding/key-terms.test.tstests/unit/extraction/boilerplate.test.tstests/unit/extraction/brand-async.test.tstests/unit/extraction/brand-fixtures.test.tstests/unit/extraction/brand-fonts-acceptance.test.tstests/unit/extraction/brand-honesty.test.tstests/unit/extraction/brand-palette.test.tstests/unit/extraction/brand.test.tstests/unit/extraction/content-root.test.tstests/unit/extraction/defuddle.test.tstests/unit/extraction/extract.test.tstests/unit/extraction/interleaved-binding.test.tstests/unit/extraction/jsonld.test.tstests/unit/extraction/lang-hints.test.tstests/unit/extraction/list-detector.test.tstests/unit/extraction/listing-vs-grid-regression.test.tstests/unit/extraction/llm-fallback.test.tstests/unit/extraction/llm/anthropic.test.tstests/unit/extraction/llm/cache.test.tstests/unit/extraction/llm/gemini.test.tstests/unit/extraction/llm/groq.test.tstests/unit/extraction/llm/hash.test.tstests/unit/extraction/llm/openai.test.tstests/unit/extraction/llm/select.test.tstests/unit/extraction/llm/types.test.tstests/unit/extraction/markdown-sanitize.test.tstests/unit/extraction/markdown.test.tstests/unit/extraction/readability.test.tstests/unit/extraction/schema-confidence.test.tstests/unit/extraction/schema-evidence-only.test.tstests/unit/extraction/schema-truth-perf.test.tstests/unit/extraction/schema.test.tstests/unit/extraction/site-extractors/amazon.test.tstests/unit/extraction/site-extractors/docs-generic.test.tstests/unit/extraction/site-extractors/github.test.tstests/unit/extraction/site-extractors/mdn.test.tstests/unit/extraction/site-extractors/reddit.test.tstests/unit/extraction/site-extractors/stackoverflow.test.tstests/unit/extraction/site-extractors/youtube.test.tstests/unit/extraction/structured-data-logging.test.tstests/unit/extraction/structured-data.test.tstests/unit/extraction/structured.test.tstests/unit/extraction/v1/classifier.test.tstests/unit/extraction/v1/news.test.tstests/unit/extraction/v1/pdf.test.tstests/unit/extraction/v1/product.test.tstests/unit/extraction/v1/recipe.test.tstests/unit/extraction/v1/routed.test.tstests/unit/extraction/v1/schemas/Article.test.tstests/unit/extraction/v1/schemas/CodeSnippet.test.tstests/unit/extraction/v1/schemas/EventListing.test.tstests/unit/extraction/v1/schemas/JobPosting.test.tstests/unit/extraction/v1/schemas/Paper.test.tstests/unit/extraction/v1/schemas/Product.test.tstests/unit/extraction/v1/schemas/Recipe.test.tstests/unit/extraction/v1/schemas/index.test.tstests/unit/extraction/v1/schemas/local-llm.test.tstests/unit/fetch/action-executor.test.tstests/unit/fetch/ai-solve.test.tstests/unit/fetch/auth.test.tstests/unit/fetch/auto-pass.test.tstests/unit/fetch/behavior-slow-runner.test.tstests/unit/fetch/behavior.test.tstests/unit/fetch/browser-acquire.test.tstests/unit/fetch/browser-pool-multi.test.tstests/unit/fetch/browser-pool.abort.test.tstests/unit/fetch/browser-pool.cdp-direct.test.tstests/unit/fetch/browser-pool.challenge.test.tstests/unit/fetch/browser-pool.channel.test.tstests/unit/fetch/browser-pool.clearance.test.tstests/unit/fetch/browser-pool.download.test.tstests/unit/fetch/browser-pool.driver-fallback.test.tstests/unit/fetch/browser-pool.humanize.test.tstests/unit/fetch/browser-pool.hydration.test.tstests/unit/fetch/browser-pool.image-subtype.test.tstests/unit/fetch/browser-pool.navigating.test.tstests/unit/fetch/browser-pool.proxy.test.tstests/unit/fetch/browser-pool.scraping-browser.test.tstests/unit/fetch/browser-pool.stealth.test.tstests/unit/fetch/browser-pool.timeout.test.tstests/unit/fetch/browser-pool.widget-locate-budget.test.tstests/unit/fetch/browser-probe.test.tstests/unit/fetch/browser-selector.test.tstests/unit/fetch/browser-types.test.tstests/unit/fetch/cdp-client.test.tstests/unit/fetch/cdp-direct-discover-retry.test.tstests/unit/fetch/cdp-direct-egress-policy.test.tstests/unit/fetch/cdp-direct-fetch.test.tstests/unit/fetch/cdp-direct-identity.test.tstests/unit/fetch/cdp-direct.test.tstests/unit/fetch/challenge-classify.test.tstests/unit/fetch/challenge-completion.test.tstests/unit/fetch/challenge-status-distinguishable.test.tstests/unit/fetch/clearance-major-drift.test.tstests/unit/fetch/clearance-reuse.test.tstests/unit/fetch/content-check.test.tstests/unit/fetch/error-describe.test.tstests/unit/fetch/escape-hatch.test.tstests/unit/fetch/http-client.test.tstests/unit/fetch/human-solve.test.tstests/unit/fetch/hydration-probe.test.tstests/unit/fetch/playwright-tier.hydration-gate.test.tstests/unit/fetch/politeness.test.tstests/unit/fetch/proxy-credentials.test.tstests/unit/fetch/reddit-api.test.tstests/unit/fetch/reddit-url-fidelity.test.tstests/unit/fetch/redirect-guard.test.tstests/unit/fetch/resource-leak-guards.test.tstests/unit/fetch/router-antibot-domains.test.tstests/unit/fetch/router-browser-acquire.test.tstests/unit/fetch/router-challenge-status.test.tstests/unit/fetch/router-clearance-route-gate.test.tstests/unit/fetch/router-clearance.test.tstests/unit/fetch/router-escalation-tuning.test.tstests/unit/fetch/router-escape-hatch.test.tstests/unit/fetch/router-mode.test.tstests/unit/fetch/router-politeness.test.tstests/unit/fetch/router-reddit-api.test.tstests/unit/fetch/router-stealth.test.tstests/unit/fetch/router-tls.test.tstests/unit/fetch/router.test.tstests/unit/fetch/scraping-browser.test.tstests/unit/fetch/settle.test.tstests/unit/fetch/solve-ladder.test.tstests/unit/fetch/stealth-driver-test-isolation.test.tstests/unit/fetch/stealth-driver.test.tstests/unit/fetch/stealth.test.tstests/unit/fetch/tls-tier.test.tstests/unit/help-overlay.test.tsxtests/unit/helpers/wait-for.test.tstests/unit/init-flags.test.tstests/unit/instructions-v3.test.tstests/unit/instructions.test.tstests/unit/integrations/cloud/llm/text-adapters-vision.test.tstests/unit/integrations/custom-backend.test.tstests/unit/integrations/llm-retry.test.tstests/unit/integrations/llm-runner.test.tstests/unit/integrations/llm-select-seam.test.tstests/unit/integrations/local-tier.test.tstests/unit/logger-suppression.test.tstests/unit/logger.test.tstests/unit/mcp-description-budget.test.tstests/unit/package-deps.test.tstests/unit/package-metadata.test.tstests/unit/persisted-config.test.tstests/unit/plugins/example-search-engine.test.tstests/unit/plugins/loader.test.tstests/unit/plugins/registry.test.tstests/unit/plugins/validate.test.tstests/unit/providers/embed-provider-factory.test.tstests/unit/providers/extract-provider-factory.test.tstests/unit/providers/idle-unload.test.tstests/unit/providers/provider-idle-unload.test.tstests/unit/providers/rerank-provider-factory.test.tstests/unit/providers/search-provider-factory.test.tstests/unit/providers/vector-store-factory.test.tstests/unit/python-env-resolve.test.tstests/unit/python-env-venv.test.tstests/unit/python-env.test.tstests/unit/repl/commands/agent.test.tstests/unit/repl/commands/cache.test.tstests/unit/repl/commands/crawl.test.tstests/unit/repl/commands/diff.test.tstests/unit/repl/commands/extract.test.tstests/unit/repl/commands/fetch.test.tstests/unit/repl/commands/find-similar.test.tstests/unit/repl/commands/research.test.tstests/unit/repl/commands/search.test.tstests/unit/repl/commands/watch.test.tstests/unit/repl/completer.test.tstests/unit/repl/formatters.test.tstests/unit/repl/parser.test.tstests/unit/repl/shell-history-mode.test.tstests/unit/repl/shell.test.tstests/unit/research/branch-exploration.test.tstests/unit/research/brief.test.tstests/unit/research/citation-graph.test.tstests/unit/research/decompose.test.tstests/unit/research/entity-extractor.test.tstests/unit/research/gap-detection.test.tstests/unit/research/pipeline-breadth.test.tstests/unit/research/pipeline-budget.test.tstests/unit/research/pipeline-score-floor.test.tstests/unit/research/pipeline-shell-completeness.test.tstests/unit/research/pipeline-source-validation.test.tstests/unit/research/pipeline.llm-gate-keystore.test.tstests/unit/research/pipeline.local-tier.test.tstests/unit/research/pipeline.test.tstests/unit/research/render-brief.test.tstests/unit/research/source-validation.test.tstests/unit/research/synthesis-local.test.tstests/unit/research/synthesize.test.tstests/unit/response-time.test.tstests/unit/search/answer-fallback.test.tstests/unit/search/answer-synthesis-quota.test.tstests/unit/search/answer-synthesis.provider-priority.test.tstests/unit/search/answer-synthesis.test.tstests/unit/search/authority-boost.aliases.test.tstests/unit/search/authority-boost.cap.test.tstests/unit/search/brand-collision-warning.test.tstests/unit/search/burst-cascade.test.tstests/unit/search/content-fetch.test.tstests/unit/search/context-formatter.test.tstests/unit/search/core/canonical-url.test.tstests/unit/search/core/code-routing.test.tstests/unit/search/core/core-provider-collision-dispatch.test.tstests/unit/search/core/core-provider-error-intent.test.tstests/unit/search/core/core-provider-kept-zero.test.tstests/unit/search/core/core-provider-rare-variant.test.tstests/unit/search/core/core-provider-recency-backfill.test.tstests/unit/search/core/core-provider-score-floor.test.tstests/unit/search/core/core-provider-tier-budgets.test.tstests/unit/search/core/date-window.test.tstests/unit/search/core/domain-quality.test.tstests/unit/search/core/engine-quality.test.tstests/unit/search/core/error-intent.test.tstests/unit/search/core/lexical-alignment.test.tstests/unit/search/core/orchestrator-cache.test.tstests/unit/search/core/orchestrator-rank.test.tstests/unit/search/core/query-expansion.test.tstests/unit/search/core/rare-terms.test.tstests/unit/search/core/rerank-fold.test.tstests/unit/search/core/score-floor-per-engine.test.tstests/unit/search/core/score-floor.test.tstests/unit/search/core/text-tokenizer.test.tstests/unit/search/country.test.tstests/unit/search/dedup.test.tstests/unit/search/degraded-recovery.test.tstests/unit/search/engine-breaker.test.tstests/unit/search/engine-health.test.tstests/unit/search/engine-quality.test.tstests/unit/search/engine-soft-deadline.test.tstests/unit/search/engine-telemetry.test.tstests/unit/search/engine-throttle.test.tstests/unit/search/engine-warnings.test.tstests/unit/search/engines-used-semantics.test.tstests/unit/search/engines/arxiv.test.tstests/unit/search/engines/bing-decoder.test.tstests/unit/search/engines/bing-news.test.tstests/unit/search/engines/bing.test.tstests/unit/search/engines/brave-image.test.tstests/unit/search/engines/brave.test.tstests/unit/search/engines/crates-io.test.tstests/unit/search/engines/date-parsing.test.tstests/unit/search/engines/dblp.test.tstests/unit/search/engines/ddg-image.test.tstests/unit/search/engines/devdocs.test.tstests/unit/search/engines/duckduckgo.test.tstests/unit/search/engines/github-code.test.tstests/unit/search/engines/hn-algolia.test.tstests/unit/search/engines/lobsters.test.tstests/unit/search/engines/marginalia.test.tstests/unit/search/engines/mdn.test.tstests/unit/search/engines/mojeek.test.tstests/unit/search/engines/openalex.test.tstests/unit/search/engines/openreview.test.tstests/unit/search/engines/semantic-scholar.test.tstests/unit/search/engines/stackoverflow.test.tstests/unit/search/engines/wikipedia.test.tstests/unit/search/evidence-default.test.tstests/unit/search/evidence-score.test.tstests/unit/search/evidence-token-discipline.test.tstests/unit/search/evidence.test.tstests/unit/search/exact-match-pre-dedup.test.tstests/unit/search/exact-match.test.tstests/unit/search/exclude-domains.test.tstests/unit/search/expand-query.test.tstests/unit/search/favicon.test.tstests/unit/search/filters.test.tstests/unit/search/find-similar-embedding.test.tstests/unit/search/find-similar-threshold.test.tstests/unit/search/find-similar.test.tstests/unit/search/find-similar/crawl-rank.test.tstests/unit/search/find-similar/generate-search-queries.test.tstests/unit/search/find-similar/mode.test.tstests/unit/search/format-rename.test.tstests/unit/search/freshness.test.tstests/unit/search/highlights-evidence.test.tstests/unit/search/highlights.test.tstests/unit/search/hybrid/merge.test.tstests/unit/search/hybrid/router.test.tstests/unit/search/hybrid/signals.test.tstests/unit/search/include-domains-hard-filter.test.tstests/unit/search/include-images.test.tstests/unit/search/language-filter.test.tstests/unit/search/mojeek-probe-only.test.tstests/unit/search/multi-query.decompose.test.tstests/unit/search/multi-query.test.tstests/unit/search/passage-spans.test.tstests/unit/search/query-understanding.test.tstests/unit/search/query.test.tstests/unit/search/remote-rerank-provider.test.tstests/unit/search/rerank-recency.test.tstests/unit/search/rerank.test.tstests/unit/search/reranker/consensus-boost.test.tstests/unit/search/reranker/recency.test.tstests/unit/search/reranker/transformers-rerank-provider-errors.test.tstests/unit/search/rrf.test.tstests/unit/search/sampling.test.tstests/unit/search/searxng-filtering.test.tstests/unit/search/searxng-orchestrator-strip.test.tstests/unit/search/searxng.test.tstests/unit/search/time-range.test.tstests/unit/search/tokens.test.tstests/unit/search/transformers-rerank-provider.test.tstests/unit/search/truncate.test.tstests/unit/search/url-unwrap.test.tstests/unit/search/v1/context-rank.test.tstests/unit/search/v1/engine-base.test.tstests/unit/search/v1/intent-router.test.tstests/unit/search/v1/orchestrator.test.tstests/unit/search/v1/recency-boost.test.tstests/unit/search/v1/recent-cache-dedup.test.tstests/unit/search/v1/rss/feed-config.test.tstests/unit/search/v1/rss/feed-parser.test.tstests/unit/search/v1/rss/feed-poller.test.tstests/unit/search/v1/rss/feed-store.test.tstests/unit/search/v1/rss/rss-engine.test.tstests/unit/search/v1/v1-provider.test.tstests/unit/search/v1/verticals/code.test.tstests/unit/search/v1/verticals/docs.test.tstests/unit/search/v1/verticals/general.test.tstests/unit/search/v1/verticals/news.test.tstests/unit/search/v1/verticals/papers.test.tstests/unit/search/validator.test.tstests/unit/searxng/bootstrap-lock.test.tstests/unit/searxng/bootstrap-retry.test.tstests/unit/searxng/bootstrap.test.tstests/unit/searxng/docker.test.tstests/unit/searxng/enabled.test.tstests/unit/searxng/process-health.test.tstests/unit/searxng/process-lock.test.tstests/unit/searxng/process.test.tstests/unit/security/key-crypto.test.tstests/unit/security/key-store.test.tstests/unit/server/backend-status-bootstrapping.test.tstests/unit/server/backend-status.test.tstests/unit/server/format-schema.test.tstests/unit/server/instructions.test.tstests/unit/server/schema-registration.test.tstests/unit/server/search-response.test.tstests/unit/server/server-factory.test.tstests/unit/server/tool-annotations.test.tstests/unit/server/tool-schemas.test.tstests/unit/server/warmup-on-start.test.tstests/unit/setup-status.test.tstests/unit/skill-md.test.tstests/unit/sponsors-links.test.tstests/unit/tools/agent.test.tstests/unit/tools/cache-hybrid.test.tstests/unit/tools/cache.test.tstests/unit/tools/crawl-map-routing.test.tstests/unit/tools/crawl.test.tstests/unit/tools/diff.test.tstests/unit/tools/extract.body-retained.test.tstests/unit/tools/extract.test.tstests/unit/tools/fetch-embedding.test.tstests/unit/tools/fetch-mode.test.tstests/unit/tools/fetch.challenge-provenance.test.tstests/unit/tools/fetch.http-error.test.tstests/unit/tools/fetch.silent-failures.test.tstests/unit/tools/fetch.stealth-cache-bypass.test.tstests/unit/tools/fetch.test.tstests/unit/tools/find-similar.test.tstests/unit/tools/max-tokens-out.test.tstests/unit/tools/research.test.tstests/unit/tools/search-answer.test.tstests/unit/tools/search-cache-embed.test.tstests/unit/tools/search-filtering.test.tstests/unit/tools/search-max-content-chars.test.tstests/unit/tools/search-mode.test.tstests/unit/tools/search-multi-query.test.tstests/unit/tools/search-timing.test.tstests/unit/tools/search-warning.test.tstests/unit/tools/search.engine-warnings.test.tstests/unit/tools/search.images.test.tstests/unit/tools/search.long-tail-engines.test.tstests/unit/tools/search.test.tstests/unit/tui/verify-e2e.test.tstests/unit/types-multi-query.test.tstests/unit/types.test.tstests/unit/types/solve-provenance.test.tstests/unit/types/stage-result.test.tstests/unit/util/abort.test.tstests/unit/util/child-env.test.tstests/unit/util/mode.test.tstests/unit/util/native-abi.test.tstests/unit/util/redact-url.test.tstests/unit/watch/ssrf.test.tstests/unit/watch/store.test.tstests/unit/wizard-setup-complete.test.tsxtests/watch/ssrf-resolved-host.test.tstests/watch/ssrf-resolved-serve-target.test.tstsup.config.tsvitest.config.tsvitest.perf.config.ts
Files
.dockerignoreasset144 bytes.gitattributesasset845 bytes.github/FUNDING.ymlasset678 bytes.github/ISSUE_TEMPLATE/adopter.ymlasset1,442 bytes.github/ISSUE_TEMPLATE/bug_report.mddoc650 bytes.github/ISSUE_TEMPLATE/bug_report.ymlasset1,456 bytes.github/ISSUE_TEMPLATE/config.ymlasset357 bytes.github/ISSUE_TEMPLATE/feature_request.mddoc424 bytes.github/ISSUE_TEMPLATE/feature_request.ymlasset671 bytes.github/PULL_REQUEST_TEMPLATE.mddoc554 bytes.github/workflows/agent-benchmark.ymlasset1,346 bytes.github/workflows/author-guard.ymlasset2,566 bytes.github/workflows/binary-build.ymlasset10,881 bytes.github/workflows/ci.ymlasset6,950 bytes.github/workflows/docker-publish.ymlasset3,372 bytes.github/workflows/extraction-benchmark.ymlasset1,368 bytes.github/workflows/release.ymlasset9,279 bytes.github/workflows/search-benchmark.ymlasset1,328 bytes.github/workflows/site.ymlasset1,654 bytes.github/workflows/star-chart.ymlasset936 bytes.gitignoreasset826 bytesADOPTERS.mddoc651 bytesCHANGELOG.mddoc21,978 bytesCODE_OF_CONDUCT.mddoc2,904 bytesCONTRIBUTING.mddoc2,471 bytesDockerfileruns4,865 bytesLICENSEasset35,314 bytesLICENSING.mddoc1,901 bytesMakefileruns3,029 bytesREADME.mddoc29,812 bytesSECURITY.mddoc1,185 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSKILL.mdcore20,703 bytesSPONSORS.mddoc6,583 bytesTRADEMARK.mddoc1,351 bytesassets/blocks/claude-code/CLAUDE.md.blockasset3,724 bytesassets/blocks/claude-code/wigolo-command.mddoc2,057 bytesassets/blocks/codex/AGENTS.md.blockasset1,933 bytesassets/blocks/cursor/wigolo.mdcasset3,131 bytesassets/blocks/gemini-cli/GEMINI.md.blockasset2,361 bytesassets/blocks/vscode/copilot-instructions.md.blockasset1,795 bytesassets/blocks/windsurf/mcp_config.json.blockasset1,933 bytesassets/blocks/windsurf/rules-global.mddoc1,813 bytesassets/blocks/windsurf/rules-project.mddoc6,398 bytesassets/blocks/zed/settings.json.blockasset1,933 bytesassets/brand/README.mddoc1,611 bytesassets/brand/generate.cjsruns5,399 bytesassets/brand/wigolo-400.pngasset18,383 bytesassets/brand/wigolo-banner.pngasset49,924 bytesassets/brand/wigolo-icon.pngasset44,039 bytesassets/brand/wigolo-social.pngasset83,695 bytesassets/brand/wigolo-wordmark-dark.pngasset67,060 bytesassets/brand/wigolo-wordmark-light.pngasset64,593 bytesassets/legacy-skill-hashes.jsonasset5,307 bytesassets/promo/anatomy-dark.svgasset7,593 bytesassets/promo/anatomy.svgasset7,593 bytesassets/promo/ask-twice-dark.svgasset4,939 bytesassets/promo/ask-twice.svgasset4,939 bytesassets/promo/fusion-dark.svgasset8,397 bytesassets/promo/fusion.svgasset8,397 bytesassets/promo/ladder-dark.svgasset4,755 bytesassets/promo/ladder.svgasset4,755 bytesassets/promo/meter-dark.svgasset5,113 bytesassets/promo/meter.svgasset5,113 bytesassets/promo/social/ask-twice.gifasset590,190 bytesassets/promo/social/ask-twice.mp4asset175,111 bytesassets/promo/social/meter.gifasset403,787 bytesassets/promo/social/meter.mp4asset72,588 bytesassets/promo/social/wigolo-launch-60s.mp4asset642,356 bytesassets/promo/stars-dark.svgasset4,602 bytesassets/promo/stars.svgasset4,606 bytesassets/sponsors/testmu-ai-dark.svgasset8,347 bytesassets/sponsors/testmu-ai.svgasset8,307 bytesassets/wigolo-demo-poster.pngasset270,584 bytesassets/wigolo-demo.gifasset526,295 bytesassets/wigolo-demo.mp4asset244,443 bytesassets/wigolo-demo.webmasset319,226 bytesassets/wigolo-vs-poster.pngasset883,954 bytesassets/wigolo-vs.gifasset1,293,685 bytesassets/wigolo-vs.mp4asset2,286,091 bytesassets/wigolo-vs.webmasset3,650,776 bytesbenchmarks/agent/evaluator.tsruns6,047 bytesbenchmarks/agent/fixtures/expected.jsonasset3,139 bytesbenchmarks/agent/fixtures/tasks.jsonasset2,647 bytesbenchmarks/agent/metrics.tsruns3,426 bytesbenchmarks/agent/report.tsruns3,292 bytesbenchmarks/agent/runner.tsruns5,407 bytesbenchmarks/agent/task-executor.tsruns4,649 bytesbenchmarks/agent/types.tsruns2,446 bytesbenchmarks/baselines/_skip-reasons.mddoc3,339 bytesbenchmarks/baselines/extraction-pre-v1.txtdoc888 bytesbenchmarks/baselines/search-pre-v1.txtdoc973 bytesbenchmarks/baselines/v1-dependency-checks.jsonasset3,319 bytesbenchmarks/embedding/runner.tsruns9,033 bytesbenchmarks/extraction/fixtures/golden/api-001.mddoc8,052 bytesbenchmarks/extraction/fixtures/golden/article-001.mddoc5,572 bytesbenchmarks/extraction/fixtures/golden/article-002.mddoc5,995 bytesbenchmarks/extraction/fixtures/golden/article-003.mddoc6,204 bytesbenchmarks/extraction/fixtures/golden/blog-001.mddoc9,548 bytesbenchmarks/extraction/fixtures/golden/changelog-001.mddoc10,470 bytesbenchmarks/extraction/fixtures/golden/code-001.mddoc8,569 bytesbenchmarks/extraction/fixtures/golden/docs-001.mddoc5,166 bytesbenchmarks/extraction/fixtures/golden/docs-002.mddoc6,139 bytesbenchmarks/extraction/fixtures/golden/docs-003.mddoc5,873 bytesbenchmarks/extraction/fixtures/golden/example-article.mddoc445 bytesbenchmarks/extraction/fixtures/golden/github-001.mddoc4,860 bytesbenchmarks/extraction/fixtures/golden/github-002.mddoc4,337 bytesbenchmarks/extraction/fixtures/golden/github-003.mddoc5,496 bytesbenchmarks/extraction/fixtures/golden/reference-001.mddoc8,708 bytesbenchmarks/extraction/fixtures/golden/so-001.mddoc4,922 bytesbenchmarks/extraction/fixtures/golden/so-002.mddoc6,085 bytesbenchmarks/extraction/fixtures/golden/spa-001.mddoc3,226 bytesbenchmarks/extraction/fixtures/golden/table-001.mddoc5,715 bytesbenchmarks/extraction/fixtures/golden/tutorial-001.mddoc12,008 bytesbenchmarks/extraction/fixtures/golden/wiki-001.mddoc10,556 bytesbenchmarks/extraction/fixtures/manifest.jsonasset6,213 bytesbenchmarks/extraction/metrics.tsruns3,887 bytesbenchmarks/extraction/per-category.tsruns7,157 bytesbenchmarks/extraction/report.tsruns7,627 bytesbenchmarks/extraction/runner.tsruns6,931 bytesbenchmarks/extraction/tokenizer.tsruns3,923 bytesbenchmarks/extraction/types.tsruns1,981 bytesbenchmarks/perf/tool-latency.tsruns7,011 bytesbenchmarks/search/fixtures/queries.jsonasset4,001 bytesbenchmarks/search/fixtures/relevance.jsonasset6,079 bytesbenchmarks/search/metrics.tsruns5,398 bytesbenchmarks/search/mock-engine.tsruns2,826 bytesbenchmarks/search/report.tsruns6,900 bytesbenchmarks/search/rerank-quality.tsruns7,797 bytesbenchmarks/search/runner.tsruns6,026 bytesbenchmarks/search/types.tsruns1,954 bytesdocs/README.mddoc2,750 bytesdocs/cli.mddoc7,702 bytesdocs/configuration.mddoc12,547 bytesdocs/getting-started.mddoc3,719 bytesdocs/installation.mddoc5,377 bytesdocs/plugins.mddoc3,376 bytesdocs/privacy-security.mddoc5,009 bytesdocs/rest-api.mddoc6,213 bytesdocs/sdks.mddoc6,363 bytesdocs/self-hosting.mddoc6,571 bytesdocs/skills.mddoc4,202 bytesdocs/tools.mddoc13,883 bytesdocs/troubleshooting.mddoc13,087 bytesexamples/README.mddoc2,783 bytesexamples/n8n-remote-mcp/README.mddoc4,642 bytesexamples/n8n-remote-mcp/workflow.jsonasset1,458 bytesexamples/one-shot-cli/README.mddoc3,089 bytesexamples/one-shot-cli/demo.gifasset217,199 bytesexamples/one-shot-cli/demo.tapeasset1,150 bytesexamples/one-shot-cli/run.shruns875 bytesexamples/plugin-search-engine/README.mddoc273 bytesexamples/plugin-search-engine/index.mjsruns363 bytesexamples/plugin-search-engine/package.jsonruns109 bytesexamples/quickstart-claude-code/README.mddoc2,155 bytesexamples/quickstart-claude-code/demo.gifasset367,433 bytesexamples/quickstart-claude-code/demo.tapeasset1,104 bytesexamples/rest-curl/README.mddoc2,949 bytesexamples/rest-curl/demo.shruns1,963 bytesexamples/sdk-python-agent/README.mddoc2,607 bytesexamples/sdk-python-agent/gather.pyruns1,857 bytesexamples/sdk-typescript-research/README.mddoc2,848 bytesexamples/sdk-typescript-research/package-lock.jsonasset583 bytesexamples/sdk-typescript-research/package.jsonruns188 bytesexamples/sdk-typescript-research/research.mjsruns1,237 bytesexamples/shell-ndjson-pipeline/README.mddoc2,555 bytesexamples/shell-ndjson-pipeline/demo.gifasset105,221 bytesexamples/shell-ndjson-pipeline/demo.tapeasset1,062 bytesexamples/shell-ndjson-pipeline/pipeline.shruns1,306 bytesexamples/vercel-ai-sdk-tools/README.mddoc2,919 bytesexamples/vercel-ai-sdk-tools/package-lock.jsonasset11,019 bytesexamples/vercel-ai-sdk-tools/package.jsonruns333 bytesexamples/vercel-ai-sdk-tools/tools.tsruns2,067 bytesexamples/vercel-ai-sdk-tools/tsconfig.jsonasset211 bytesexamples/watch-changelog-webhook/README.mddoc3,213 bytesexamples/watch-changelog-webhook/watch.shruns1,749 bytesglama.jsonasset101 bytesllms.txtdoc2,860 bytesmcp.jsonasset103 bytesmcpb/manifest.jsonasset1,189 bytesmcpb/server/index.cjsruns518 bytespackage-lock.jsonasset354,976 bytespackage.jsonruns4,038 bytespackages/wigolo-crewai/README.mddoc2,526 bytespackages/wigolo-crewai/pyproject.tomlasset1,298 bytespackages/wigolo-crewai/tests/__init__.pyruns0 bytespackages/wigolo-crewai/tests/conftest.pyruns1,792 bytespackages/wigolo-crewai/tests/test_core.pyruns4,095 bytespackages/wigolo-crewai/tests/test_tools.pyruns2,409 bytespackages/wigolo-crewai/wigolo_crewai/__init__.pyruns1,889 bytespackages/wigolo-crewai/wigolo_crewai/_core.pyruns5,134 bytespackages/wigolo-crewai/wigolo_crewai/tools.pyruns4,449 bytespackages/wigolo-crewai/wigolo_crewai/types.pyruns4,194 bytespackages/wigolo-langchain/README.mddoc2,437 bytespackages/wigolo-langchain/pyproject.tomlasset1,283 bytespackages/wigolo-langchain/tests/__init__.pyruns0 bytespackages/wigolo-langchain/tests/conftest.pyruns4,505 bytespackages/wigolo-langchain/tests/test_client.pyruns8,335 bytespackages/wigolo-langchain/tests/test_retrievers.pyruns6,179 bytespackages/wigolo-langchain/tests/test_tools.pyruns7,759 bytespackages/wigolo-langchain/wigolo_langchain/__init__.pyruns538 bytespackages/wigolo-langchain/wigolo_langchain/client.pyruns8,266 bytespackages/wigolo-langchain/wigolo_langchain/retrievers.pyruns4,162 bytespackages/wigolo-langchain/wigolo_langchain/tools.pyruns7,865 bytespackages/wigolo-langchain/wigolo_langchain/types.pyruns3,827 bytespackages/wigolo-llamaindex/README.mddoc3,253 bytespackages/wigolo-llamaindex/pyproject.tomlasset1,289 bytespackages/wigolo-llamaindex/tests/__init__.pyruns1 bytespackages/wigolo-llamaindex/tests/conftest.pyruns4,458 bytespackages/wigolo-llamaindex/tests/test_client.pyruns6,501 bytespackages/wigolo-llamaindex/tests/test_reader.pyruns11,060 bytespackages/wigolo-llamaindex/wigolo_llamaindex/__init__.pyruns288 bytespackages/wigolo-llamaindex/wigolo_llamaindex/client.pyruns7,961 bytespackages/wigolo-llamaindex/wigolo_llamaindex/reader.pyruns7,601 bytespackages/wigolo-llamaindex/wigolo_llamaindex/types.pyruns1,396 bytespackages/wigolo-vercel-ai-sdk/README.mddoc2,683 bytespackages/wigolo-vercel-ai-sdk/package-lock.jsonasset23,040 bytespackages/wigolo-vercel-ai-sdk/package.jsonruns1,056 bytespackages/wigolo-vercel-ai-sdk/src/client.tsruns6,338 bytespackages/wigolo-vercel-ai-sdk/src/index.tsruns659 bytespackages/wigolo-vercel-ai-sdk/src/tools.tsruns8,650 bytespackages/wigolo-vercel-ai-sdk/src/types.tsruns1,794 bytespackages/wigolo-vercel-ai-sdk/tests/client.test.tsruns9,871 bytespackages/wigolo-vercel-ai-sdk/tests/tools.test.tsruns7,713 bytespackages/wigolo-vercel-ai-sdk/tsconfig.jsonasset487 bytespackages/wigolo-vercel-ai-sdk/vitest.config.tsruns153 bytespackaging/RELEASE-RUNBOOK.mddoc4,240 bytespackaging/binary/bundle.mjsruns3,094 bytespackaging/binary/pack.shruns2,653 bytespackaging/binary/pkg.config.jsonasset1,762 bytespackaging/binary/react-devtools-core-stub.mjsruns489 bytespackaging/compose.serve.ymlasset2,872 bytespackaging/homebrew/wigolo.rbruns2,639 bytespackaging/install.shruns13,578 bytespackaging/verification/binary.mddoc7,316 bytespackaging/verification/brew.mddoc4,688 bytespackaging/verification/docker.mddoc6,104 bytespackaging/verification/npm.mddoc3,292 bytespackaging/verification/sh.mddoc3,481 bytesscripts/gen-legacy-skill-hashes.mjsruns3,186 bytesscripts/release-sponsor-notes.tsruns355 bytesscripts/run-sdk-py-tests.mjsruns813 bytesscripts/star-chart.mjsruns9,750 bytesscripts/verify-channel-binary.shruns7,634 bytesscripts/verify-channel-brew.shruns3,905 bytesscripts/verify-channel-docker.shruns11,264 bytesscripts/verify-channel-npm.shruns2,986 bytesscripts/verify-channel-rest.shruns14,302 bytesscripts/verify-channel-sh.shruns3,772 bytesscripts/verify-sdks.shruns873 bytessdks/python/.gitignoreasset52 bytessdks/python/LICENSEasset35,314 bytessdks/python/README.mddoc6,068 bytessdks/python/conftest.pyruns342 bytessdks/python/pyproject.tomlasset646 bytessdks/python/src/wigolo/__init__.pyruns692 bytessdks/python/src/wigolo/_aio.pyruns15,668 bytessdks/python/src/wigolo/_client.pyruns24,566 bytessdks/python/src/wigolo/_errors.pyruns1,757 bytessdks/python/src/wigolo/_local.pyruns15,512 bytessdks/python/src/wigolo/_manifest.pyruns7,751 bytessdks/python/src/wigolo/py.typedasset0 bytessdks/python/tests/_fake_serve.pyruns3,282 bytessdks/python/tests/conftest.pyruns4,323 bytessdks/python/tests/test_integration.pyruns8,129 bytessdks/python/tests/test_integration_local.pyruns5,545 bytessdks/python/tests/test_package_build.pyruns1,648 bytessdks/python/tests/test_runtime_drift.pyruns3,933 bytessdks/python/tests/test_unit_async.pyruns2,675 bytessdks/python/tests/test_unit_env_and_surface.pyruns3,682 bytessdks/python/tests/test_unit_local.pyruns5,931 bytessdks/python/tests/test_unit_transport.pyruns9,676 bytessdks/typescript/.gitignoreasset26 bytessdks/typescript/LICENSEasset35,314 bytessdks/typescript/README.mddoc5,526 bytessdks/typescript/package-lock.jsonasset42,089 bytessdks/typescript/package.jsonruns943 bytessdks/typescript/src/client.tsruns11,807 bytessdks/typescript/src/errors.tsruns2,222 bytessdks/typescript/src/index.tsruns651 bytessdks/typescript/src/local.tsruns15,455 bytessdks/typescript/src/manifest.tsruns5,733 bytessdks/typescript/src/node-shims.d.tsruns1,812 bytessdks/typescript/src/types.tsruns8,417 bytessdks/typescript/tests/client.unit.test.tsruns8,369 bytessdks/typescript/tests/drift.type-test.tsruns4,075 bytessdks/typescript/tests/embedded.test.tsruns4,003 bytessdks/typescript/tests/helpers.tsruns1,609 bytessdks/typescript/tests/integration.test.tsruns7,000 bytessdks/typescript/tests/local.unit.test.tsruns8,343 bytessdks/typescript/tests/runtime-drift.test.tsruns4,347 bytessdks/typescript/tests/serve-harness.tsruns4,991 bytessdks/typescript/tsconfig.base.jsonasset343 bytessdks/typescript/tsconfig.jsonasset133 bytessdks/typescript/tsconfig.test.jsonasset179 bytessdks/typescript/vitest.config.tsruns445 bytessite/.gitignoreasset566 bytessite/AGENTS.mddoc327 bytessite/README.mddoc4,522 bytessite/eslint.config.mjsruns465 bytessite/next.config.mjsruns714 bytessite/package-lock.jsonasset433,764 bytessite/package.jsonruns1,216 bytessite/postcss.config.mjsruns411 bytessite/public/30849d3da27331f132af2733fb7a845b.txtdoc32 bytessite/public/CNAMEasset11 bytessite/public/googlecee3369f8bd7780f.htmlasset53 bytessite/public/logos/aws.pngasset1,985 bytessite/public/logos/capgemini.pngasset1,761 bytessite/public/logos/didi.pngasset887 bytessite/public/logos/microsoft.pngasset426 bytessite/public/logos/oracle.pngasset1,659 bytessite/public/logos/tencent.pngasset1,541 bytessite/public/promo/anatomy-dark.svgasset7,593 bytessite/public/promo/anatomy.svgasset7,593 bytessite/public/promo/ask-twice-dark.svgasset4,939 bytessite/public/promo/ask-twice.svgasset4,939 bytessite/public/promo/fusion-dark.svgasset8,397 bytessite/public/promo/fusion.svgasset8,397 bytessite/public/promo/ladder-dark.svgasset4,755 bytessite/public/promo/ladder.svgasset4,755 bytessite/public/promo/meter-dark.svgasset5,113 bytessite/public/promo/meter.svgasset5,113 bytessite/public/sponsors/testmu-ai-dark.svgasset8,347 bytessite/public/sponsors/testmu-ai.svgasset8,307 bytessite/public/wigolo/wigolo-demo-poster.pngasset270,584 bytessite/public/wigolo/wigolo-demo.mp4asset244,443 bytessite/public/wigolo/wigolo-demo.webmasset319,226 bytessite/public/wigolo/wigolo-icon.pngasset44,039 bytessite/public/wigolo/wigolo-social.pngasset83,695 bytessite/public/wigolo/wigolo-wordmark-dark.pngasset67,060 bytessite/public/wigolo/wigolo-wordmark-light.pngasset64,593 bytessite/scripts/indexnow.mjsruns1,713 bytessite/scripts/logo-wall/fetch-logos.mjsruns5,506 bytessite/scripts/logo-wall/mine.mjsruns7,733 bytessite/scripts/logo-wall/normalize.mjsruns4,128 bytessite/scripts/logo-wall/normalize.test.mjsruns2,402 bytessite/scripts/logo-wall/silhouette.mjsruns2,606 bytessite/scripts/logo-wall/silhouette.test.mjsruns1,969 bytessite/scripts/sync-content.mjsruns9,623 bytessite/scripts/sync-content.test.mjsruns4,206 bytessite/src/app/alternatives/[slug]/page.tsxruns7,308 bytessite/src/app/alternatives/page.tsxruns2,323 bytessite/src/app/docs/[[...slug]]/page.tsxruns2,404 bytessite/src/app/docs/docs.cssasset1,529 bytessite/src/app/docs/layout.tsxruns1,162 bytessite/src/app/favicon.icoasset25,931 bytessite/src/app/globals.cssasset3,167 bytessite/src/app/go/[slug]/SponsorCard.tsxruns1,185 bytessite/src/app/go/[slug]/SponsorRedirect.module.cssasset1,192 bytessite/src/app/go/[slug]/SponsorRedirect.tsxruns1,278 bytessite/src/app/go/[slug]/page.tsxruns1,751 bytessite/src/app/layout.tsxruns2,947 bytessite/src/app/llms-full.txt/route.tsruns215 bytessite/src/app/llms.txt/route.tsruns205 bytessite/src/app/logo-wall.svg/route.tsruns614 bytessite/src/app/page.tsxruns1,359 bytessite/src/app/robots.tsruns581 bytessite/src/app/search.json/route.tsruns229 bytessite/src/app/sitemap.tsruns1,379 bytessite/src/app/sponsors/page.tsxruns7,007 bytessite/src/app/sponsors/sponsors.module.cssasset1,258 bytessite/src/components/Analytics.tsxruns1,456 bytessite/src/components/AnnouncementBar.module.cssasset842 bytessite/src/components/AnnouncementBar.tsxruns910 bytessite/src/components/FeatureMarquee.module.cssasset998 bytessite/src/components/FeatureMarquee.tsxruns1,062 bytessite/src/components/Feedback.module.cssasset2,188 bytessite/src/components/Feedback.tsxruns3,466 bytessite/src/components/Footer.module.cssasset1,420 bytessite/src/components/Footer.tsxruns3,975 bytessite/src/components/Hero.module.cssasset2,780 bytessite/src/components/Hero.tsxruns3,491 bytessite/src/components/HowItWorks.module.cssasset3,398 bytessite/src/components/HowItWorks.tsxruns7,149 bytessite/src/components/LogoWall.module.cssasset3,215 bytessite/src/components/LogoWall.tsxruns3,007 bytessite/src/components/Nav.module.cssasset4,007 bytessite/src/components/Nav.tsxruns3,235 bytessite/src/components/OpenSource.module.cssasset1,911 bytessite/src/components/OpenSource.tsxruns2,819 bytessite/src/components/Parity.module.cssasset2,436 bytessite/src/components/Parity.tsxruns4,817 bytessite/src/components/Quickstart.module.cssasset3,498 bytessite/src/components/Quickstart.tsxruns3,797 bytessite/src/components/Reveal.tsxruns1,098 bytessite/src/components/SponsorStrip.module.cssasset587 bytessite/src/components/SponsorStrip.tsxruns1,354 bytessite/src/components/Sponsors.module.cssasset2,368 bytessite/src/components/Sponsors.tsxruns2,446 bytessite/src/components/StartShipping.module.cssasset853 bytessite/src/components/StartShipping.tsxruns1,472 bytessite/src/components/Stats.module.cssasset667 bytessite/src/components/Stats.tsxruns668 bytessite/src/components/Testimonials.module.cssasset1,781 bytessite/src/components/Testimonials.tsxruns3,078 bytessite/src/components/Tools.module.cssasset4,338 bytessite/src/components/Tools.tsxruns10,583 bytessite/src/components/TrustedBy.module.cssasset1,169 bytessite/src/components/TrustedBy.tsxruns751 bytessite/src/components/alternatives/Alternatives.module.cssasset3,385 bytessite/src/components/alternatives/Inline.tsxruns447 bytessite/src/components/docs/SearchDialog.tsxruns1,259 bytessite/src/content/alternatives.tsruns12,065 bytessite/src/content/llms-preamble.mddoc4,805 bytessite/src/content/logo-wall/companies.jsonasset8,254 bytessite/src/content/logo-wall/rasters.jsonasset276 bytessite/src/lib/analytics.tsruns2,022 bytessite/src/lib/jsonld.tsruns2,314 bytessite/src/lib/lastmod.tsruns824 bytessite/src/lib/llms.tsruns2,537 bytessite/src/lib/logo-wall.tsruns4,974 bytessite/src/lib/site.tsruns743 bytessite/src/lib/source.tsruns480 bytessite/src/lib/sponsors.tsruns4,847 bytessite/src/lib/stats.tsruns936 bytessite/tests/alternatives.test.tsruns1,461 bytessite/tests/analytics.test.tsruns2,494 bytessite/tests/logo-wall.test.tsruns2,530 bytessite/tsconfig.jsonasset670 bytessite/vitest.config.mtsruns268 bytessmithery.yamlasset634 bytessrc/agent/executor.tsruns10,657 bytessrc/agent/pipeline.tsruns17,985 bytessrc/agent/planner.tsruns8,473 bytessrc/agent/rank.tsruns1,268 bytessrc/agent/relevance.tsruns1,675 bytessrc/cache/backfill-embeddings.tsruns4,206 bytessrc/cache/change-detector.tsruns2,483 bytessrc/cache/db.tsruns9,420 bytessrc/cache/diff-engine.tsruns23,378 bytessrc/cache/diff-summary.tsruns2,815 bytessrc/cache/lcs.tsruns1,797 bytessrc/cache/migrations/001-sqlite-vec.sqlasset1,059 bytessrc/cache/migrations/002-feed-items.sqlasset1,371 bytessrc/cache/migrations/003-crawl-etags.sqlasset573 bytessrc/cache/migrations/004-watch-jobs.sqlasset698 bytessrc/cache/migrations/005-tls-routing.sqlasset837 bytessrc/cache/migrations/006-url-cache-http-status.sqlasset462 bytessrc/cache/migrations/007-drop-lp-routing.sqlasset262 bytessrc/cache/migrations/008-antibot-clearance.sqlasset1,251 bytessrc/cache/migrations/010-clearance-route.sqlasset687 bytessrc/cache/migrations/runner.tsruns14,113 bytessrc/cache/sqlite-vec-store.tsruns8,346 bytessrc/cache/store.tsruns37,129 bytessrc/cli/agents/antigravity.tsruns1,799 bytessrc/cli/agents/claude-code.tsruns4,364 bytessrc/cli/agents/cline.tsruns2,218 bytessrc/cli/agents/codex.tsruns3,310 bytessrc/cli/agents/cursor.tsruns1,831 bytessrc/cli/agents/gemini-cli.tsruns1,826 bytessrc/cli/agents/opencode.tsruns8,785 bytessrc/cli/agents/registry.tsruns1,460 bytessrc/cli/agents/skills/catalog.tsruns4,944 bytessrc/cli/agents/skills/executor.tsruns29,906 bytessrc/cli/agents/skills/index.tsruns798 bytessrc/cli/agents/skills/planner.tsruns14,121 bytessrc/cli/agents/skills/receipts.tsruns9,404 bytessrc/cli/agents/skills/snapshot.tsruns2,022 bytessrc/cli/agents/skills/targets.tsruns3,984 bytessrc/cli/agents/skills/types.tsruns4,841 bytessrc/cli/agents/utils.tsruns7,460 bytessrc/cli/agents/vscode.tsruns3,599 bytessrc/cli/agents/windsurf.tsruns2,026 bytessrc/cli/agents/zed.tsruns2,091 bytessrc/cli/auth.tsruns3,807 bytessrc/cli/backfill.tsruns2,615 bytessrc/cli/config.tsruns17,804 bytessrc/cli/daemon.tsruns6,371 bytessrc/cli/doctor.tsruns56,413 bytessrc/cli/flag-bridge.tsruns15,729 bytessrc/cli/health.tsruns2,060 bytessrc/cli/help.tsruns10,624 bytessrc/cli/index.tsruns1,663 bytessrc/cli/init.tsruns34,046 bytessrc/cli/mcp.tsruns1,142 bytessrc/cli/ollama-probe.tsruns2,907 bytessrc/cli/plugin.tsruns10,848 bytessrc/cli/setup-mcp.tsruns4,889 bytessrc/cli/shell.tsruns4,437 bytessrc/cli/shutdown.tsruns1,215 bytessrc/cli/skills.tsruns17,083 bytessrc/cli/status.tsruns1,573 bytessrc/cli/telemetry.tsruns2,388 bytessrc/cli/tool-run.tsruns7,983 bytessrc/cli/tui/actions/cache-stats.tsruns940 bytessrc/cli/tui/actions/cleanup.tsruns2,137 bytessrc/cli/tui/actions/compute-storage.tsruns2,568 bytessrc/cli/tui/actions/detect-system.tsruns1,507 bytessrc/cli/tui/actions/export-import-config.tsruns5,255 bytessrc/cli/tui/actions/headless-set.tsruns7,756 bytessrc/cli/tui/actions/index.tsruns3,357 bytessrc/cli/tui/actions/provider-keys.tsruns6,029 bytessrc/cli/tui/actions/setup-status.tsruns11,568 bytessrc/cli/tui/actions/types.tsruns1,071 bytessrc/cli/tui/actions/uninstall.tsruns4,789 bytessrc/cli/tui/actions/verify-e2e.tsruns19,331 bytessrc/cli/tui/actions/verify-router.tsruns797 bytessrc/cli/tui/actions/write-config.tsruns3,389 bytessrc/cli/tui/agents-types.tsruns848 bytessrc/cli/tui/agents.tsruns3,724 bytessrc/cli/tui/banner.tsruns1,061 bytessrc/cli/tui/components/ActionBar.tsxruns1,185 bytessrc/cli/tui/components/Banner.tsxruns767 bytessrc/cli/tui/components/CategoryScreen.tsxruns9,750 bytessrc/cli/tui/components/DashboardExport.tsxruns4,470 bytessrc/cli/tui/components/DashboardUninstall.tsxruns4,166 bytessrc/cli/tui/components/DoctorScreen.tsxruns2,953 bytessrc/cli/tui/components/FieldRenderer.tsxruns17,731 bytessrc/cli/tui/components/ImportScreen.tsxruns8,805 bytessrc/cli/tui/components/SettingsHome.tsxruns9,921 bytessrc/cli/tui/components/Verification.tsxruns4,742 bytessrc/cli/tui/components/VerifyScreen.tsxruns1,605 bytessrc/cli/tui/components/WizardSteps.tsxruns20,095 bytessrc/cli/tui/config-writer-cli.tsruns1,964 bytessrc/cli/tui/config-writer-json.tsruns21,559 bytessrc/cli/tui/config-writer-toml.tsruns2,965 bytessrc/cli/tui/config-writer.tsruns5,377 bytessrc/cli/tui/detect-helpers.tsruns1,043 bytessrc/cli/tui/entry.tsruns9,579 bytessrc/cli/tui/extras-prompt.tsruns4,068 bytessrc/cli/tui/flags-types.tsruns2,089 bytessrc/cli/tui/flags.tsruns7,056 bytessrc/cli/tui/format.tsruns762 bytessrc/cli/tui/hooks/useVerify.tsruns2,469 bytessrc/cli/tui/reporter-auto.tsruns679 bytessrc/cli/tui/reporter.tsruns1,625 bytessrc/cli/tui/router/ink.tsxruns16,185 bytessrc/cli/tui/run-command.tsruns2,282 bytessrc/cli/tui/schema/advanced.tsruns1,848 bytessrc/cli/tui/schema/agents.tsruns740 bytessrc/cli/tui/schema/browser.tsruns1,054 bytessrc/cli/tui/schema/cache.tsruns902 bytessrc/cli/tui/schema/catalog.tsruns485 bytessrc/cli/tui/schema/llm.tsruns1,415 bytessrc/cli/tui/schema/migrate.tsruns1,781 bytessrc/cli/tui/schema/search.tsruns1,781 bytessrc/cli/tui/schema/types.tsruns1,046 bytessrc/cli/tui/select-agents.tsruns889 bytessrc/cli/tui/shell/App.tsxruns4,720 bytessrc/cli/tui/shell/CommandPalette.tsxruns4,001 bytessrc/cli/tui/shell/Footer.tsxruns2,476 bytessrc/cli/tui/shell/Header.tsxruns3,458 bytessrc/cli/tui/shell/HelpOverlay.tsxruns1,643 bytessrc/cli/tui/shell/MainPane.tsxruns1,416 bytessrc/cli/tui/shell/Sidebar.tsxruns4,515 bytessrc/cli/tui/shell/Spinner.tsxruns506 bytessrc/cli/tui/shell/palette-index.tsruns1,829 bytessrc/cli/tui/shell/width.tsruns629 bytessrc/cli/tui/state/activity-store-instance.tsruns185 bytessrc/cli/tui/state/activity-store.tsruns732 bytessrc/cli/tui/state/agent-install-hints.tsruns2,317 bytessrc/cli/tui/state/agent-targets.tsruns5,605 bytessrc/cli/tui/state/propagation.tsruns21,372 bytessrc/cli/tui/state/required-fields.tsruns2,070 bytessrc/cli/tui/state/secret-store.tsruns3,747 bytessrc/cli/tui/state/settings-store.tsruns3,560 bytessrc/cli/tui/state/toast-store-instance.tsruns164 bytessrc/cli/tui/state/toast-store.tsruns2,783 bytessrc/cli/tui/state/uninstall-signal.tsruns164 bytessrc/cli/tui/status-agents.tsruns3,937 bytessrc/cli/tui/status-cache.tsruns1,098 bytessrc/cli/tui/status-format.tsruns1,710 bytessrc/cli/tui/status-python.tsruns1,115 bytessrc/cli/tui/system-check.tsruns4,196 bytessrc/cli/tui/theme/borders.tsruns239 bytessrc/cli/tui/theme/motion-guard.tsruns250 bytessrc/cli/tui/theme/motion.tsruns203 bytessrc/cli/tui/theme/palette.tsruns578 bytessrc/cli/tui/tui-reporter.tsruns2,783 bytessrc/cli/tui/utils/config-writer.tsruns827 bytessrc/cli/tui/utils/suppress-logs.tsruns173 bytessrc/cli/tui/verify-suggestions.tsruns1,026 bytessrc/cli/tui/verify.tsruns5,969 bytessrc/cli/tui/version.tsruns336 bytessrc/cli/tune.tsruns5,845 bytessrc/cli/uninstall.tsruns7,651 bytessrc/cli/verify.tsruns2,136 bytessrc/cli/warmup.tsruns24,469 bytessrc/config.tsruns42,104 bytessrc/crawl/crawler.tsruns14,777 bytessrc/crawl/dedup.tsruns5,604 bytessrc/crawl/etag-incremental.tsruns5,127 bytessrc/crawl/index-to-vec.tsruns2,721 bytessrc/crawl/mapper.tsruns6,619 bytessrc/crawl/rate-limiter.tsruns7,208 bytessrc/crawl/robots.tsruns1,889 bytessrc/crawl/sitemap-first.tsruns2,239 bytessrc/crawl/sitemap.tsruns3,207 bytessrc/crawl/url-utils.tsruns2,955 bytessrc/daemon/admin-token.tsruns2,262 bytessrc/daemon/health-check.tsruns2,271 bytessrc/daemon/http-server.tsruns19,540 bytessrc/daemon/proxy.tsruns2,958 bytessrc/daemon/rest/auth.tsruns5,651 bytessrc/daemon/rest/dispatch.tsruns10,343 bytessrc/daemon/rest/errors.tsruns5,859 bytessrc/daemon/rest/firecrawl-compat.tsruns19,650 bytessrc/daemon/rest/limits.tsruns5,549 bytessrc/daemon/rest/openapi.tsruns14,015 bytessrc/daemon/rest/router.tsruns10,560 bytessrc/daemon/rest/target-guard.tsruns1,839 bytessrc/daemon/rest/validate.tsruns2,865 bytessrc/embedding/background-queue.tsruns7,029 bytessrc/embedding/embed.tsruns12,636 bytessrc/embedding/fastembed-provider.tsruns8,612 bytessrc/embedding/key-terms.tsruns4,757 bytessrc/extraction/boilerplate.tsruns2,539 bytessrc/extraction/brand-palette.tsruns12,178 bytessrc/extraction/brand-provenance.tsruns1,417 bytessrc/extraction/brand.tsruns45,036 bytessrc/extraction/defuddle.tsruns874 bytessrc/extraction/div-grid.tsruns16,639 bytessrc/extraction/extract.tsruns16,234 bytessrc/extraction/jsonld.tsruns2,134 bytessrc/extraction/lang-hints.tsruns665 bytessrc/extraction/list.tsruns11,304 bytessrc/extraction/llm-fallback.tsruns5,508 bytessrc/extraction/markdown-sanitize.tsruns4,212 bytessrc/extraction/markdown.tsruns8,344 bytessrc/extraction/metadata.tsruns2,329 bytessrc/extraction/pipeline.tsruns3,136 bytessrc/extraction/readability.tsruns932 bytessrc/extraction/schema-truth.tsruns6,442 bytessrc/extraction/schema.tsruns18,069 bytessrc/extraction/site-extractors/amazon.tsruns17,365 bytessrc/extraction/site-extractors/docs-generic.tsruns3,030 bytessrc/extraction/site-extractors/github.tsruns9,549 bytessrc/extraction/site-extractors/mdn.tsruns2,474 bytessrc/extraction/site-extractors/reddit.tsruns10,784 bytessrc/extraction/site-extractors/stackoverflow.tsruns3,409 bytessrc/extraction/site-extractors/youtube.tsruns14,546 bytessrc/extraction/structured-data.tsruns6,262 bytessrc/extraction/structured.tsruns8,761 bytessrc/extraction/v1/classifier.tsruns3,549 bytessrc/extraction/v1/content-root.tsruns3,137 bytessrc/extraction/v1/extract-provider.tsruns2,326 bytessrc/extraction/v1/local-llm.tsruns5,355 bytessrc/extraction/v1/news.tsruns1,975 bytessrc/extraction/v1/product.tsruns5,869 bytessrc/extraction/v1/recipe.tsruns4,429 bytessrc/extraction/v1/routed.tsruns5,648 bytessrc/extraction/v1/schemas/Article.tsruns5,011 bytessrc/extraction/v1/schemas/CodeSnippet.tsruns3,148 bytessrc/extraction/v1/schemas/EventListing.tsruns4,415 bytessrc/extraction/v1/schemas/JobPosting.tsruns7,427 bytessrc/extraction/v1/schemas/Paper.tsruns5,551 bytessrc/extraction/v1/schemas/Product.tsruns5,487 bytessrc/extraction/v1/schemas/Recipe.tsruns5,632 bytessrc/extraction/v1/schemas/index.tsruns1,786 bytessrc/extraction/v1/site-extractors.tsruns1,809 bytessrc/fetch/action-executor.tsruns4,047 bytessrc/fetch/ai-solve.tsruns10,516 bytessrc/fetch/auth.tsruns2,316 bytessrc/fetch/auto-pass.tsruns7,151 bytessrc/fetch/behavior.tsruns7,829 bytessrc/fetch/browser-acquire.tsruns11,776 bytessrc/fetch/browser-pool.tsruns78,556 bytessrc/fetch/browser-probe.tsruns2,855 bytessrc/fetch/browser-selector.tsruns2,231 bytessrc/fetch/browser-types.tsruns1,475 bytessrc/fetch/cdp-client.tsruns3,361 bytessrc/fetch/cdp-direct.tsruns48,942 bytessrc/fetch/challenge-classify.tsruns16,966 bytessrc/fetch/challenge-completion.tsruns3,441 bytessrc/fetch/clearance-reuse.tsruns6,461 bytessrc/fetch/content-check.tsruns4,892 bytessrc/fetch/error-describe.tsruns2,921 bytessrc/fetch/escape-hatch.tsruns12,471 bytessrc/fetch/http-client.tsruns15,578 bytessrc/fetch/human-solve.tsruns5,353 bytessrc/fetch/hydration-probe.tsruns15,128 bytessrc/fetch/pinned-dispatcher.tsruns4,690 bytessrc/fetch/playwright-tier.tsruns3,954 bytessrc/fetch/politeness.tsruns1,991 bytessrc/fetch/proxy-credentials.tsruns3,806 bytessrc/fetch/reddit-api.tsruns19,591 bytessrc/fetch/router.tsruns72,462 bytessrc/fetch/scraping-browser.tsruns7,480 bytessrc/fetch/settle.tsruns8,654 bytessrc/fetch/solve-ladder.tsruns5,711 bytessrc/fetch/stealth.tsruns14,030 bytessrc/fetch/tls-tier.tsruns32,465 bytessrc/index.tsruns5,471 bytessrc/instructions.tsruns28,684 bytessrc/integrations/cloud/llm/anthropic.tsruns1,378 bytessrc/integrations/cloud/llm/cache.tsruns1,572 bytessrc/integrations/cloud/llm/custom-backend.tsruns5,367 bytessrc/integrations/cloud/llm/gemini.tsruns1,038 bytessrc/integrations/cloud/llm/groq.tsruns2,939 bytessrc/integrations/cloud/llm/hash.tsruns842 bytessrc/integrations/cloud/llm/local-tier.tsruns6,838 bytessrc/integrations/cloud/llm/model-select.tsruns1,397 bytessrc/integrations/cloud/llm/openai.tsruns1,187 bytessrc/integrations/cloud/llm/run.tsruns10,238 bytessrc/integrations/cloud/llm/select.tsruns4,742 bytessrc/integrations/cloud/llm/text-adapters.tsruns5,454 bytessrc/integrations/cloud/llm/types.tsruns551 bytessrc/integrations/cloud/llm/validate.tsruns2,386 bytessrc/logger.tsruns3,352 bytessrc/pdf-parse.d.tsruns845 bytessrc/persisted-config.tsruns16,338 bytessrc/plugins/loader.tsruns5,379 bytessrc/plugins/registry.tsruns2,546 bytessrc/plugins/validate.tsruns2,527 bytessrc/providers/embed-provider.tsruns5,123 bytessrc/providers/extract-provider.tsruns1,280 bytessrc/providers/idle-unload.tsruns3,620 bytessrc/providers/rerank-provider.tsruns7,962 bytessrc/providers/search-provider.tsruns3,607 bytessrc/providers/vector-store.tsruns1,678 bytessrc/python-env.tsruns6,083 bytessrc/repl/commands/agent.tsruns2,634 bytessrc/repl/commands/cache.tsruns2,172 bytessrc/repl/commands/crawl.tsruns2,094 bytessrc/repl/commands/diff.tsruns3,225 bytessrc/repl/commands/extract.tsruns2,003 bytessrc/repl/commands/fetch.tsruns3,624 bytessrc/repl/commands/find-similar.tsruns3,134 bytessrc/repl/commands/research.tsruns2,856 bytessrc/repl/commands/search.tsruns2,911 bytessrc/repl/commands/types.tsruns292 bytessrc/repl/commands/watch.tsruns3,913 bytessrc/repl/completer.tsruns3,446 bytessrc/repl/formatters.tsruns13,068 bytessrc/repl/parser.tsruns2,484 bytessrc/repl/shell.tsruns10,242 bytessrc/research/branch-exploration.tsruns3,562 bytessrc/research/brief.tsruns20,653 bytessrc/research/citation-graph.tsruns3,616 bytessrc/research/decompose.tsruns13,929 bytessrc/research/entity-extractor.tsruns2,409 bytessrc/research/pipeline.tsruns20,513 bytessrc/research/render-brief.tsruns6,822 bytessrc/research/source-validation.tsruns9,432 bytessrc/research/synthesis-local.tsruns4,441 bytessrc/research/synthesize.tsruns5,368 bytessrc/search/answer-synthesis.tsruns13,674 bytessrc/search/content-fetch.tsruns15,368 bytessrc/search/context-formatter.tsruns2,205 bytessrc/search/core/brand-collision.tsruns18,858 bytessrc/search/core/canonical-url.tsruns3,871 bytessrc/search/core/context-rank.tsruns3,184 bytessrc/search/core/core-provider.tsruns43,232 bytessrc/search/core/domain-quality.tsruns4,931 bytessrc/search/core/engine-base.tsruns25,134 bytessrc/search/core/engine-health.tsruns7,649 bytessrc/search/core/engine-quality.tsruns7,091 bytessrc/search/core/engine-warnings.tsruns6,413 bytessrc/search/core/error-intent.tsruns7,599 bytessrc/search/core/favicon.tsruns763 bytessrc/search/core/freshness.tsruns1,814 bytessrc/search/core/intent-router.tsruns9,056 bytessrc/search/core/lexical-alignment.tsruns1,790 bytessrc/search/core/orchestrator.tsruns43,089 bytessrc/search/core/query-expansion.tsruns5,488 bytessrc/search/core/query-understanding.tsruns3,959 bytessrc/search/core/rare-terms.tsruns5,907 bytessrc/search/core/recency-boost.tsruns2,830 bytessrc/search/core/recent-cache-dedup.tsruns3,615 bytessrc/search/core/rerank-fold.tsruns10,446 bytessrc/search/core/rss/feed-config.tsruns3,385 bytessrc/search/core/rss/feed-parser.tsruns4,622 bytessrc/search/core/rss/feed-poller.tsruns3,590 bytessrc/search/core/rss/feed-store.tsruns4,730 bytessrc/search/core/rss/rss-engine.tsruns965 bytessrc/search/core/score-floor.tsruns8,436 bytessrc/search/core/text-tokenizer.tsruns1,671 bytessrc/search/core/time-range.tsruns2,512 bytessrc/search/core/verticals/code.tsruns2,938 bytessrc/search/core/verticals/docs.tsruns1,497 bytessrc/search/core/verticals/general.tsruns3,394 bytessrc/search/core/verticals/images.tsruns1,629 bytessrc/search/core/verticals/news.tsruns3,687 bytessrc/search/core/verticals/papers.tsruns2,020 bytessrc/search/dedup.tsruns1,693 bytessrc/search/engines/arxiv.tsruns2,810 bytessrc/search/engines/bing-news.tsruns5,540 bytessrc/search/engines/bing.tsruns5,283 bytessrc/search/engines/brave-image.tsruns4,128 bytessrc/search/engines/brave.tsruns2,999 bytessrc/search/engines/crates-io.tsruns2,794 bytessrc/search/engines/dblp.tsruns4,555 bytessrc/search/engines/ddg-image.tsruns5,511 bytessrc/search/engines/devdocs.tsruns3,400 bytessrc/search/engines/duckduckgo.tsruns2,900 bytessrc/search/engines/github-code.tsruns3,270 bytessrc/search/engines/hn-algolia.tsruns3,195 bytessrc/search/engines/lobsters.tsruns4,109 bytessrc/search/engines/marginalia.tsruns2,951 bytessrc/search/engines/mdn.tsruns1,863 bytessrc/search/engines/mojeek.tsruns3,188 bytessrc/search/engines/openalex.tsruns3,797 bytessrc/search/engines/openreview.tsruns2,491 bytessrc/search/engines/semantic-scholar.tsruns2,950 bytessrc/search/engines/stackoverflow.tsruns2,930 bytessrc/search/engines/user-agents.tsruns2,154 bytessrc/search/engines/wikipedia.tsruns2,496 bytessrc/search/evidence.tsruns12,518 bytessrc/search/filters.tsruns3,139 bytessrc/search/find-similar.tsruns28,245 bytessrc/search/find-similar/crawl-rank.tsruns11,041 bytessrc/search/find-similar/mode.tsruns749 bytessrc/search/highlights.tsruns7,585 bytessrc/search/hybrid/common-nouns.tsruns836 bytessrc/search/hybrid/merge.tsruns3,006 bytessrc/search/hybrid/router.tsruns4,207 bytessrc/search/hybrid/signals.tsruns4,326 bytessrc/search/language-filter.tsruns6,122 bytessrc/search/legacy/searxng-orchestrator.tsruns22,753 bytessrc/search/legacy/searxng-provider.tsruns472 bytessrc/search/multi-query.tsruns9,841 bytessrc/search/query.tsruns1,103 bytessrc/search/rerank.tsruns2,365 bytessrc/search/reranker/authority-boost.tsruns5,968 bytessrc/search/reranker/consensus-boost.tsruns1,421 bytessrc/search/reranker/recency-boost.tsruns505 bytessrc/search/reranker/recency.tsruns797 bytessrc/search/reranker/remote-rerank-provider.tsruns4,333 bytessrc/search/reranker/transformers-rerank-provider.tsruns5,055 bytessrc/search/rrf.tsruns1,526 bytessrc/search/sampling.tsruns2,086 bytessrc/search/searxng.tsruns4,030 bytessrc/search/tokens.tsruns1,470 bytessrc/search/truncate.tsruns1,091 bytessrc/search/url-unwrap.tsruns1,235 bytessrc/search/validator.tsruns1,202 bytessrc/searxng/bootstrap.tsruns15,159 bytessrc/searxng/docker.tsruns3,882 bytessrc/searxng/enabled.tsruns1,679 bytessrc/searxng/process.tsruns9,099 bytessrc/security/key-crypto.tsruns5,122 bytessrc/security/key-store.tsruns8,415 bytessrc/security/keychain.tsruns3,270 bytessrc/server.tsruns24,114 bytessrc/server/backend-status.tsruns1,377 bytessrc/server/search-response.tsruns1,295 bytessrc/server/tool-schemas.tsruns24,841 bytessrc/server/warmup-on-start.tsruns4,128 bytessrc/tools/agent.tsruns6,925 bytessrc/tools/cache.tsruns7,979 bytessrc/tools/crawl.tsruns9,197 bytessrc/tools/diff.tsruns3,766 bytessrc/tools/extract.tsruns22,471 bytessrc/tools/fetch.tsruns19,520 bytessrc/tools/find-similar.tsruns5,192 bytessrc/tools/research.tsruns3,935 bytessrc/tools/search.tsruns1,117 bytessrc/tools/watch.tsruns6,734 bytessrc/types.tsruns48,953 bytessrc/util/abort.tsruns2,332 bytessrc/util/child-env.tsruns1,443 bytessrc/util/engine-list.tsruns994 bytessrc/util/mode.tsruns1,169 bytessrc/util/native-abi.tsruns3,259 bytessrc/util/packaged.tsruns1,456 bytessrc/util/redact-url.tsruns613 bytessrc/watch/scheduler.tsruns9,295 bytessrc/watch/ssrf.tsruns19,916 bytessrc/watch/store.tsruns6,467 bytestests/e2e/doctor-clean-exit.e2e.test.tsruns2,573 bytestests/e2e/fetch-tool.test.tsruns7,676 bytestests/e2e/init-command.e2e.test.tsruns2,711 bytestests/e2e/mcp-startup.test.tsruns4,965 bytestests/e2e/search-tool.test.tsruns6,428 bytestests/e2e/searxng-cold-bootstrap.e2e.test.tsruns5,262 bytestests/fetch/pinned-dispatcher.test.tsruns4,166 bytestests/fetch/pinned-e2e.test.tsruns2,040 bytestests/fetch/pinned-failclosed.test.tsruns2,122 bytestests/fetch/pinned-rebind.test.tsruns3,943 bytestests/fetch/pinned-redirect-body.test.tsruns3,649 bytestests/fetch/pinned-redirect.test.tsruns2,430 bytestests/fixtures/amazon/blocked.htmlasset408 bytestests/fixtures/amazon/book.htmlasset3,872 bytestests/fixtures/amazon/de-euro.htmlasset1,987 bytestests/fixtures/amazon/electronics.htmlasset5,157 bytestests/fixtures/amazon/grocery.htmlasset3,445 bytestests/fixtures/amazon/out-of-stock.htmlasset2,125 bytestests/fixtures/amazon/uk-pound.htmlasset2,059 bytestests/fixtures/bing-tracker-urls.jsonasset800 bytestests/fixtures/brand/anthropic.htmlasset1,719 bytestests/fixtures/brand/cloudflare.htmlasset1,956 bytestests/fixtures/brand/convex.htmlasset1,667 bytestests/fixtures/brand/discord.htmlasset1,845 bytestests/fixtures/brand/figma.htmlasset1,696 bytestests/fixtures/brand/fly.htmlasset1,703 bytestests/fixtures/brand/fonts/example.htmlasset387 bytestests/fixtures/brand/fonts/figma.htmlasset700 bytestests/fixtures/brand/fonts/hackernews.htmlasset723 bytestests/fixtures/brand/fonts/linear.htmlasset535 bytestests/fixtures/brand/fonts/stripe.htmlasset707 bytestests/fixtures/brand/fonts/vercel.htmlasset687 bytestests/fixtures/brand/github.htmlasset2,039 bytestests/fixtures/brand/linear.htmlasset1,723 bytestests/fixtures/brand/netlify.htmlasset1,889 bytestests/fixtures/brand/nextjs.htmlasset1,712 bytestests/fixtures/brand/notion.htmlasset1,732 bytestests/fixtures/brand/openai.htmlasset1,618 bytestests/fixtures/brand/posthog.htmlasset1,778 bytestests/fixtures/brand/railway.htmlasset1,624 bytestests/fixtures/brand/render.htmlasset1,744 bytestests/fixtures/brand/resend.htmlasset1,620 bytestests/fixtures/brand/slack.htmlasset1,815 bytestests/fixtures/brand/stripe.htmlasset2,129 bytestests/fixtures/brand/supabase.htmlasset1,828 bytestests/fixtures/brand/tailwind.htmlasset1,949 bytestests/fixtures/brand/vercel.htmlasset1,845 bytestests/fixtures/cdp-json/active-sessions.jsonasset1,236 bytestests/fixtures/cdp-json/empty.jsonasset3 bytestests/fixtures/cdp-json/malformed.jsonasset24 bytestests/fixtures/changing-page/v1.htmlasset918 bytestests/fixtures/changing-page/v2.htmlasset1,213 bytestests/fixtures/cookie-banner.htmlasset1,382 bytestests/fixtures/crawl/nextjs-docs/page-1.htmlasset1,410 bytestests/fixtures/crawl/nextjs-docs/page-2.htmlasset1,410 bytestests/fixtures/crawl/nextjs-docs/page-3.htmlasset1,410 bytestests/fixtures/crawl/nextjs-docs/page-4.htmlasset1,410 bytestests/fixtures/crawl/nextjs-docs/page-5.htmlasset1,410 bytestests/fixtures/dump_tokens.pyruns3,014 bytestests/fixtures/extraction/article.htmlasset4,472 bytestests/fixtures/extraction/blog-post.htmlasset6,592 bytestests/fixtures/extraction/code-blocks.htmlasset2,249 bytestests/fixtures/extraction/dense-ordinal-leaderboard.htmlasset1,577 bytestests/fixtures/extraction/div-grid-pricing.htmlasset1,480 bytestests/fixtures/extraction/job-listing.htmlasset2,077 bytestests/fixtures/extraction/jsonld-article.htmlasset759 bytestests/fixtures/extraction/legacy-table-listing.htmlasset3,120 bytestests/fixtures/extraction/metadata.htmlasset1,211 bytestests/fixtures/extraction/minimal.htmlasset140 bytestests/fixtures/extraction/news-article.htmlasset6,225 bytestests/fixtures/extraction/product-page.htmlasset1,357 bytestests/fixtures/extraction/react-managing-state.htmlasset3,116 bytestests/fixtures/extraction/react-reference-real.htmlasset158,392 bytestests/fixtures/extraction/react-reference-shell.htmlasset3,615 bytestests/fixtures/extraction/tables.htmlasset1,902 bytestests/fixtures/extraction/vitepress-guide.htmlasset49,891 bytestests/fixtures/form-page.htmlasset1,248 bytestests/fixtures/load-more.htmlasset1,194 bytestests/fixtures/multi-browser/simple.htmlasset962 bytestests/fixtures/plugins/bad-json/package.jsonruns35 bytestests/fixtures/plugins/invalid-shape/index.mjsruns186 bytestests/fixtures/plugins/invalid-shape/package.jsonruns80 bytestests/fixtures/plugins/no-main/package.jsonruns51 bytestests/fixtures/plugins/throws-on-load/index.mjsruns66 bytestests/fixtures/plugins/throws-on-load/package.jsonruns81 bytestests/fixtures/plugins/valid-both/index.mjsruns670 bytestests/fixtures/plugins/valid-both/package.jsonruns77 bytestests/fixtures/plugins/valid-extractor/index.mjsruns337 bytestests/fixtures/plugins/valid-extractor/package.jsonruns82 bytestests/fixtures/plugins/valid-search-engine/index.mjsruns328 bytestests/fixtures/plugins/valid-search-engine/package.jsonruns86 bytestests/fixtures/repl/golden/cache-stats.txtdoc131 bytestests/fixtures/repl/golden/crawl.txtdoc184 bytestests/fixtures/repl/golden/extract.txtdoc164 bytestests/fixtures/repl/golden/fetch.txtdoc187 bytestests/fixtures/repl/golden/search.txtdoc395 bytestests/fixtures/reranker-tokenizer-corpus.README.mddoc1,675 bytestests/fixtures/reranker-tokenizer-corpus.jsonasset24,778 bytestests/fixtures/reranker-tokenizer-snapshot.jsonasset1,404,950 bytestests/fixtures/search/bing-results.htmlasset776 bytestests/fixtures/search/duckduckgo-results.htmlasset997 bytestests/fixtures/search/searxng-response.jsonasset1,003 bytestests/fixtures/site-extractors/docusaurus-page.htmlasset5,606 bytestests/fixtures/site-extractors/github-blob-legacy.htmlasset731 bytestests/fixtures/site-extractors/github-blob-modern.htmlasset3,467 bytestests/fixtures/site-extractors/github-blob-truncated.htmlasset612 bytestests/fixtures/site-extractors/github-issue.htmlasset2,838 bytestests/fixtures/site-extractors/github-readme.htmlasset1,306 bytestests/fixtures/site-extractors/mdn-article.htmlasset8,551 bytestests/fixtures/site-extractors/reddit-blocked.htmlasset338 bytestests/fixtures/site-extractors/reddit-deleted-comments.htmlasset3,962 bytestests/fixtures/site-extractors/reddit-deleted-post.htmlasset1,981 bytestests/fixtures/site-extractors/reddit-thread.htmlasset9,781 bytestests/fixtures/site-extractors/stackoverflow-question.htmlasset4,114 bytestests/fixtures/site-extractors/youtube-watch-age-restricted.htmlasset555 bytestests/fixtures/site-extractors/youtube-watch-no-captions.htmlasset605 bytestests/fixtures/site-extractors/youtube-watch-with-captions.htmlasset1,638 bytestests/fixtures/spa-shells/next-empty.htmlasset559 bytestests/fixtures/spa-shells/normal-page.htmlasset1,797 bytestests/fixtures/spa-shells/noscript-required.htmlasset260 bytestests/fixtures/spa-shells/react-spa.htmlasset423 bytestests/fixtures/spa-shells/script-heavy.htmlasset3,782 bytestests/fixtures/spa-shells/thin-content.htmlasset142 bytestests/fixtures/spa-shells/vue-spa.htmlasset353 bytestests/fixtures/structured-data/article-jsonld.htmlasset876 bytestests/fixtures/structured-data/breadcrumb-microdata.htmlasset908 bytestests/fixtures/structured-data/organization-rdfa.htmlasset544 bytestests/fixtures/structured-data/product-jsonld.htmlasset764 bytestests/fixtures/structured-data/product-microdata.htmlasset576 bytestests/fixtures/structured-data/recipe-jsonld.htmlasset1,051 bytestests/helpers/wait-for.tsruns553 bytestests/integration/__snapshots__/extract-pipeline-v1.test.ts.snapasset9,671 bytestests/integration/agent-defaults-token-discipline.test.tsruns2,245 bytestests/integration/agent-local-tier.test.tsruns3,844 bytestests/integration/agent-top-mcp-servers.test.tsruns3,750 bytestests/integration/agent.test.tsruns13,216 bytestests/integration/browser-actions.test.tsruns9,056 bytestests/integration/build-output.test.tsruns1,116 bytestests/integration/cache-defaults-token-discipline.test.tsruns2,303 bytestests/integration/cache-tool.test.tsruns4,672 bytestests/integration/cdp-discovery.test.tsruns6,840 bytestests/integration/change-detection.test.tsruns9,032 bytestests/integration/citation-id-stability.test.tsruns4,786 bytestests/integration/config-writer-fs.test.tsruns7,642 bytestests/integration/crawl-index-latency.test.tsruns5,625 bytestests/integration/crawl-pipeline.test.tsruns11,436 bytestests/integration/crawl/nav-dedupe.test.tsruns1,099 bytestests/integration/daemon-mode.test.tsruns5,865 bytestests/integration/embedding-cache-fastembed.test.tsruns3,455 bytestests/integration/embedding.test.tsruns6,646 bytestests/integration/extract-pipeline-v1.test.tsruns10,189 bytestests/integration/extract-pipeline.test.tsruns6,738 bytestests/integration/extract-schema-evidence-only.test.tsruns8,339 bytestests/integration/extract-structured.test.tsruns5,060 bytestests/integration/extract-tables-truncation.test.tsruns3,375 bytestests/integration/extract-wikipedia-chrome.test.tsruns5,141 bytestests/integration/extraction-pipeline-structured-data.test.tsruns2,323 bytestests/integration/extraction/markdown-post-process.test.tsruns1,231 bytestests/integration/extras-prompt-roundtrip.test.tsruns4,807 bytestests/integration/fetch-cache-completeness-gate.test.tsruns6,438 bytestests/integration/fetch-cache-miss.test.tsruns801 bytestests/integration/fetch-method-visibility.test.tsruns3,562 bytestests/integration/fetch-pdf.test.tsruns4,875 bytestests/integration/fetch-pipeline.test.tsruns8,904 bytestests/integration/fetch-router-tuning.test.tsruns7,962 bytestests/integration/fetch-site-data.test.tsruns12,322 bytestests/integration/fetch-vs-extract-metadata.test.tsruns2,201 bytestests/integration/fetch/browser-pool.test.tsruns8,737 bytestests/integration/fetch/no-lightpanda.test.tsruns4,846 bytestests/integration/fetch/playwright-tier.test.tsruns10,854 bytestests/integration/fetch/spa-settle-corpus.test.tsruns6,550 bytestests/integration/fetch/spa-settle-corpus/fixtures.tsruns4,748 bytestests/integration/fetch/spa-settle-corpus/server.tsruns1,680 bytestests/integration/filter-enforcement.test.tsruns9,371 bytestests/integration/find-similar.test.tsruns13,136 bytestests/integration/fixtures/search-parity-snapshot.jsonasset684 bytestests/integration/fixtures/skills-legacy/wigolo-search-SKILL.mddoc4,685 bytestests/integration/hybrid-mode.test.tsruns8,779 bytestests/integration/instructions-v3.test.tsruns3,048 bytestests/integration/llm-fallback-e2e.test.tsruns4,459 bytestests/integration/llm-fallback-schema.test.tsruns3,697 bytestests/integration/map-mode.test.tsruns9,725 bytestests/integration/mode-deep.test.tsruns3,442 bytestests/integration/multi-browser.test.tsruns6,154 bytestests/integration/multi-query.test.tsruns5,640 bytestests/integration/onnx-rerank-e2e.test.tsruns3,062 bytestests/integration/pipeline-success-criteria.test.tsruns6,010 bytestests/integration/plugins/plugin-lifecycle.test.tsruns8,285 bytestests/integration/remote-rerank-pipeline.test.tsruns2,144 bytestests/integration/repl-e2e.test.tsruns9,862 bytestests/integration/rerank-pipeline.test.tsruns5,878 bytestests/integration/research-local-tier.test.tsruns5,417 bytestests/integration/research.test.tsruns9,592 bytestests/integration/rest-api.test.tsruns14,530 bytestests/integration/rest-firecrawl-compat.test.tsruns14,471 bytestests/integration/rest-tools.test.tsruns12,197 bytestests/integration/router-stealth.test.tsruns5,953 bytestests/integration/schema-extract-pipeline.test.tsruns9,941 bytestests/integration/search-adapter-quality.test.tsruns6,550 bytestests/integration/search-answer.test.tsruns9,679 bytestests/integration/search-depth.test.tsruns4,210 bytestests/integration/search-evidence-default.test.tsruns6,751 bytestests/integration/search-filtering-pipeline.test.tsruns10,050 bytestests/integration/search-format-answer-empty.test.tsruns1,722 bytestests/integration/search-format-answer-slim.test.tsruns5,495 bytestests/integration/search-language-filter.test.tsruns2,244 bytestests/integration/search-legacy-parity.test.tsruns3,366 bytestests/integration/search-pipeline.test.tsruns5,542 bytestests/integration/search-rerank-fold.test.tsruns10,801 bytestests/integration/search-rerank-pipeline.test.tsruns5,165 bytestests/integration/search-s11c-ranking.test.tsruns11,192 bytestests/integration/search-v1-context.test.tsruns9,836 bytestests/integration/search-v1-pipeline.test.tsruns10,351 bytestests/integration/searxng-retry.test.tsruns2,570 bytestests/integration/setup-roundtrip.test.tsruns13,395 bytestests/integration/skills-install.test.tsruns15,786 bytestests/integration/tui-autosave-roundtrip.test.tsruns3,330 bytestests/integration/tui-narrow-terminal.test.tsruns2,039 bytestests/integration/tui-shell-integration.test.tsruns3,718 bytestests/integration/warmup-force.test.tsruns2,155 bytestests/integration/warmup-tui.test.tsruns3,312 bytestests/integration/watch/watch-handler.test.tsruns22,180 bytestests/integration/zero-touch-just-works.test.tsruns8,353 bytestests/perf/embedding.bench.tsruns2,912 bytestests/perf/rerank.bench.tsruns3,861 bytestests/perf/search-v1.bench.tsruns1,515 bytestests/perf/vector-search.bench.tsruns3,343 bytestests/setup.tsruns4,139 bytestests/unit/agent/agent-defaults.test.tsruns446 bytestests/unit/agent/executor.test.tsruns10,841 bytestests/unit/agent/pipeline.llm-gate-keystore.test.tsruns4,729 bytestests/unit/agent/pipeline.local-tier.test.tsruns7,843 bytestests/unit/agent/pipeline.provider-priority.test.tsruns3,532 bytestests/unit/agent/pipeline.test.tsruns28,954 bytestests/unit/agent/planner.test.tsruns9,265 bytestests/unit/agent/rank.test.tsruns3,148 bytestests/unit/agent/relevance.test.tsruns3,601 bytestests/unit/benchmarks/agent/evaluator.test.tsruns10,457 bytestests/unit/benchmarks/agent/metrics.test.tsruns3,469 bytestests/unit/benchmarks/agent/report.test.tsruns3,479 bytestests/unit/benchmarks/agent/runner.test.tsruns3,686 bytestests/unit/benchmarks/agent/task-executor.test.tsruns7,390 bytestests/unit/benchmarks/extraction/metrics.test.tsruns6,992 bytestests/unit/benchmarks/extraction/report.test.tsruns7,521 bytestests/unit/benchmarks/extraction/runner.test.tsruns8,364 bytestests/unit/benchmarks/extraction/tokenizer.test.tsruns5,161 bytestests/unit/benchmarks/search/metrics.test.tsruns7,320 bytestests/unit/benchmarks/search/mock-engine.test.tsruns4,908 bytestests/unit/benchmarks/search/report.test.tsruns5,439 bytestests/unit/benchmarks/search/runner.test.tsruns5,442 bytestests/unit/cache/antibot-clearance.test.tsruns10,410 bytestests/unit/cache/backfill-embeddings.test.tsruns5,324 bytestests/unit/cache/change-detector.test.tsruns9,041 bytestests/unit/cache/clearance-route-secret.test.tsruns3,622 bytestests/unit/cache/db-embedding.test.tsruns3,879 bytestests/unit/cache/db-exit-hook.test.tsruns1,115 bytestests/unit/cache/db-vec-packaged.test.tsruns3,542 bytestests/unit/cache/db.test.tsruns1,974 bytestests/unit/cache/diff-engine.test.tsruns16,232 bytestests/unit/cache/diff-summary.test.tsruns6,865 bytestests/unit/cache/domain-routing-admin.test.tsruns7,204 bytestests/unit/cache/lcs.test.tsruns3,477 bytestests/unit/cache/migrations-runner.test.tsruns9,237 bytestests/unit/cache/sanitize-fts-query.test.tsruns2,676 bytestests/unit/cache/sqlite-vec-store.test.tsruns5,704 bytestests/unit/cache/stale-window.test.tsruns3,560 bytestests/unit/cache/store-embedding.test.tsruns4,683 bytestests/unit/cache/store-search-key.test.tsruns4,640 bytestests/unit/cache/store.test.tsruns27,110 bytestests/unit/cache/tls-routing.test.tsruns2,480 bytestests/unit/cli/agents/agent-support-consistency.test.tsruns4,684 bytestests/unit/cli/agents/claude-code.test.tsruns11,601 bytestests/unit/cli/agents/cline.test.tsruns4,333 bytestests/unit/cli/agents/codex.test.tsruns6,192 bytestests/unit/cli/agents/opencode.test.tsruns11,567 bytestests/unit/cli/agents/registry.test.tsruns2,313 bytestests/unit/cli/agents/skills-content.test.tsruns8,236 bytestests/unit/cli/agents/skills/catalog.test.tsruns3,404 bytestests/unit/cli/agents/skills/executor.test.tsruns28,796 bytestests/unit/cli/agents/skills/planner.test.tsruns11,165 bytestests/unit/cli/agents/skills/receipts.test.tsruns12,486 bytestests/unit/cli/agents/skills/targets.test.tsruns2,929 bytestests/unit/cli/agents/utils.test.tsruns10,804 bytestests/unit/cli/agents/vscode.test.tsruns7,904 bytestests/unit/cli/agents/windsurf.test.tsruns5,763 bytestests/unit/cli/agents/zed.test.tsruns5,163 bytestests/unit/cli/auth.test.tsruns6,623 bytestests/unit/cli/config-dispatch.test.tsruns13,270 bytestests/unit/cli/config.test.tsruns2,498 bytestests/unit/cli/daemon.test.tsruns10,422 bytestests/unit/cli/doctor-engine-health.test.tsruns6,945 bytestests/unit/cli/doctor-fixes.test.tsruns15,404 bytestests/unit/cli/doctor-isolated.test.tsruns20,355 bytestests/unit/cli/doctor-lazy.test.tsruns17,563 bytestests/unit/cli/doctor-ollama.test.tsruns7,293 bytestests/unit/cli/doctor-provider.test.tsruns1,938 bytestests/unit/cli/doctor-tls-tier.test.tsruns5,638 bytestests/unit/cli/doctor.test.tsruns23,150 bytestests/unit/cli/flag-bridge.test.tsruns8,555 bytestests/unit/cli/health.test.tsruns5,226 bytestests/unit/cli/help-completeness.test.tsruns3,805 bytestests/unit/cli/help.test.tsruns6,437 bytestests/unit/cli/index.test.tsruns6,075 bytestests/unit/cli/init-non-interactive.test.tsruns21,639 bytestests/unit/cli/init-ollama-hint.test.tsruns2,808 bytestests/unit/cli/init-packaged-binary.test.tsruns5,406 bytestests/unit/cli/init.test.tsruns44,539 bytestests/unit/cli/json-contracts.test.tsruns9,576 bytestests/unit/cli/ollama-probe.test.tsruns3,952 bytestests/unit/cli/plugin.test.tsruns14,826 bytestests/unit/cli/router-config.test.tsruns1,286 bytestests/unit/cli/setup-mcp-integration.test.tsruns6,091 bytestests/unit/cli/setup-mcp-non-interactive.test.tsruns2,828 bytestests/unit/cli/setup-mcp.test.tsruns5,837 bytestests/unit/cli/shell.test.tsruns2,678 bytestests/unit/cli/skills-command.test.tsruns17,232 bytestests/unit/cli/status.test.tsruns4,595 bytestests/unit/cli/telemetry.test.tsruns6,687 bytestests/unit/cli/tool-flag-parity.test.tsruns2,784 bytestests/unit/cli/tool-run.test.tsruns7,535 bytestests/unit/cli/tui/actions/cache-stats.test.tsruns2,704 bytestests/unit/cli/tui/actions/cleanup.test.tsruns4,750 bytestests/unit/cli/tui/actions/compute-storage.test.tsruns5,818 bytestests/unit/cli/tui/actions/detect-system.test.tsruns2,570 bytestests/unit/cli/tui/actions/export-import-config.test.tsruns9,135 bytestests/unit/cli/tui/actions/headless-set.test.tsruns11,669 bytestests/unit/cli/tui/actions/mcp-stdio-no-ink.test.tsruns3,572 bytestests/unit/cli/tui/actions/provider-actions.test.tsruns6,198 bytestests/unit/cli/tui/actions/uninstall.test.tsruns9,466 bytestests/unit/cli/tui/actions/write-config-no-silent.test.tsruns2,009 bytestests/unit/cli/tui/actions/write-config.test.tsruns4,901 bytestests/unit/cli/tui/agents.test.tsruns12,972 bytestests/unit/cli/tui/banner.test.tsruns2,149 bytestests/unit/cli/tui/banner.test.tsxruns1,318 bytestests/unit/cli/tui/components/ActionBar.test.tsxruns1,612 bytestests/unit/cli/tui/components/CategoryScreen.blur.test.tsxruns7,532 bytestests/unit/cli/tui/components/CategoryScreen.test.tsxruns12,035 bytestests/unit/cli/tui/components/DoctorScreen.test.tsxruns3,439 bytestests/unit/cli/tui/components/FieldRenderer.enter-select.test.tsxruns4,755 bytestests/unit/cli/tui/components/FieldRenderer.saved-check.test.tsxruns4,842 bytestests/unit/cli/tui/components/FieldRenderer.test.tsxruns29,243 bytestests/unit/cli/tui/components/ImportScreen.test.tsxruns8,466 bytestests/unit/cli/tui/components/SettingsHome.multiselect-preview.test.tsxruns3,546 bytestests/unit/cli/tui/components/SettingsHome.quit.test.tsxruns2,301 bytestests/unit/cli/tui/components/SettingsHome.test.tsxruns11,262 bytestests/unit/cli/tui/components/SettingsHome.threeway.test.tsxruns4,644 bytestests/unit/cli/tui/components/VerifyScreen.test.tsxruns3,082 bytestests/unit/cli/tui/components/WizardSteps.ceremony.test.tsxruns6,065 bytestests/unit/cli/tui/components/WizardSteps.continue-quit.test.tsxruns10,666 bytestests/unit/cli/tui/components/WizardSteps.test.tsxruns11,054 bytestests/unit/cli/tui/config-force-wizard.test.tsruns1,975 bytestests/unit/cli/tui/config-writer-cli.test.tsruns3,495 bytestests/unit/cli/tui/config-writer-json.test.tsruns21,524 bytestests/unit/cli/tui/config-writer-toml.test.tsruns3,713 bytestests/unit/cli/tui/config-writer.test.tsruns6,922 bytestests/unit/cli/tui/dashboard-screens.test.tsxruns4,409 bytestests/unit/cli/tui/detect-helpers.test.tsruns4,869 bytestests/unit/cli/tui/entry-required-fields.test.tsruns4,152 bytestests/unit/cli/tui/entry.test.tsruns3,535 bytestests/unit/cli/tui/extras-prompt.test.tsruns7,589 bytestests/unit/cli/tui/flags.test.tsruns5,211 bytestests/unit/cli/tui/format.test.tsruns1,454 bytestests/unit/cli/tui/init-config-writer.test.tsruns1,475 bytestests/unit/cli/tui/mount-root-phase-sync.test.tsxruns3,590 bytestests/unit/cli/tui/plain-override.test.tsruns2,786 bytestests/unit/cli/tui/reporter-auto.test.tsruns2,530 bytestests/unit/cli/tui/reporter.test.tsruns2,421 bytestests/unit/cli/tui/router/entry-wire.test.tsxruns6,061 bytestests/unit/cli/tui/router/ink-root.apply-verify.test.tsxruns4,843 bytestests/unit/cli/tui/router/ink-root.phase3-integration.test.tsxruns3,995 bytestests/unit/cli/tui/router/ink-root.save-state.test.tsxruns3,289 bytestests/unit/cli/tui/router/ink-root.test.tsxruns7,506 bytestests/unit/cli/tui/run-command.test.tsruns1,858 bytestests/unit/cli/tui/schema/advanced.test.tsruns2,937 bytestests/unit/cli/tui/schema/agents.test.tsruns1,739 bytestests/unit/cli/tui/schema/browser.test.tsruns1,385 bytestests/unit/cli/tui/schema/cache.test.tsruns1,628 bytestests/unit/cli/tui/schema/catalog.test.tsruns722 bytestests/unit/cli/tui/schema/llm-no-custom.test.tsruns2,294 bytestests/unit/cli/tui/schema/llm.test.tsruns3,935 bytestests/unit/cli/tui/schema/migrate.test.tsruns3,493 bytestests/unit/cli/tui/schema/search.test.tsruns1,933 bytestests/unit/cli/tui/schema/types.test.tsruns2,100 bytestests/unit/cli/tui/select-agents.test.tsruns3,561 bytestests/unit/cli/tui/shell/App.test.tsxruns3,719 bytestests/unit/cli/tui/shell/CommandPalette.test.tsxruns3,460 bytestests/unit/cli/tui/shell/CommandPalette.width.test.tsxruns4,733 bytestests/unit/cli/tui/shell/Footer.test.tsxruns4,835 bytestests/unit/cli/tui/shell/Header.liveness.test.tsxruns5,103 bytestests/unit/cli/tui/shell/Header.test.tsxruns3,280 bytestests/unit/cli/tui/shell/HelpOverlay.test.tsxruns2,051 bytestests/unit/cli/tui/shell/HelpOverlay.width.test.tsxruns2,070 bytestests/unit/cli/tui/shell/MainPane.test.tsxruns1,571 bytestests/unit/cli/tui/shell/MainPane.transition.test.tsxruns2,885 bytestests/unit/cli/tui/shell/Sidebar.pulse.test.tsxruns6,651 bytestests/unit/cli/tui/shell/Sidebar.quit.test.tsxruns3,099 bytestests/unit/cli/tui/shell/Sidebar.test.tsxruns9,896 bytestests/unit/cli/tui/shell/Spinner.test.tsxruns2,727 bytestests/unit/cli/tui/shell/palette-index.test.tsruns2,998 bytestests/unit/cli/tui/shell/width.test.tsruns826 bytestests/unit/cli/tui/state/activity-store.test.tsruns1,224 bytestests/unit/cli/tui/state/agent-install-hints.test.tsruns3,691 bytestests/unit/cli/tui/state/agent-targets.test.tsruns3,029 bytestests/unit/cli/tui/state/propagation.test.tsruns21,960 bytestests/unit/cli/tui/state/required-fields.test.tsruns6,750 bytestests/unit/cli/tui/state/secret-store.test.tsruns6,362 bytestests/unit/cli/tui/state/settings-store.blur.test.tsruns4,504 bytestests/unit/cli/tui/state/settings-store.test.tsruns2,574 bytestests/unit/cli/tui/state/settings-store.toast.test.tsruns3,234 bytestests/unit/cli/tui/state/toast-store.action.test.tsruns2,639 bytestests/unit/cli/tui/state/toast-store.test.tsruns2,506 bytestests/unit/cli/tui/state/uninstall-signal.test.tsruns1,385 bytestests/unit/cli/tui/status-agents.test.tsruns7,411 bytestests/unit/cli/tui/status-cache.test.tsruns1,907 bytestests/unit/cli/tui/status-format.test.tsruns2,456 bytestests/unit/cli/tui/status-python.test.tsruns1,726 bytestests/unit/cli/tui/system-check.test.tsruns7,710 bytestests/unit/cli/tui/theme/borders.test.tsruns603 bytestests/unit/cli/tui/theme/motion-guard.test.tsruns1,700 bytestests/unit/cli/tui/theme/motion.test.tsruns498 bytestests/unit/cli/tui/theme/palette.test.tsruns825 bytestests/unit/cli/tui/tui-reporter.test.tsruns4,310 bytestests/unit/cli/tui/verification.test.tsxruns5,708 bytestests/unit/cli/tui/verify-suggestions.test.tsruns1,890 bytestests/unit/cli/tui/verify.test.tsruns9,141 bytestests/unit/cli/tui/version.test.tsruns671 bytestests/unit/cli/tune.test.tsruns9,358 bytestests/unit/cli/uninstall.test.tsruns9,395 bytestests/unit/cli/verify-command.test.tsruns7,396 bytestests/unit/cli/warmup-browser-deps.test.tsruns8,783 bytestests/unit/cli/warmup-embedding.test.tsruns3,727 bytestests/unit/cli/warmup-firefox.test.tsruns9,553 bytestests/unit/cli/warmup-force.test.tsruns2,602 bytestests/unit/cli/warmup-local-llm.test.tsruns1,808 bytestests/unit/cli/warmup-python-env.test.tsruns2,958 bytestests/unit/cli/warmup-setup-json-contract.test.tsruns5,938 bytestests/unit/cli/warmup-verify.test.tsruns4,202 bytestests/unit/cli/warmup.test.tsruns28,738 bytestests/unit/config-persistence.test.tsruns7,251 bytestests/unit/config-search-budgets.test.tsruns1,874 bytestests/unit/config.test.tsruns24,394 bytestests/unit/config/crawl-pacing.test.tsruns2,290 bytestests/unit/config/hardcore-mode.test.tsruns11,458 bytestests/unit/config/proxy-credential-persistence.test.tsruns5,311 bytestests/unit/config/proxy-credential-resolve.test.tsruns3,184 bytestests/unit/config/reddit-credentials.test.tsruns4,344 bytestests/unit/crawl/crawler.test.tsruns30,842 bytestests/unit/crawl/dedup.test.tsruns7,474 bytestests/unit/crawl/etag-incremental.test.tsruns6,790 bytestests/unit/crawl/index-to-vec.test.tsruns3,840 bytestests/unit/crawl/mapper.test.tsruns29,196 bytestests/unit/crawl/rate-limiter.test.tsruns9,377 bytestests/unit/crawl/robots.test.tsruns2,100 bytestests/unit/crawl/sitemap-first.test.tsruns5,214 bytestests/unit/crawl/sitemap.test.tsruns6,362 bytestests/unit/crawl/url-utils.test.tsruns4,608 bytestests/unit/daemon/admin-reset-integration.test.tsruns4,666 bytestests/unit/daemon/admin-token.test.tsruns2,584 bytestests/unit/daemon/firecrawl-compat.test.tsruns22,037 bytestests/unit/daemon/health-check.test.tsruns6,317 bytestests/unit/daemon/http-server.test.tsruns29,510 bytestests/unit/daemon/proxy.test.tsruns3,047 bytestests/unit/daemon/rest-auth.test.tsruns7,118 bytestests/unit/daemon/rest-dispatch.test.tsruns10,117 bytestests/unit/daemon/rest-errors.test.tsruns6,615 bytestests/unit/daemon/rest-limits.test.tsruns5,171 bytestests/unit/daemon/rest-openapi.test.tsruns10,379 bytestests/unit/daemon/rest-router.test.tsruns11,340 bytestests/unit/daemon/rest-target-guard.test.tsruns1,917 bytestests/unit/daemon/rest-validate.test.tsruns2,363 bytestests/unit/documentation/docker-image-tags.test.tsruns917 bytestests/unit/embedding/background-queue.test.tsruns6,141 bytestests/unit/embedding/embed-provider-resolution.test.tsruns3,753 bytestests/unit/embedding/embed.test.tsruns14,500 bytestests/unit/embedding/fastembed-provider-dispose.test.tsruns7,876 bytestests/unit/embedding/fastembed-provider.test.tsruns6,265 bytestests/unit/embedding/key-terms.test.tsruns8,134 bytestests/unit/extraction/boilerplate.test.tsruns8,270 bytestests/unit/extraction/brand-async.test.tsruns23,682 bytestests/unit/extraction/brand-fixtures.test.tsruns5,630 bytestests/unit/extraction/brand-fonts-acceptance.test.tsruns5,086 bytestests/unit/extraction/brand-honesty.test.tsruns10,469 bytestests/unit/extraction/brand-palette.test.tsruns16,238 bytestests/unit/extraction/brand.test.tsruns28,414 bytestests/unit/extraction/content-root.test.tsruns5,945 bytestests/unit/extraction/defuddle.test.tsruns4,173 bytestests/unit/extraction/extract.test.tsruns26,025 bytestests/unit/extraction/interleaved-binding.test.tsruns5,384 bytestests/unit/extraction/jsonld.test.tsruns5,734 bytestests/unit/extraction/lang-hints.test.tsruns2,189 bytestests/unit/extraction/list-detector.test.tsruns9,232 bytestests/unit/extraction/listing-vs-grid-regression.test.tsruns12,270 bytestests/unit/extraction/llm-fallback.test.tsruns7,542 bytestests/unit/extraction/llm/anthropic.test.tsruns2,147 bytestests/unit/extraction/llm/cache.test.tsruns2,096 bytestests/unit/extraction/llm/gemini.test.tsruns1,724 bytestests/unit/extraction/llm/groq.test.tsruns2,342 bytestests/unit/extraction/llm/hash.test.tsruns1,390 bytestests/unit/extraction/llm/openai.test.tsruns2,016 bytestests/unit/extraction/llm/select.test.tsruns3,221 bytestests/unit/extraction/llm/types.test.tsruns1,490 bytestests/unit/extraction/markdown-sanitize.test.tsruns2,442 bytestests/unit/extraction/markdown.test.tsruns14,141 bytestests/unit/extraction/readability.test.tsruns2,820 bytestests/unit/extraction/schema-confidence.test.tsruns2,998 bytestests/unit/extraction/schema-evidence-only.test.tsruns11,802 bytestests/unit/extraction/schema-truth-perf.test.tsruns4,338 bytestests/unit/extraction/schema.test.tsruns31,914 bytestests/unit/extraction/site-extractors/amazon.test.tsruns18,259 bytestests/unit/extraction/site-extractors/docs-generic.test.tsruns8,245 bytestests/unit/extraction/site-extractors/github.test.tsruns10,193 bytestests/unit/extraction/site-extractors/mdn.test.tsruns8,241 bytestests/unit/extraction/site-extractors/reddit.test.tsruns10,814 bytestests/unit/extraction/site-extractors/stackoverflow.test.tsruns5,045 bytestests/unit/extraction/site-extractors/youtube.test.tsruns16,296 bytestests/unit/extraction/structured-data-logging.test.tsruns1,213 bytestests/unit/extraction/structured-data.test.tsruns4,344 bytestests/unit/extraction/structured.test.tsruns24,030 bytestests/unit/extraction/v1/classifier.test.tsruns8,484 bytestests/unit/extraction/v1/news.test.tsruns4,472 bytestests/unit/extraction/v1/pdf.test.tsruns3,843 bytestests/unit/extraction/v1/product.test.tsruns6,505 bytestests/unit/extraction/v1/recipe.test.tsruns5,536 bytestests/unit/extraction/v1/routed.test.tsruns12,953 bytestests/unit/extraction/v1/schemas/Article.test.tsruns5,314 bytestests/unit/extraction/v1/schemas/CodeSnippet.test.tsruns2,215 bytestests/unit/extraction/v1/schemas/EventListing.test.tsruns2,990 bytestests/unit/extraction/v1/schemas/JobPosting.test.tsruns3,686 bytestests/unit/extraction/v1/schemas/Paper.test.tsruns3,350 bytestests/unit/extraction/v1/schemas/Product.test.tsruns3,116 bytestests/unit/extraction/v1/schemas/Recipe.test.tsruns3,091 bytestests/unit/extraction/v1/schemas/index.test.tsruns1,714 bytestests/unit/extraction/v1/schemas/local-llm.test.tsruns11,081 bytestests/unit/fetch/action-executor.test.tsruns13,557 bytestests/unit/fetch/ai-solve.test.tsruns13,074 bytestests/unit/fetch/auth.test.tsruns9,138 bytestests/unit/fetch/auto-pass.test.tsruns7,521 bytestests/unit/fetch/behavior-slow-runner.test.tsruns2,407 bytestests/unit/fetch/behavior.test.tsruns4,925 bytestests/unit/fetch/browser-acquire.test.tsruns9,238 bytestests/unit/fetch/browser-pool-multi.test.tsruns9,401 bytestests/unit/fetch/browser-pool.abort.test.tsruns6,108 bytestests/unit/fetch/browser-pool.cdp-direct.test.tsruns7,471 bytestests/unit/fetch/browser-pool.challenge.test.tsruns30,896 bytestests/unit/fetch/browser-pool.channel.test.tsruns10,116 bytestests/unit/fetch/browser-pool.clearance.test.tsruns8,116 bytestests/unit/fetch/browser-pool.download.test.tsruns5,982 bytestests/unit/fetch/browser-pool.driver-fallback.test.tsruns5,297 bytestests/unit/fetch/browser-pool.humanize.test.tsruns5,904 bytestests/unit/fetch/browser-pool.hydration.test.tsruns2,507 bytestests/unit/fetch/browser-pool.image-subtype.test.tsruns1,674 bytestests/unit/fetch/browser-pool.navigating.test.tsruns2,651 bytestests/unit/fetch/browser-pool.proxy.test.tsruns4,314 bytestests/unit/fetch/browser-pool.scraping-browser.test.tsruns6,351 bytestests/unit/fetch/browser-pool.stealth.test.tsruns13,795 bytestests/unit/fetch/browser-pool.timeout.test.tsruns3,009 bytestests/unit/fetch/browser-pool.widget-locate-budget.test.tsruns2,585 bytestests/unit/fetch/browser-probe.test.tsruns3,536 bytestests/unit/fetch/browser-selector.test.tsruns6,894 bytestests/unit/fetch/browser-types.test.tsruns4,293 bytestests/unit/fetch/cdp-client.test.tsruns9,065 bytestests/unit/fetch/cdp-direct-discover-retry.test.tsruns1,895 bytestests/unit/fetch/cdp-direct-egress-policy.test.tsruns6,041 bytestests/unit/fetch/cdp-direct-fetch.test.tsruns16,495 bytestests/unit/fetch/cdp-direct-identity.test.tsruns3,435 bytestests/unit/fetch/cdp-direct.test.tsruns6,762 bytestests/unit/fetch/challenge-classify.test.tsruns13,204 bytestests/unit/fetch/challenge-completion.test.tsruns6,213 bytestests/unit/fetch/challenge-status-distinguishable.test.tsruns4,332 bytestests/unit/fetch/clearance-major-drift.test.tsruns2,514 bytestests/unit/fetch/clearance-reuse.test.tsruns7,437 bytestests/unit/fetch/content-check.test.tsruns2,257 bytestests/unit/fetch/error-describe.test.tsruns1,915 bytestests/unit/fetch/escape-hatch.test.tsruns12,937 bytestests/unit/fetch/http-client.test.tsruns14,626 bytestests/unit/fetch/human-solve.test.tsruns7,380 bytestests/unit/fetch/hydration-probe.test.tsruns21,547 bytestests/unit/fetch/playwright-tier.hydration-gate.test.tsruns9,294 bytestests/unit/fetch/politeness.test.tsruns1,863 bytestests/unit/fetch/proxy-credentials.test.tsruns4,179 bytestests/unit/fetch/reddit-api.test.tsruns19,729 bytestests/unit/fetch/reddit-url-fidelity.test.tsruns2,282 bytestests/unit/fetch/redirect-guard.test.tsruns6,928 bytestests/unit/fetch/resource-leak-guards.test.tsruns2,582 bytestests/unit/fetch/router-antibot-domains.test.tsruns17,933 bytestests/unit/fetch/router-browser-acquire.test.tsruns12,959 bytestests/unit/fetch/router-challenge-status.test.tsruns12,373 bytestests/unit/fetch/router-clearance-route-gate.test.tsruns5,740 bytestests/unit/fetch/router-clearance.test.tsruns9,091 bytestests/unit/fetch/router-escalation-tuning.test.tsruns12,976 bytestests/unit/fetch/router-escape-hatch.test.tsruns5,756 bytestests/unit/fetch/router-mode.test.tsruns4,272 bytestests/unit/fetch/router-politeness.test.tsruns11,461 bytestests/unit/fetch/router-reddit-api.test.tsruns6,882 bytestests/unit/fetch/router-stealth.test.tsruns7,777 bytestests/unit/fetch/router-tls.test.tsruns11,803 bytestests/unit/fetch/router.test.tsruns35,783 bytestests/unit/fetch/scraping-browser.test.tsruns8,047 bytestests/unit/fetch/settle.test.tsruns16,738 bytestests/unit/fetch/solve-ladder.test.tsruns7,603 bytestests/unit/fetch/stealth-driver-test-isolation.test.tsruns3,190 bytestests/unit/fetch/stealth-driver.test.tsruns3,986 bytestests/unit/fetch/stealth.test.tsruns7,852 bytestests/unit/fetch/tls-tier.test.tsruns51,435 bytestests/unit/help-overlay.test.tsxruns806 bytestests/unit/helpers/wait-for.test.tsruns953 bytestests/unit/init-flags.test.tsruns5,811 bytestests/unit/instructions-v3.test.tsruns12,739 bytestests/unit/instructions.test.tsruns1,922 bytestests/unit/integrations/cloud/llm/text-adapters-vision.test.tsruns4,510 bytestests/unit/integrations/custom-backend.test.tsruns6,956 bytestests/unit/integrations/llm-retry.test.tsruns3,394 bytestests/unit/integrations/llm-runner.test.tsruns10,459 bytestests/unit/integrations/llm-select-seam.test.tsruns7,989 bytestests/unit/integrations/local-tier.test.tsruns8,142 bytestests/unit/logger-suppression.test.tsruns2,006 bytestests/unit/logger.test.tsruns3,189 bytestests/unit/mcp-description-budget.test.tsruns3,317 bytestests/unit/package-deps.test.tsruns5,066 bytestests/unit/package-metadata.test.tsruns3,584 bytestests/unit/persisted-config.test.tsruns10,705 bytestests/unit/plugins/example-search-engine.test.tsruns644 bytestests/unit/plugins/loader.test.tsruns7,511 bytestests/unit/plugins/registry.test.tsruns5,881 bytestests/unit/plugins/validate.test.tsruns8,264 bytestests/unit/providers/embed-provider-factory.test.tsruns1,958 bytestests/unit/providers/extract-provider-factory.test.tsruns823 bytestests/unit/providers/idle-unload.test.tsruns4,108 bytestests/unit/providers/provider-idle-unload.test.tsruns14,842 bytestests/unit/providers/rerank-provider-factory.test.tsruns4,716 bytestests/unit/providers/search-provider-factory.test.tsruns5,039 bytestests/unit/providers/vector-store-factory.test.tsruns1,746 bytestests/unit/python-env-resolve.test.tsruns1,929 bytestests/unit/python-env-venv.test.tsruns4,126 bytestests/unit/python-env.test.tsruns2,833 bytestests/unit/repl/commands/agent.test.tsruns2,800 bytestests/unit/repl/commands/cache.test.tsruns2,374 bytestests/unit/repl/commands/crawl.test.tsruns2,801 bytestests/unit/repl/commands/diff.test.tsruns4,756 bytestests/unit/repl/commands/extract.test.tsruns2,553 bytestests/unit/repl/commands/fetch.test.tsruns5,300 bytestests/unit/repl/commands/find-similar.test.tsruns3,593 bytestests/unit/repl/commands/research.test.tsruns2,930 bytestests/unit/repl/commands/search.test.tsruns4,863 bytestests/unit/repl/commands/watch.test.tsruns4,827 bytestests/unit/repl/completer.test.tsruns3,256 bytestests/unit/repl/formatters.test.tsruns10,830 bytestests/unit/repl/parser.test.tsruns6,256 bytestests/unit/repl/shell-history-mode.test.tsruns3,792 bytestests/unit/repl/shell.test.tsruns9,329 bytestests/unit/research/branch-exploration.test.tsruns5,151 bytestests/unit/research/brief.test.tsruns39,021 bytestests/unit/research/citation-graph.test.tsruns6,517 bytestests/unit/research/decompose.test.tsruns13,308 bytestests/unit/research/entity-extractor.test.tsruns1,698 bytestests/unit/research/gap-detection.test.tsruns1,291 bytestests/unit/research/pipeline-breadth.test.tsruns6,183 bytestests/unit/research/pipeline-budget.test.tsruns2,659 bytestests/unit/research/pipeline-score-floor.test.tsruns12,402 bytestests/unit/research/pipeline-shell-completeness.test.tsruns6,544 bytestests/unit/research/pipeline-source-validation.test.tsruns10,811 bytestests/unit/research/pipeline.llm-gate-keystore.test.tsruns5,380 bytestests/unit/research/pipeline.local-tier.test.tsruns8,880 bytestests/unit/research/pipeline.test.tsruns15,052 bytestests/unit/research/render-brief.test.tsruns13,900 bytestests/unit/research/source-validation.test.tsruns10,205 bytestests/unit/research/synthesis-local.test.tsruns15,778 bytestests/unit/research/synthesize.test.tsruns9,015 bytestests/unit/response-time.test.tsruns2,853 bytestests/unit/search/answer-fallback.test.tsruns2,970 bytestests/unit/search/answer-synthesis-quota.test.tsruns3,074 bytestests/unit/search/answer-synthesis.provider-priority.test.tsruns4,191 bytestests/unit/search/answer-synthesis.test.tsruns19,608 bytestests/unit/search/authority-boost.aliases.test.tsruns2,238 bytestests/unit/search/authority-boost.cap.test.tsruns1,595 bytestests/unit/search/brand-collision-warning.test.tsruns13,378 bytestests/unit/search/burst-cascade.test.tsruns5,590 bytestests/unit/search/content-fetch.test.tsruns35,421 bytestests/unit/search/context-formatter.test.tsruns7,032 bytestests/unit/search/core/canonical-url.test.tsruns4,300 bytestests/unit/search/core/code-routing.test.tsruns10,744 bytestests/unit/search/core/core-provider-collision-dispatch.test.tsruns6,727 bytestests/unit/search/core/core-provider-error-intent.test.tsruns4,571 bytestests/unit/search/core/core-provider-kept-zero.test.tsruns5,401 bytestests/unit/search/core/core-provider-rare-variant.test.tsruns1,779 bytestests/unit/search/core/core-provider-recency-backfill.test.tsruns6,304 bytestests/unit/search/core/core-provider-score-floor.test.tsruns7,705 bytestests/unit/search/core/core-provider-tier-budgets.test.tsruns7,917 bytestests/unit/search/core/date-window.test.tsruns3,214 bytestests/unit/search/core/domain-quality.test.tsruns5,376 bytestests/unit/search/core/engine-quality.test.tsruns2,547 bytestests/unit/search/core/error-intent.test.tsruns7,372 bytestests/unit/search/core/lexical-alignment.test.tsruns2,234 bytestests/unit/search/core/orchestrator-cache.test.tsruns5,602 bytestests/unit/search/core/orchestrator-rank.test.tsruns21,777 bytestests/unit/search/core/query-expansion.test.tsruns3,124 bytestests/unit/search/core/rare-terms.test.tsruns6,312 bytestests/unit/search/core/rerank-fold.test.tsruns27,082 bytestests/unit/search/core/score-floor-per-engine.test.tsruns5,772 bytestests/unit/search/core/score-floor.test.tsruns8,312 bytestests/unit/search/core/text-tokenizer.test.tsruns1,205 bytestests/unit/search/country.test.tsruns4,256 bytestests/unit/search/dedup.test.tsruns3,347 bytestests/unit/search/degraded-recovery.test.tsruns15,329 bytestests/unit/search/engine-breaker.test.tsruns24,991 bytestests/unit/search/engine-health.test.tsruns7,694 bytestests/unit/search/engine-quality.test.tsruns4,200 bytestests/unit/search/engine-soft-deadline.test.tsruns10,799 bytestests/unit/search/engine-telemetry.test.tsruns10,869 bytestests/unit/search/engine-throttle.test.tsruns7,412 bytestests/unit/search/engine-warnings.test.tsruns3,465 bytestests/unit/search/engines-used-semantics.test.tsruns6,189 bytestests/unit/search/engines/arxiv.test.tsruns3,578 bytestests/unit/search/engines/bing-decoder.test.tsruns1,604 bytestests/unit/search/engines/bing-news.test.tsruns3,579 bytestests/unit/search/engines/bing.test.tsruns2,366 bytestests/unit/search/engines/brave-image.test.tsruns4,259 bytestests/unit/search/engines/brave.test.tsruns1,938 bytestests/unit/search/engines/crates-io.test.tsruns3,979 bytestests/unit/search/engines/date-parsing.test.tsruns4,056 bytestests/unit/search/engines/dblp.test.tsruns8,350 bytestests/unit/search/engines/ddg-image.test.tsruns4,621 bytestests/unit/search/engines/devdocs.test.tsruns1,906 bytestests/unit/search/engines/duckduckgo.test.tsruns2,669 bytestests/unit/search/engines/github-code.test.tsruns6,900 bytestests/unit/search/engines/hn-algolia.test.tsruns4,931 bytestests/unit/search/engines/lobsters.test.tsruns6,882 bytestests/unit/search/engines/marginalia.test.tsruns3,544 bytestests/unit/search/engines/mdn.test.tsruns2,669 bytestests/unit/search/engines/mojeek.test.tsruns3,408 bytestests/unit/search/engines/openalex.test.tsruns7,356 bytestests/unit/search/engines/openreview.test.tsruns5,753 bytestests/unit/search/engines/semantic-scholar.test.tsruns4,734 bytestests/unit/search/engines/stackoverflow.test.tsruns3,991 bytestests/unit/search/engines/wikipedia.test.tsruns1,857 bytestests/unit/search/evidence-default.test.tsruns7,182 bytestests/unit/search/evidence-score.test.tsruns4,624 bytestests/unit/search/evidence-token-discipline.test.tsruns8,493 bytestests/unit/search/evidence.test.tsruns4,160 bytestests/unit/search/exact-match-pre-dedup.test.tsruns5,930 bytestests/unit/search/exact-match.test.tsruns4,926 bytestests/unit/search/exclude-domains.test.tsruns5,268 bytestests/unit/search/expand-query.test.tsruns657 bytestests/unit/search/favicon.test.tsruns4,352 bytestests/unit/search/filters.test.tsruns9,181 bytestests/unit/search/find-similar-embedding.test.tsruns13,424 bytestests/unit/search/find-similar-threshold.test.tsruns6,010 bytestests/unit/search/find-similar.test.tsruns24,071 bytestests/unit/search/find-similar/crawl-rank.test.tsruns16,452 bytestests/unit/search/find-similar/generate-search-queries.test.tsruns1,955 bytestests/unit/search/find-similar/mode.test.tsruns2,274 bytestests/unit/search/format-rename.test.tsruns992 bytestests/unit/search/freshness.test.tsruns5,920 bytestests/unit/search/highlights-evidence.test.tsruns1,926 bytestests/unit/search/highlights.test.tsruns6,601 bytestests/unit/search/hybrid/merge.test.tsruns5,243 bytestests/unit/search/hybrid/router.test.tsruns11,284 bytestests/unit/search/hybrid/signals.test.tsruns8,614 bytestests/unit/search/include-domains-hard-filter.test.tsruns8,488 bytestests/unit/search/include-images.test.tsruns5,281 bytestests/unit/search/language-filter.test.tsruns3,030 bytestests/unit/search/mojeek-probe-only.test.tsruns2,880 bytestests/unit/search/multi-query.decompose.test.tsruns2,220 bytestests/unit/search/multi-query.test.tsruns12,380 bytestests/unit/search/passage-spans.test.tsruns2,215 bytestests/unit/search/query-understanding.test.tsruns10,047 bytestests/unit/search/query.test.tsruns1,859 bytestests/unit/search/remote-rerank-provider.test.tsruns6,209 bytestests/unit/search/rerank-recency.test.tsruns3,732 bytestests/unit/search/rerank.test.tsruns6,442 bytestests/unit/search/reranker/consensus-boost.test.tsruns2,278 bytestests/unit/search/reranker/recency.test.tsruns1,940 bytestests/unit/search/reranker/transformers-rerank-provider-errors.test.tsruns2,851 bytestests/unit/search/rrf.test.tsruns6,182 bytestests/unit/search/sampling.test.tsruns6,211 bytestests/unit/search/searxng-filtering.test.tsruns7,856 bytestests/unit/search/searxng-orchestrator-strip.test.tsruns3,077 bytestests/unit/search/searxng.test.tsruns3,174 bytestests/unit/search/time-range.test.tsruns6,060 bytestests/unit/search/tokens.test.tsruns2,655 bytestests/unit/search/transformers-rerank-provider.test.tsruns4,370 bytestests/unit/search/truncate.test.tsruns2,586 bytestests/unit/search/url-unwrap.test.tsruns1,307 bytestests/unit/search/v1/context-rank.test.tsruns6,326 bytestests/unit/search/v1/engine-base.test.tsruns9,434 bytestests/unit/search/v1/intent-router.test.tsruns15,555 bytestests/unit/search/v1/orchestrator.test.tsruns60,850 bytestests/unit/search/v1/recency-boost.test.tsruns6,278 bytestests/unit/search/v1/recent-cache-dedup.test.tsruns8,038 bytestests/unit/search/v1/rss/feed-config.test.tsruns4,200 bytestests/unit/search/v1/rss/feed-parser.test.tsruns4,960 bytestests/unit/search/v1/rss/feed-poller.test.tsruns4,895 bytestests/unit/search/v1/rss/feed-store.test.tsruns3,364 bytestests/unit/search/v1/rss/rss-engine.test.tsruns2,548 bytestests/unit/search/v1/v1-provider.test.tsruns32,437 bytestests/unit/search/v1/verticals/code.test.tsruns4,246 bytestests/unit/search/v1/verticals/docs.test.tsruns2,865 bytestests/unit/search/v1/verticals/general.test.tsruns3,543 bytestests/unit/search/v1/verticals/news.test.tsruns5,738 bytestests/unit/search/v1/verticals/papers.test.tsruns1,999 bytestests/unit/search/validator.test.tsruns2,804 bytestests/unit/searxng/bootstrap-lock.test.tsruns3,824 bytestests/unit/searxng/bootstrap-retry.test.tsruns16,059 bytestests/unit/searxng/bootstrap.test.tsruns5,379 bytestests/unit/searxng/docker.test.tsruns7,695 bytestests/unit/searxng/enabled.test.tsruns3,425 bytestests/unit/searxng/process-health.test.tsruns3,610 bytestests/unit/searxng/process-lock.test.tsruns2,267 bytestests/unit/searxng/process.test.tsruns6,207 bytestests/unit/security/key-crypto.test.tsruns3,050 bytestests/unit/security/key-store.test.tsruns10,514 bytestests/unit/server/backend-status-bootstrapping.test.tsruns1,549 bytestests/unit/server/backend-status.test.tsruns1,446 bytestests/unit/server/format-schema.test.tsruns1,411 bytestests/unit/server/instructions.test.tsruns6,000 bytestests/unit/server/schema-registration.test.tsruns11,085 bytestests/unit/server/search-response.test.tsruns4,124 bytestests/unit/server/server-factory.test.tsruns7,822 bytestests/unit/server/tool-annotations.test.tsruns8,464 bytestests/unit/server/tool-schemas.test.tsruns543 bytestests/unit/server/warmup-on-start.test.tsruns7,015 bytestests/unit/setup-status.test.tsruns13,142 bytestests/unit/skill-md.test.tsruns12,559 bytestests/unit/sponsors-links.test.tsruns8,176 bytestests/unit/tools/agent.test.tsruns12,981 bytestests/unit/tools/cache-hybrid.test.tsruns7,389 bytestests/unit/tools/cache.test.tsruns14,980 bytestests/unit/tools/crawl-map-routing.test.tsruns5,200 bytestests/unit/tools/crawl.test.tsruns13,577 bytestests/unit/tools/diff.test.tsruns12,752 bytestests/unit/tools/extract.body-retained.test.tsruns2,056 bytestests/unit/tools/extract.test.tsruns32,295 bytestests/unit/tools/fetch-embedding.test.tsruns4,239 bytestests/unit/tools/fetch-mode.test.tsruns4,353 bytestests/unit/tools/fetch.challenge-provenance.test.tsruns3,821 bytestests/unit/tools/fetch.http-error.test.tsruns2,081 bytestests/unit/tools/fetch.silent-failures.test.tsruns10,054 bytestests/unit/tools/fetch.stealth-cache-bypass.test.tsruns3,624 bytestests/unit/tools/fetch.test.tsruns37,380 bytestests/unit/tools/find-similar.test.tsruns16,730 bytestests/unit/tools/max-tokens-out.test.tsruns9,969 bytestests/unit/tools/research.test.tsruns10,414 bytestests/unit/tools/search-answer.test.tsruns12,346 bytestests/unit/tools/search-cache-embed.test.tsruns3,326 bytestests/unit/tools/search-filtering.test.tsruns13,168 bytestests/unit/tools/search-max-content-chars.test.tsruns4,116 bytestests/unit/tools/search-mode.test.tsruns2,352 bytestests/unit/tools/search-multi-query.test.tsruns10,271 bytestests/unit/tools/search-timing.test.tsruns5,537 bytestests/unit/tools/search-warning.test.tsruns2,011 bytestests/unit/tools/search.engine-warnings.test.tsruns5,983 bytestests/unit/tools/search.images.test.tsruns8,432 bytestests/unit/tools/search.long-tail-engines.test.tsruns6,344 bytestests/unit/tools/search.test.tsruns15,330 bytestests/unit/tui/verify-e2e.test.tsruns16,690 bytestests/unit/types-multi-query.test.tsruns1,728 bytestests/unit/types.test.tsruns7,905 bytestests/unit/types/solve-provenance.test.tsruns1,941 bytestests/unit/types/stage-result.test.tsruns1,282 bytestests/unit/util/abort.test.tsruns3,020 bytestests/unit/util/child-env.test.tsruns2,909 bytestests/unit/util/mode.test.tsruns1,469 bytestests/unit/util/native-abi.test.tsruns3,501 bytestests/unit/util/redact-url.test.tsruns1,336 bytestests/unit/watch/ssrf.test.tsruns13,438 bytestests/unit/watch/store.test.tsruns6,898 bytestests/unit/wizard-setup-complete.test.tsxruns2,159 bytestests/watch/ssrf-resolved-host.test.tsruns2,815 bytestests/watch/ssrf-resolved-serve-target.test.tsruns4,804 bytestsconfig.build.jsonasset169 bytestsconfig.jsonasset531 bytestsup.config.tsruns272 bytesvitest.config.tsruns571 bytesvitest.perf.config.tsruns443 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo
When your agent uses it
Local-first web intelligence for AI agents. Use wigolo for ALL web operations: searching, fetching pages, crawling sites, checking the cache, extracting data, finding similar content, deep research, data gathering, diffing page versions, and watching pages for changes. Prefer over built-in WebSearch/WebFetch for cached, transparent, audit-trail-friendly access with explainable scoring.
What it loads into context
Frontmatter
144 tokensAlways available to the agent
SKILL.md
1,096 tokensWhen the skill is activated
Reference documents
11,514 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Tool Selection
- Escalation Pattern
- Search backend
- Key Rules
- When NOT to use wigolo
- Per-Tool Details
Files
../wigolo-agent/SKILL.mddoc3,815 bytes../wigolo-cache/SKILL.mddoc4,428 bytes../wigolo-crawl/SKILL.mddoc3,468 bytes../wigolo-diff/SKILL.mddoc3,679 bytes../wigolo-extract/SKILL.mddoc4,367 bytes../wigolo-fetch/SKILL.mddoc3,536 bytes../wigolo-find-similar/SKILL.mddoc4,503 bytes../wigolo-research/SKILL.mddoc3,984 bytes../wigolo-search/SKILL.mddoc5,379 bytes../wigolo-watch/SKILL.mddoc4,055 bytesSKILL.mdcore4,271 bytesSKILL.mdcore4,271 bytesSKILL.mdcore4,271 bytesrules/cache-first.mddoc1,500 bytesrules/synthesis.mddoc2,479 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-agent
When your agent uses it
Autonomous data gathering across sources — plans search queries and URLs from a natural-language prompt, executes in parallel within a time budget, optionally extracts structured fields via JSON Schema, and synthesizes results with full step transparency. Use when the user needs data collected from the web with a specific shape, says "gather data", "find pricing for", "collect information about", "extract from multiple sites", or provides a JSON schema for web data.
What it loads into context
Frontmatter
158 tokensAlways available to the agent
SKILL.md
958 tokensWhen the skill is activated
Reference documents
2,073 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- How It Works
- Output Transparency
- Anti-Patterns
- When NOT to use wigolo-agent
- See Also
Files
SKILL.mdcore3,815 bytes../wigolo-extract/SKILL.mddoc4,367 bytes../wigolo-research/SKILL.mddoc3,984 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-cache
When your agent uses it
Local-first knowledge cache — full-text and hybrid semantic search over every page wigolo has already fetched, crawled, or searched. Use before any web request: cached hits return instantly and free. Triggers when the user says "check the cache", "have we seen this", "what's on disk", "search what I've already fetched", "cache stats", or "what changed since I last looked". Also clears matching entries and re-checks cached URLs for changes.
What it loads into context
Frontmatter
165 tokensAlways available to the agent
SKILL.md
1,126 tokensWhen the skill is activated
Reference documents
4,821 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- The Cache-First Workflow
- Modes
- Stats and Change Detection
- Anti-Patterns
- When NOT to use wigolo-cache
- See Also
Files
SKILL.mdcore4,428 bytes../wigolo-crawl/SKILL.mddoc3,468 bytes../wigolo-diff/SKILL.mddoc3,679 bytes../wigolo-find-similar/SKILL.mddoc4,503 bytes../wigolo-search/SKILL.mddoc5,379 bytes../wigolo/rules/cache-first.mddoc1,500 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-crawl
When your agent uses it
Local-first multi-page crawl with sitemap, BFS, DFS, and URL-map strategies, anchor-fragment dedup, rate limiting, robots.txt respect, and automatic local cache population. Use when the user wants to index documentation, crawl a docs site, extract all pages under a path, or says "crawl", "index this site", "get all the docs", "bulk extract". Prefer when crawled pages should land in a reusable local cache for later `cache` / `find_similar` queries.
What it loads into context
Frontmatter
173 tokensAlways available to the agent
SKILL.md
903 tokensWhen the skill is activated
Reference documents
3,175 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- After Crawling
- Anti-Patterns
- When NOT to use wigolo-crawl
- See Also
Files
../wigolo-cache/SKILL.mddoc4,428 bytesSKILL.mdcore3,468 bytes../wigolo-fetch/SKILL.mddoc3,536 bytes../wigolo-find-similar/SKILL.mddoc4,503 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-diff
When your agent uses it
Compare two versions of a page and see exactly what changed — a live URL against its cached copy, two URLs, or two markdown blobs. Section-level hunks, word- or line-level granularity, or a summary of counts. Use when the user says "what changed", "diff these", "compare this page to last time", "show me the changes", "did this doc update", or wants a changelog between two versions of the same content.
What it loads into context
Frontmatter
164 tokensAlways available to the agent
SKILL.md
983 tokensWhen the skill is activated
Reference documents
3,088 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- Output Shapes
- Comparing Against the Cache
- Anti-Patterns
- When NOT to use wigolo-diff
- See Also
Files
../wigolo-cache/SKILL.mddoc4,428 bytesSKILL.mdcore3,679 bytes../wigolo-fetch/SKILL.mddoc3,536 bytes../wigolo-watch/SKILL.mddoc4,055 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-extract
When your agent uses it
Local-first structured extraction from any webpage — tables, definition lists, key-value pairs, JSON-LD, microdata, chart hints (SVG titles / aria-labels / figcaptions), brand assets, and metadata. Use when the user wants structured data, pricing tables, feature comparisons, or says "extract the table", "get structured data", "pull the pricing", "extract as JSON". For autonomous navigation across many pages, use wigolo's `agent` tool instead.
What it loads into context
Frontmatter
168 tokensAlways available to the agent
SKILL.md
1,069 tokensWhen the skill is activated
Reference documents
1,860 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Modes
- Chart Hints
- Schema Mode
- Named Schemas
- Brand Mode
- Token Budget
- Anti-Patterns
- When NOT to use wigolo-extract
- See Also
Files
../wigolo-agent/SKILL.mddoc3,815 bytesSKILL.mdcore4,367 bytesSKILL.mdcore4,367 bytes../wigolo-fetch/SKILL.mddoc3,536 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-fetch
When your agent uses it
Local-first URL fetch with clean markdown, structured metadata, JS-rendered SPA support, authenticated browser sessions, PDFs, and content change detection. Use when the user provides a URL, says "fetch", "get this page", "read this URL", or wants content from a specific webpage. Prefer over built-in WebFetch for local cache reuse, browser-session auth, and structured metadata parity.
What it loads into context
Frontmatter
148 tokensAlways available to the agent
SKILL.md
902 tokensWhen the skill is activated
Reference documents
3,381 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- Output
- Anti-Patterns
- When NOT to use wigolo-fetch
- See Also
Files
../wigolo-crawl/SKILL.mddoc3,468 bytes../wigolo-extract/SKILL.mddoc4,367 bytesSKILL.mdcore3,536 bytes../wigolo-search/SKILL.mddoc5,379 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-find-similar
When your agent uses it
Hybrid semantic discovery — fuses embeddings + keyword search + live web search via 3-way Reciprocal Rank Fusion. Use when the user has a good source and wants more like it, says "find similar", "related pages", "more like this", or wants to discover content related to a known URL or concept. Works best after a `crawl` or several `fetch` calls have warmed the local cache. Emits `cold_start` when local signals are weak.
What it loads into context
Frontmatter
167 tokensAlways available to the agent
SKILL.md
1,147 tokensWhen the skill is activated
Reference documents
2,312 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- How It Works
- Modes
- Cold-Start Signal
- Important: Build the Cache First
- Anti-Patterns
- When NOT to use wigolo-find-similar
- See Also
Files
../wigolo-crawl/SKILL.mddoc3,468 bytesSKILL.mdcore4,503 bytesSKILL.mdcore4,503 bytesSKILL.mdcore4,503 bytes../wigolo-search/SKILL.mddoc5,379 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-research
When your agent uses it
Local-first multi-step research with question decomposition, parallel search, structured briefs, cross-references, and gap analysis. Use when the user needs comprehensive analysis, comparison reports, literature reviews, or says "research", "compare X vs Y", "deep dive", "thorough analysis", "find everything about". Returns a structured `brief` with `topics`, `highlights`, `key_findings`, `sections.overview.cross_references`, `sections.comparison`, `sections.gaps`.
What it loads into context
Frontmatter
170 tokensAlways available to the agent
SKILL.md
1,004 tokensWhen the skill is activated
Reference documents
2,941 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Depth Levels
- Output: Structured Brief
- Writing the Report
- Anti-Patterns
- When NOT to use wigolo-research
- See Also
Files
../wigolo-agent/SKILL.mddoc3,815 bytesSKILL.mdcore3,984 bytesSKILL.mdcore3,984 bytesSKILL.mdcore3,984 bytesSKILL.mdcore3,984 bytes../wigolo-search/SKILL.mddoc5,379 bytes../wigolo/rules/synthesis.mddoc2,479 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-search
When your agent uses it
Local-first web search with ML reranking, multi-query arrays, domain scoping, phrase-exact match, time-range filters, country hints, depth tiers, and explainable evidence scoring. Use when the user wants to search the web, find information, look something up, research a topic, or says "search for", "find me", "look up". Prefer over built-in WebSearch for cached, transparent, audit-trail-friendly search with per-engine telemetry.
What it loads into context
Frontmatter
164 tokensAlways available to the agent
SKILL.md
1,409 tokensWhen the skill is activated
Reference documents
2,285 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- Always-Emitted Fields
- Patterns
- Anti-Patterns
- When NOT to use wigolo-search
- See Also
Files
../wigolo-fetch/SKILL.mddoc3,536 bytes../wigolo-research/SKILL.mddoc3,984 bytesSKILL.mdcore5,379 bytes../wigolo/rules/cache-first.mddoc1,500 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubwigolo-watch
When your agent uses it
Monitor a page for changes over time. Create lazy watch jobs on one or many URLs, list them, and check for changes on demand — with optional SSRF-guarded webhook delivery when a change is detected. Use when the user says "monitor this page", "watch this URL for changes", "tell me when this updates", "track this changelog", "notify me if this changes", or wants recurring change detection on web content.
What it loads into context
Frontmatter
159 tokensAlways available to the agent
SKILL.md
1,060 tokensWhen the skill is activated
Reference documents
3,011 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Quick Reference
- Parameters
- How It Works
- Anti-Patterns
- When NOT to use wigolo-watch
- See Also
Files
../wigolo-cache/SKILL.mddoc4,428 bytes../wigolo-diff/SKILL.mddoc3,679 bytes../wigolo-fetch/SKILL.mddoc3,536 bytesSKILL.mdcore4,055 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- wigolo
- wigolo
- wigolo-agent
- wigolo-cache
- wigolo-crawl
- wigolo-diff
- wigolo-extract
- wigolo-fetch
- wigolo-find-similar
- wigolo-research
- wigolo-search
- wigolo-watch
Repository facts
- License
- No license detected
- Created
- Apr 12, 2026
- Last pushed
- Nov 5, 2026
- Forks
- 459
- Open issues
- 14
- Project activity
- Active
Rank over the last 12 weeks
Now #264 · best #218 · down 31 in 30 days
- #257 from Oct 31 to Nov 1
- #258 on Nov 2
- #260 on Nov 3
- #261 on Nov 4
- #262 on Nov 5
- #264 since Nov 6
66 earlier periods
- #223 on Aug 2
- #218 on Aug 7
- #217 on Aug 8
- #216 on Aug 9
- #222 on Aug 10
- #220 on Aug 11
- #217 on Aug 12
- #221 from Aug 13 to Aug 14
- #219 on Aug 15
- #218 from Aug 16 to Aug 17
- #222 on Aug 18
- #221 on Aug 19
- #218 on Aug 20
- #219 on Aug 21
- #218 on Aug 22
- #224 on Aug 23
- #223 from Aug 24 to Aug 26
- #224 on Aug 27
- #223 from Aug 28 to Aug 29
- #221 from Aug 30 to Aug 31
- #226 on Sep 1
- #219 on Sep 2
- #228 on Sep 3
- #223 from Sep 4 to Sep 5
- #221 on Sep 6
- #222 from Sep 7 to Sep 8
- #223 on Sep 9
- #221 on Sep 10
- #223 on Sep 11
- #225 on Sep 12
- #227 on Sep 13
- #226 on Sep 14
- #227 from Sep 15 to Sep 16
- #226 on Sep 17
- #229 on Sep 18
- #227 on Sep 19
- #231 on Sep 20
- #230 from Sep 21 to Sep 23
- #229 on Sep 24
- #228 from Sep 25 to Sep 26
- #229 on Sep 27
- #231 from Sep 28 to Sep 29
- #228 on Sep 30
- #231 on Oct 1
- #233 on Oct 2
- #229 on Oct 3
- #227 on Oct 4
- #228 on Oct 5
- #231 on Oct 6
- #233 on Oct 7
- #232 on Oct 8
- #237 on Oct 9
- #234 from Oct 10 to Oct 11
- #238 on Oct 12
- #239 on Oct 13
- #238 on Oct 14
- #239 on Oct 15
- #237 on Oct 16
- #239 from Oct 17 to Oct 18
- #240 from Oct 19 to Oct 20
- #242 from Oct 21 to Oct 22
- #243 on Oct 24
- #245 on Oct 25
- #248 on Oct 28
- #252 on Oct 29
- #253 on Oct 30
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 2, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 37 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedpackage-lock.json:7405Analysis incomplete: signal count limit reachedsite/package-lock.json:7812Analysis incomplete: signal count limit reachedtests/fixtures/extraction/react-reference-real.html:1Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/react-reference-real.html:99Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/react-reference-real.html:97Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/react-reference-real.html:98Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/react-reference-real.html:141Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/react-reference-real.html:139Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/vitepress-guide.html:10Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/vitepress-guide.html:8Analysis incomplete: physical or joined line exceeds character limittests/fixtures/extraction/vitepress-guide.html:9Analysis incomplete: physical or joined line exceeds character limittests/fixtures/reranker-tokenizer-corpus.json:17Analysis incomplete: physical or joined line exceeds character limittests/fixtures/reranker-tokenizer-corpus.json:18Analysis incomplete: physical or joined line exceeds character limit
- No broad tool permissions
- 132 dangerous shell commandsin 47 files: scripts/verify-channel-rest.sh:56 scripts/verify-channel-docker.sh:81 scripts/verify-channel-binary.sh:50 and 44 more
- 18,793 network referencesin 757 files: package-lock.json:72 site/package-lock.json:35 tests/unit/search/v1/orchestrator.test.ts:130 and 754 more
- 2 obfuscation signalsin 1 file: src/extraction/site-extractors/amazon.ts:327
- 3 instruction override signalsin 1 file: tests/unit/fetch/ai-solve.test.ts:270
- 1,378 executable scriptsin 1,378 files: Dockerfile:1 Makefile:1 assets/brand/generate.cjs:1 and 1,375 more
- 819 references to secretsin 145 files: tests/unit/security/key-store.test.ts:4 src/security/key-store.ts:2 src/persisted-config.ts:11 and 142 more
- No requests to vote in Hot
Show all 21,127 signals by file
.github/FUNDING.yml
.github/ISSUE_TEMPLATE/adopter.yml
- Network accessline 7
attributes: value: | Thanks for using wigolo. Entries appear in [ADOPTERS.md](https://github.com/KnockOutEZ/wigolo/blob/main/ADOPTERS.md) and, with a logo, in the "Used by" row on wigolo.app. Only request a listing for an orga - Network accessline 8
value: | Thanks for using wigolo. Entries appear in [ADOPTERS.md](https://github.com/KnockOutEZ/wigolo/blob/main/ADOPTERS.md) and, with a logo, in the "Used by" row on wigolo.app. Only request a listing for an organization you're al - Network accessline 9
Thanks for using wigolo. Entries appear in [ADOPTERS.md](https://github.com/KnockOutEZ/wigolo/blob/main/ADOPTERS.md) and, with a logo, in the "Used by" row on wigolo.app. Only request a listing for an organization you're allowed to speak fo - Network accessline 19
attributes: label: Website placeholder: "https://acme.example" - Network accessline 20
label: Website placeholder: "https://acme.example" validations: - Network accessline 21
placeholder: "https://acme.example"
.github/ISSUE_TEMPLATE/config.yml
- Network accessline 2
contact_links: - name: Question / discussion url: https://github.com/KnockOutEZ/wigolo/discussions - Network accessline 3
- name: Question / discussion url: https://github.com/KnockOutEZ/wigolo/discussions about: Not a bug or feature? Ask anything here. - Network accessline 4
url: https://github.com/KnockOutEZ/wigolo/discussions - Network accessline 5
about: Not a bug or feature? Ask anything here. - name: Security vulnerability url: https://github.com/KnockOutEZ/wigolo/blob/main/SECURITY.md - Network accessline 6
- name: Security vulnerability url: https://github.com/KnockOutEZ/wigolo/blob/main/SECURITY.md about: Please report security issues privately — see SECURITY.md. - Network accessline 7
url: https://github.com/KnockOutEZ/wigolo/blob/main/SECURITY.md
.github/PULL_REQUEST_TEMPLATE.md
- Network accessline 20
- [ ] Follows [Conventional Commits](https://www.conventionalcommits.org/)
.github/workflows/binary-build.yml
- Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Access to secretsline 164
[Credential-related source omitted] - Access to secretsline 165
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 167
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted]
.github/workflows/ci.yml
- Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted] - Network accessline 148
shell: bash run: | for i in 1 2 3; do wigolo fetch https://example.com --json > fetch.json && break; echo "fetch retry $i" >&2; sleep 5; done - Network accessline 149
run: | for i in 1 2 3; do wigolo fetch https://example.com --json > fetch.json && break; echo "fetch retry $i" >&2; sleep 5; done node -e "const t=require('fs').readFileSync('fetch.json','utf8'); JSON.parse(t); if (t.len - Network accessline 150
for i in 1 2 3; do wigolo fetch https://example.com --json > fetch.json && break; echo "fetch retry $i" >&2; sleep 5; done - Access to secretsline 156
[Credential-related source omitted]
.github/workflows/release.yml
- Access to secretsline 21
[Credential-related source omitted] - Network accessline 28
with: node-version: 22 registry-url: 'https://registry.npmjs.org' - Network accessline 29
node-version: 22 registry-url: 'https://registry.npmjs.org' cache: npm - Network accessline 30
registry-url: 'https://registry.npmjs.org' - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Access to secretsline 153
[Credential-related source omitted] - Access to secretsline 171
[Credential-related source omitted] - Network accessline 217
continue-on-error: true run: | curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher - Network accessline 218
run: | curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher rm -f server.json - Network accessline 219
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher - Dangerous shell operationline 220
rm -f server.json - Access to secretsline 225
[Credential-related source omitted] - Access to secretsline 229
[Credential-related source omitted]
.github/workflows/site.yml
.github/workflows/star-chart.yml
.gitignore
- Access to secretsline 20
[Credential-related source omitted]
ADOPTERS.md
CHANGELOG.md
- Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Network accessline 67
### Distribution channels - Ships on npm (primary), a `curl … | sh` installer, a Homebrew formula, a Docker image, and a standalone single-file binary — no new native-dependency landmine. Each channel's install/upgrade/uninstall and the exa - Dangerous shell operationline 68
- Ships on npm (primary), a `curl … | sh` installer, a Homebrew formula, a Docker image, and a standalone single-file binary — no new native-dependency landmine. Each channel's install/upgrade/uninstall and the exact MCP wiring command are - Network accessline 68
- Ships on npm (primary), a `curl … | sh` installer, a Homebrew formula, a Docker image, and a standalone single-file binary — no new native-dependency landmine. Each channel's install/upgrade/uninstall and the exact MCP wiring command are - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 136
[Credential-related source omitted] - Network accessline 203
- `mode: 'fast' | 'balanced' | 'deep'` on both `search` and `fetch` tools. Default `balanced` (no behavior change vs. prior release). - **fast** — HTTP-only fetch (never spawns a browser; sets `js_required: true` - Network accessline 204
Default `balanced` (no behavior change vs. prior release). - **fast** — HTTP-only fetch (never spawns a browser; sets `js_required: true` when the HTTP body looks like a JS shell), single search engine, reranker - Network accessline 205
- **fast** — HTTP-only fetch (never spawns a browser; sets `js_required: true` - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 240
[Credential-related source omitted]
CODE_OF_CONDUCT.md
- Network accessline 68
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. - Network accessline 70
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. - Network accessline 72
[homepage]: https://www.contributor-covenant.org
CONTRIBUTING.md
- Network accessline 22
1. Open an issue first for anything non-trivial so we can agree on the approach. 2. Branch from `main`, keep changes focused, and add tests for new behavior. 3. Use [Conventional Commits](https://www.conventionalcommits.org/) - Network accessline 23
2. Branch from `main`, keep changes focused, and add tests for new behavior. 3. Use [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `test:`, `refactor:`, `chore:`, `docs:`). - Network accessline 24
3. Use [Conventional Commits](https://www.conventionalcommits.org/)
Dockerfile
- Executable scriptline 1
Executable file - Dangerous shell operationline 38
# No sudo in the image: the first-use deps-strategy probe treats its absence as - Dangerous shell operationline 59
RUN ./node_modules/.bin/playwright install-deps chromium && rm -rf /var/lib/apt/lists/* - Dangerous shell operationline 60
&& rm -rf /var/lib/apt/lists/* - Network accessline 76
LABEL org.opencontainers.image.title="wigolo" \ org.opencontainers.image.description="Local-first web intelligence MCP server. The browser engine binary and on-device models download on first use into the /data volume." \ org.op - Network accessline 77
org.opencontainers.image.description="Local-first web intelligence MCP server. The browser engine binary and on-device models download on first use into the /data volume." \ org.opencontainers.image.source="https://github.com/KnockOut - Network accessline 78
org.opencontainers.image.source="https://github.com/KnockOutEZ/wigolo" - Network accessline 83
LABEL org.opencontainers.image.title="wigolo" \ org.opencontainers.image.description="Local-first web intelligence MCP server with the browser engine preinstalled. On-device models download on first use." \ org.opencontainers.im - Network accessline 85
org.opencontainers.image.source="https://github.com/KnockOutEZ/wigolo"
LICENSE
- Network accessline 13
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 14
along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 23
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Network accessline 664
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 665
along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 678
if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <https://www.gnu.org/licenses/>. - Network accessline 680
<https://www.gnu.org/licenses/>.
README.md
- Network accessline 11
[](https://www.npmjs.com/package/wigolo) - Network accessline 12
[](https://www.npmjs.com/package/wigolo) - Network accessline 13
[](https://github.com/KnockOutEZ/wigolo/stargazers) - Network accessline 14
[](https://github.com/KnockOutEZ/wigolo/actions/workflows/ci.yml) - Network accessline 15
[](https://nodejs.org) - Network accessline 16
[](https://modelcontextprotocol.io) - Network accessline 17
[](#license) - Network accessline 18
[](#beta--feedback) - Network accessline 19
[](https://x.com/yourtowhid) - Network accessline 20
[](https://discord.gg/BkUUgz2bNF) - Network accessline 22
<a href="https://trendshift.io/repositories/79424?utm_source=repository-badge&utm_medium=badge&utm_campaign=badge-repository-79424" target="_blank"><img src="https://trendshift.io/api/badge/repositories/79424" alt="wigolo on Trendshift" wid - Network accessline 23
<a href="https://trendshift.io/repositories/79424?utm_source=trendshift-badge&utm_medium=badge&utm_campaign=badge-trendshift-79424" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/ - Network accessline 25
<sub>sponsored by</sub><br> <a href="https://wigolo.app/go/testmu/?ref=readme-top"><picture><source media="(prefers-color-scheme: dark)" srcset="assets/sponsors/testmu-ai-dark.svg"><img alt="TestMu AI" src="assets/sponsors/testmu-ai.svg" he - Network accessline 26
<a href="https://wigolo.app/go/testmu/?ref=readme-top"><picture><source media="(prefers-color-scheme: dark)" srcset="assets/sponsors/testmu-ai-dark.svg"><img alt="TestMu AI" src="assets/sponsors/testmu-ai.svg" height="20"></picture></a> - Network accessline 28
[Quickstart](#quickstart) · [Tools](#tools) · [Why wigolo](#why-its-different) · [Discord](https://discord.gg/BkUUgz2bNF) · [Sponsors](#sponsors) · [Benchmark](#benchmark) · [Docs](docs/README.md) · [Examples](examples/README.md) · [Licensi - Network accessline 30
**Join the community on [Discord](https://discord.gg/BkUUgz2bNF)** — questions, help, and what's being built next. - Network accessline 32
New features and updates ship steadily. Follow <a href="https://x.com/yourtowhid"><b>@yourtowhid on X</b></a> for all of it and new ways to use wigolo, and reach out there for collaborations or feedback · also on <a href="https://www.linked - Access to secretsline 75
[Credential-related source omitted] - Network accessline 86
"results": [{ "title": "Logical replication - PostgreSQL docs", "url": "https://www.postgresql.org/docs/current/logical-replication.html", - Network accessline 87
"title": "Logical replication - PostgreSQL docs", "url": "https://www.postgresql.org/docs/current/logical-replication.html", "excerpt": "Logical replication is a method of replicating data objects…", - Network accessline 88
"url": "https://www.postgresql.org/docs/current/logical-replication.html", - Network accessline 187
curl -sX POST http://127.0.0.1:3333/v1/search \ - Network accessline 259
<a href="https://www.star-history.com/#KnockOutEZ/wigolo&Date"> - Network accessline 260
<picture> <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-history-dark.svg"> <img alt="wigolo GitHub stars over time" src="https://raw.githubusercontent.com/KnockOutEZ - Network accessline 261
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-history-dark.svg"> - Network accessline 262
<img alt="wigolo GitHub stars over time" src="https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-history.svg" width="880"> - Network accessline 266
<sub>Refreshed daily from the GitHub API. <a href="https://github.com/KnockOutEZ/wigolo">Add a ⭐</a> if wigolo is useful to you.</sub> - Access to secretsline 312
[Credential-related source omitted] - Access to secretsline 316
[Credential-related source omitted] - Network accessline 330
**[examples/](examples/README.md)** — runnable, each with a README (and most with a terminal recording): one-shot CLI, NDJSON shell pipelines, REST via curl, TypeScript & Python SDKs, Vercel AI SDK tools, pointing self-hosted n8n at a remot - Network accessline 336
- 🐛 **[Report a bug](https://github.com/KnockOutEZ/wigolo/issues/new?template=bug_report.yml)** — broke, misbehaved, surprised you - Network accessline 337
- 💡 **[Request a feature](https://github.com/KnockOutEZ/wigolo/issues/new?template=feature_request.yml)** — something it should do - Network accessline 338
- 💬 **[Ask anything](https://github.com/KnockOutEZ/wigolo/discussions)** — questions, setups, show & tell - Network accessline 340
If wigolo earns a place in your setup, three things keep it going: a ⭐ **star** (it's how open source gets found), a **[☕ coffee](https://buymeacoffee.com/knockoutez)** (the open-source version is the full product; commercial licenses fund - Network accessline 400
- **npm** — [`wigolo`](https://www.npmjs.com/package/wigolo) *(primary channel — the Quickstart above)* - Network accessline 401
- **PyPI** — [`wigolo`](https://pypi.org/project/wigolo/) *(Python SDK)* - Network accessline 402
- **Docker** — [`ghcr.io/knockoutez/wigolo`](https://github.com/KnockOutEZ/wigolo/pkgs/container/wigolo) · [`towhid69420/wigolo`](https://hub.docker.com/r/towhid69420/wigolo) - Network accessline 404
- **Directories** — [Glama](https://glama.ai/mcp/servers/KnockOutEZ/wigolo) · [Smithery](https://smithery.ai/server/ktowhid20/wigolo) · [mcp.so](https://mcp.so/server/wigolo/KnockOutEZ) · [LobeHub](https://lobehub.com/mcp/knockoutez-wigolo) - Dangerous shell operationline 406
Homebrew, `curl | sh`, and the single-file binary are covered in the [installation guide](docs/installation.md). Use one channel per machine; they all share `~/.wigolo`. - Network accessline 406
Homebrew, `curl | sh`, and the single-file binary are covered in the [installation guide](docs/installation.md). Use one channel per machine; they all share `~/.wigolo`. - Network accessline 414
<a href="https://wigolo.app/go/testmu/?ref=readme"> - Network accessline 421
<sub>**[TestMu AI](https://wigolo.app/go/testmu/?ref=readme)** (formerly LambdaTest) is the world's first full-stack agentic AI quality engineering platform, trusted by 18,000+ enterprises.</sub> - Network accessline 425
**wigolo is free for everyone.** If you or your company would like to help keep it maintained, there's room for more sponsors — reach out at **[ktowhid20@gmail.com](mailto:ktowhid20@gmail.com)**, or see [what sponsorship includes](https://w - Network accessline 440
wigolo is open source, free, and actively maintained. If it saves you a metered search bill, a ⭐, a sharp issue, or a **[☕ coffee](https://buymeacoffee.com/knockoutez)** helps keep it sustainable. - Network accessline 441
If it saves you a metered search bill, a ⭐, a sharp issue, or a **[☕ coffee](https://buymeacoffee.com/knockoutez)** helps keep it sustainable. - Network accessline 443
<sub>Built and maintained by <a href="https://github.com/KnockOutEZ">@KnockOutEZ</a> · <a href="mailto:ktowhid20@gmail.com">ktowhid20@gmail.com</a> · <a href="https://x.com/yourtowhid">X</a> · <a href="https://www.linkedin.com/in/yourtowhid
SECURITY.md
- Network accessline 7
Instead, report privately using GitHub's **"Report a vulnerability"** feature under the repository's **Security** tab (https://github.com/KnockOutEZ/wigolo/security/advisories/new). This creates a - Network accessline 8
under the repository's **Security** tab (https://github.com/KnockOutEZ/wigolo/security/advisories/new). This creates a private advisory visible only to you and the maintainers. - Network accessline 9
(https://github.com/KnockOutEZ/wigolo/security/advisories/new). This creates a - Access to secretsline 27
[Credential-related source omitted]
SKILL.md
- Network accessline 4
author: KnockOutEZ license: AGPL-3.0-only repository: https://github.com/KnockOutEZ/wigolo - Network accessline 5
license: AGPL-3.0-only repository: https://github.com/KnockOutEZ/wigolo transport: stdio - Network accessline 6
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 96
{ "url": "https://react.dev/reference/react/useState", "section": "Parameters" } - Network accessline 144
{ "url": "https://docs.python.org/3/library/", "strategy": "sitemap", "max_pages": 30, "include_patterns": ["^https://docs\\.python\\.org/3/library/asyncio"] } - Network accessline 181
{ "url": "https://example.com/product", "mode": "schema", "schema": { "type": "object", "properties": { "price": { "type": "string" }, "name": { "type": "string" }, "sku": { "type": "string" } } } } - Network accessline 199
{ "url": "https://react.dev/reference/react/useState", "max_results": 8, "include_domains": ["react.dev", "developer.mozilla.org"] } - Network accessline 254
{ "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" }, "output": "hunks", "granularity": "section" } - Network accessline 273
{ "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 301
search({ "query": "node.js 22 release notes", "force_refresh": true, "time_range": "week" }) fetch({ "url": "https://nodejs.org/en/blog", "force_refresh": true }) - Network accessline 302
fetch({ "url": "https://nodejs.org/en/blog", "force_refresh": true }) - Network accessline 307
crawl({ "url": "https://docs.astro.build", "strategy": "sitemap", "max_pages": 40 }) - Network accessline 318
find_similar({ "url": "https://react.dev/reference/react/useMemo", "max_results": 6, "include_domains": ["react.dev"] }) - Network accessline 333
extract({ "url": "https://en.wikipedia.org/wiki/List_of_programming_languages", "mode": "tables" }) - Network accessline 338
extract({ "url": "https://example.com/product-page", "mode": "structured" }) - Network accessline 408
| `SEARXNG_MODE` | `native` | `native` runs local Python search engine; `docker` runs container | | `WIGOLO_CHROME_PROFILE_PATH` | unset | Chrome profile for `use_auth: true` | | `WIGOLO_CDP_URL` | unset | Chrome DevTools endpoint (e.g. `ht - Network accessline 409
| `WIGOLO_CHROME_PROFILE_PATH` | unset | Chrome profile for `use_auth: true` | | `WIGOLO_CDP_URL` | unset | Chrome DevTools endpoint (e.g. `http://localhost:9222`) | | `MAX_BROWSERS` | `3` | Browser pool size | - Network accessline 410
| `WIGOLO_CDP_URL` | unset | Chrome DevTools endpoint (e.g. `http://localhost:9222`) | - Network accessline 422
- Repository: https://github.com/KnockOutEZ/wigolo - Network accessline 423
- npm: https://www.npmjs.com/package/wigolo
SPONSORS.md
- Network accessline 14
<a href="https://wigolo.app/go/testmu/?ref=sponsors-page"> - Network accessline 21
[TestMu AI](https://wigolo.app/go/testmu/?ref=sponsors-page) - Network accessline 37
A one-off contribution is just as welcome as a sponsorship, via [Buy Me a Coffee](https://buymeacoffee.com/knockoutez). - Network accessline 38
[Buy Me a Coffee](https://buymeacoffee.com/knockoutez). - Network accessline 54
plus a logo and one-line description in the README sponsors section near the end. - On the **[project website](https://wigolo.app/)** homepage: a "sponsored by" - Network accessline 55
the end. - On the **[project website](https://wigolo.app/)** homepage: a "sponsored by" line under the logo wall near the top, and a card in the sponsors section. - Network accessline 56
- On the **[project website](https://wigolo.app/)** homepage: a "sponsored by" - Network accessline 57
line under the logo wall near the top, and a card in the sponsors section. Also on the [sponsor page](https://wigolo.app/sponsors/). - A credit at the top of **every GitHub release**'s notes. - Network accessline 58
Also on the [sponsor page](https://wigolo.app/sponsors/). - Network accessline 117
sessions without cookies or local storage, with URL query strings left out. The site uses Umami and honours Do Not Track, and its traffic is public: [live site stats](https://cloud.umami.is/share/PPqf7cwX1Qzh3n2D). The wigolo - Network accessline 118
The site uses Umami and honours Do Not Track, and its traffic is public: [live site stats](https://cloud.umami.is/share/PPqf7cwX1Qzh3n2D). The wigolo tool itself sends nothing to the site; this covers the website only. - Network accessline 119
[live site stats](https://cloud.umami.is/share/PPqf7cwX1Qzh3n2D). The wigolo
assets/blocks/claude-code/wigolo-command.md
- Network accessline 40
// Targeted doc fetch fetch({ "url": "https://react.dev/reference/react/useState", "section": "Parameters" }) - Network accessline 41
fetch({ "url": "https://react.dev/reference/react/useState", "section": "Parameters" }) - Network accessline 43
// Site indexing crawl({ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 }) - Network accessline 44
crawl({ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 }) - Network accessline 46
// Structured extraction extract({ "url": "https://example.com/pricing", "mode": "structured" }) - Network accessline 47
extract({ "url": "https://example.com/pricing", "mode": "structured" })
assets/blocks/cursor/wigolo.mdc
- Network accessline 56
// Fetch a specific section { "url": "https://react.dev/reference/react/useState", "section": "Parameters" } - Network accessline 57
{ "url": "https://react.dev/reference/react/useState", "section": "Parameters" } - Network accessline 59
// Crawl docs site { "url": "https://docs.astro.build", "strategy": "sitemap", "max_pages": 30 } - Network accessline 60
{ "url": "https://docs.astro.build", "strategy": "sitemap", "max_pages": 30 } - Network accessline 62
// Extract pricing table { "url": "https://example.com/pricing", "mode": "structured" } - Network accessline 63
{ "url": "https://example.com/pricing", "mode": "structured" }
assets/blocks/windsurf/rules-project.md
- Network accessline 39
{ "url": "https://react.dev/reference/react/useState", "section": "Parameters" } - Network accessline 51
{ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 76
{ "url": "https://example.com/pricing", "mode": "structured" } - Network accessline 89
{ "url": "https://react.dev/reference/react/useMemo", "include_domains": ["react.dev"] } - Network accessline 124
{ "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" }, "output": "hunks" } - Network accessline 136
{ "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 }
assets/brand/README.md
assets/brand/generate.cjs
- Executable scriptline 1
Executable file - Network accessline 16
const FONT_URLS = { 800: 'https://cdn.jsdelivr.net/npm/@fontsource/inter/files/inter-latin-800-normal.woff2', - Network accessline 17
800: 'https://cdn.jsdelivr.net/npm/@fontsource/inter/files/inter-latin-800-normal.woff2', - Network accessline 18
900: 'https://cdn.jsdelivr.net/npm/@fontsource/inter/files/inter-latin-900-normal.woff2', - Network accessline 22
const cache = path.join(os.tmpdir(), `wigolo-inter-${weight}.woff2`); if (!fs.existsSync(cache)) { const res = await fetch(FONT_URLS[weight]); - Network accessline 23
if (!fs.existsSync(cache)) { const res = await fetch(FONT_URLS[weight]); if (!res.ok) throw new Error(`font ${weight} download failed: ${res.status}`); - Network accessline 24
const res = await fetch(FONT_URLS[weight]);
assets/promo/anatomy-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="668" viewBox="0 0 920 668" role="img" aria-label="Anatomy of a wigolo search result: explainable score decomposition, live engine telemetry, surfaced degradation, and self-flagged
assets/promo/anatomy.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="668" viewBox="0 0 920 668" role="img" aria-label="Anatomy of a wigolo search result: explainable score decomposition, live engine telemetry, surfaced degradation, and self-flagged
assets/promo/ask-twice-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="400" viewBox="0 0 880 400" role="img" aria-label="Ask twice, pay never: the first query hits the live web in 3.6 seconds, the second answers from local cache in milliseconds, and t
assets/promo/ask-twice.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="400" viewBox="0 0 880 400" role="img" aria-label="Ask twice, pay never: the first query hits the live web in 3.6 seconds, the second answers from local cache in milliseconds, and t
assets/promo/fusion-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="520" viewBox="0 0 880 520" role="img" aria-label="18 search engines fused by reciprocal rank fusion, reranked by an on-device cross-encoder, producing one scored answer">
assets/promo/fusion.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="520" viewBox="0 0 880 520" role="img" aria-label="18 search engines fused by reciprocal rank fusion, reranked by an on-device cross-encoder, producing one scored answer">
assets/promo/ladder-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="440" viewBox="0 0 880 440" role="img" aria-label="wigolo's fetch escalation ladder: plain HTTP first, TLS-impersonation on anti-bot challenges, headless browser on SPA shells — dec
assets/promo/ladder.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="440" viewBox="0 0 880 440" role="img" aria-label="wigolo's fetch escalation ladder: plain HTTP first, TLS-impersonation on anti-bot challenges, headless browser on SPA shells — dec
assets/promo/meter-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="380" viewBox="0 0 880 380" role="img" aria-label="The meter: a metered cloud API's cost climbs with every query while wigolo stays at zero dollars, flat, forever. Illustrative pric
assets/promo/meter.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="380" viewBox="0 0 880 380" role="img" aria-label="The meter: a metered cloud API's cost climbs with every query while wigolo stays at zero dollars, flat, forever. Illustrative pric
assets/promo/stars-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="340" viewBox="0 0 880 340" role="img" aria-label="wigolo GitHub stars: 0 to 579 between July 1 and July 17 2026, with a sharp spike over the final 48 hours">
assets/promo/stars.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="340" viewBox="0 0 880 340" role="img" aria-label="wigolo GitHub stars: 0 to 579 between July 1 and July 17 2026, with a sharp spike over the final 48 hours">
assets/sponsors/testmu-ai-dark.svg
- Network accessline 1
<svg width="513" height="80" viewBox="0 0 513 80" fill="none" xmlns="http://www.w3.org/2000/svg">
assets/sponsors/testmu-ai.svg
- Network accessline 1
<svg width="513" height="80" viewBox="0 0 513 80" fill="none" xmlns="http://www.w3.org/2000/svg">
benchmarks/agent/evaluator.ts
- Executable scriptline 1
Executable file
benchmarks/agent/metrics.ts
- Executable scriptline 1
Executable file
benchmarks/agent/report.ts
- Executable scriptline 1
Executable file
benchmarks/agent/runner.ts
- Executable scriptline 1
Executable file
benchmarks/agent/task-executor.ts
- Executable scriptline 1
Executable file
benchmarks/agent/types.ts
- Executable scriptline 1
Executable file
benchmarks/embedding/runner.ts
- Executable scriptline 1
#!/usr/bin/env node
benchmarks/extraction/fixtures/golden/api-001.md
- Network accessline 8
https://api.bookshelf.example.com/v2 - Network accessline 95
[Credential-related source omitted] - Network accessline 96
"https://api.bookshelf.example.com/v2/books?genre=sci-fi&limit=2" - Network accessline 280
"bio": "American-Canadian speculative fiction writer and essayist.", "born": 1948, "website": "https://williamgibsonbooks.com", - Network accessline 281
"born": 1948, "website": "https://williamgibsonbooks.com", "book_count": 12, - Network accessline 282
"website": "https://williamgibsonbooks.com", - Network accessline 377
{ "url": "https://yourapp.example.com/hooks/bookshelf", - Network accessline 378
"url": "https://yourapp.example.com/hooks/bookshelf", - Network accessline 395
- [Authentication Guide](https://docs.bookshelf.example.com/auth) - Network accessline 396
- [Webhook Verification](https://docs.bookshelf.example.com/webhooks) - Network accessline 397
- [SDK Reference](https://docs.bookshelf.example.com/sdks) - Network accessline 398
- [Status Page](https://status.bookshelf.example.com)
benchmarks/extraction/fixtures/golden/article-001.md
- Network accessline 195
async get<T>(path: string): Promise<ApiResponse<T>> { const response = await fetch(`${this.baseUrl}${path}`); - Network accessline 196
const response = await fetch(`${this.baseUrl}${path}`); - Network accessline 203
pageSize: number = 20, ): Promise<PaginatedResponse<T>> { const response = await fetch( - Network accessline 204
): Promise<PaginatedResponse<T>> { const response = await fetch( `${this.baseUrl}${path}?page=${page}&pageSize=${pageSize}`, - Network accessline 205
const response = await fetch( - Network accessline 212
const client = new ApiClient("https://api.example.com"); - Network accessline 233
- [TypeScript Handbook: Generics](https://www.typescriptlang.org/docs/handbook/2/generics.html) - Network accessline 234
- [TypeScript Handbook: Conditional Types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html) - Network accessline 235
- [TypeScript Handbook: Mapped Types](https://www.typescriptlang.org/docs/handbook/2/mapped-types.html)
benchmarks/extraction/fixtures/golden/article-002.md
- Network accessline 210
- [PostgreSQL Index Documentation](https://www.postgresql.org/docs/current/indexes.html) - Network accessline 211
- [Use The Index, Luke](https://use-the-index-luke.com/) - Network accessline 212
- [MySQL Index Best Practices](https://dev.mysql.com/doc/refman/8.0/en/optimization-indexes.html)
benchmarks/extraction/fixtures/golden/article-003.md
- Network accessline 76
# From the 'api' container: curl http://web:80 # DNS resolves 'web' to its container IP - Network accessline 77
curl http://web:80 # DNS resolves 'web' to its container IP - Dangerous shell operationline 159
sudo iptables -t nat -L DOCKER -n -v - Dangerous shell operationline 162
sudo tcpdump -i docker0 -n port 80 - Network accessline 170
1. Are both containers on the same network? 2. Is DNS resolving correctly? (`nslookup`) 3. Is the target port open? (`nc -zv host port`) - Network accessline 171
2. Is DNS resolving correctly? (`nslookup`) 3. Is the target port open? (`nc -zv host port`) 4. Are iptables rules correct? (`iptables -L`) - Network accessline 172
3. Is the target port open? (`nc -zv host port`) - Network accessline 198
- [Docker Networking Overview](https://docs.docker.com/network/) - Network accessline 199
- [Linux Network Namespaces](https://man7.org/linux/man-pages/man7/network_namespaces.7.html) - Network accessline 200
- [Container Networking From Scratch (talk)](https://www.youtube.com/watch?v=6v_BDHIgOY8)
benchmarks/extraction/fixtures/golden/blog-001.md
- Network accessline 230
- [pg_stat_statements](https://www.postgresql.org/docs/16/pgstatstatements.html) for query profiling - Network accessline 231
- [PgBouncer](https://www.pgbouncer.org/) for connection pooling - Network accessline 232
- [pg_partman](https://github.com/pgpartman/pg_partman) for partition management - Network accessline 233
- [pg_cron](https://github.com/citusdata/pg_cron) for scheduled maintenance - Network accessline 234
- [EXPLAIN.dalibo.com](https://explain.dalibo.com/) for visualizing query plans - Network accessline 242
*Have questions? Find me on [Mastodon](https://mastodon.example.com/@anikapatel) or [send me an email](mailto:anika@example.com).*
benchmarks/extraction/fixtures/golden/changelog-001.md
- Network accessline 3
All notable changes to Vortex are documented here. This project follows [Semantic Versioning](https://semver.org/). - Network accessline 92
- Fixed memory leak when using `client.stream()` with large payloads. The internal buffer was not flushed after each event, causing memory to grow unbounded over long-lived connections. ([#1847](https://github.com/example/vortex/issues/1847 - Network accessline 93
- Fixed race condition in request deduplication where two requests with the same key but different headers could return incorrect cached results. ([#1852](https://github.com/example/vortex/issues/1852)) - Network accessline 94
- Fixed `Content-Type` header not being set correctly for `FormData` payloads on Node.js. The boundary string was missing from the header value. ([#1861](https://github.com/example/vortex/issues/1861)) - Network accessline 95
- Fixed crash when calling `client.close()` while requests were in-flight. Pending requests now resolve with an `AbortError` instead of crashing the process. ([#1870](https://github.com/example/vortex/issues/1870)) - Network accessline 104
For a detailed migration guide from v3 to v4, see [https://vortex.example.com/docs/migration/v4](https://vortex.example.com/docs/migration/v4). - Network accessline 112
- Fixed incorrect URL encoding for query parameters containing special characters (`+`, `&`, `=`). ([#1839](https://github.com/example/vortex/issues/1839)) - Network accessline 113
- Fixed TypeScript type for `headers` option not accepting `Headers` instances. ([#1841](https://github.com/example/vortex/issues/1841)) - Network accessline 114
- Fixed `keepAlive` option being ignored when set to `false`. ([#1843](https://github.com/example/vortex/issues/1843)) - Network accessline 122
- Fixed regression where `baseURL` with a trailing slash produced double slashes in the final URL. ([#1835](https://github.com/example/vortex/issues/1835)) - Fixed `AbortController` not being cleaned up after successful requests, causing a - Network accessline 123
- Fixed `AbortController` not being cleaned up after successful requests, causing a slow memory leak in long-running processes. ([#1836](https://github.com/example/vortex/issues/1836)) - Network accessline 153
- Fixed `onDownloadProgress` not being called for small responses that fit in a single chunk. ([#1828](https://github.com/example/vortex/issues/1828)) - Network accessline 154
- Fixed incorrect `Content-Length` calculation for string bodies containing multi-byte UTF-8 characters. ([#1830](https://github.com/example/vortex/issues/1830)) - Network accessline 165
const client = createClient({ proxy: "http://proxy.internal.example.com:8080", - Network accessline 166
proxy: "http://proxy.internal.example.com:8080", - Network accessline 188
- Fixed `client.patch()` sending the wrong `Content-Type` header when the body was a plain object. ([#1812](https://github.com/example/vortex/issues/1812)) - Network accessline 189
- Fixed redirect loop detection not accounting for URL fragments. ([#1815](https://github.com/example/vortex/issues/1815)) - Network accessline 243
- Fixed `timeout` option not applying to the TLS handshake phase. ([#1790](https://github.com/example/vortex/issues/1790)) - Network accessline 244
- Fixed incorrect `Content-Type` detection for `.mjs` file uploads. ([#1793](https://github.com/example/vortex/issues/1793)) - Network accessline 250
- [Documentation](https://vortex.example.com/docs) - Network accessline 251
- [GitHub Repository](https://github.com/example/vortex) - Network accessline 252
- [Issue Tracker](https://github.com/example/vortex/issues) - Network accessline 253
- [Migration Guides](https://vortex.example.com/docs/migration) - Network accessline 255
[4.0.0]: https://github.com/example/vortex/compare/v3.8.2...v4.0.0 - Network accessline 256
[3.8.2]: https://github.com/example/vortex/compare/v3.8.1...v3.8.2 - Network accessline 257
[3.8.1]: https://github.com/example/vortex/compare/v3.8.0...v3.8.1 - Network accessline 258
[3.8.0]: https://github.com/example/vortex/compare/v3.7.0...v3.8.0 - Network accessline 259
[3.7.0]: https://github.com/example/vortex/compare/v3.6.0...v3.7.0 - Network accessline 260
[3.6.0]: https://github.com/example/vortex/compare/v3.5.0...v3.6.0 - Network accessline 261
[3.5.0]: https://github.com/example/vortex/releases/tag/v3.5.0
benchmarks/extraction/fixtures/golden/code-001.md
benchmarks/extraction/fixtures/golden/docs-001.md
- Network accessline 1
# fetch() - Web API Reference - Network accessline 3
The `fetch()` method starts the process of fetching a resource from the network, returning a promise that is fulfilled once the response is available. - Network accessline 8
fetch(resource) - Network accessline 9
fetch(resource, options) - Network accessline 58
async function fetchData() { try { const response = await fetch("https://api.example.com/data"); - Network accessline 59
try { const response = await fetch("https://api.example.com/data"); if (!response.ok) { - Network accessline 60
const response = await fetch("https://api.example.com/data"); - Network accessline 75
async function postData(url, data) { const response = await fetch(url, { - Network accessline 76
const response = await fetch(url, { - Network accessline 87
const result = await postData("https://api.example.com/users", { - Network accessline 100
const response = await fetch("https://api.example.com/upload", { - Network accessline 117
try { const response = await fetch("https://api.example.com/slow", { signal }); - Network accessline 118
const response = await fetch("https://api.example.com/slow", { signal }); - Network accessline 133
async function fetchWithStatus(url) { const response = await fetch(url); - Network accessline 134
const response = await fetch(url); - Network accessline 154
async function streamResponse(url) { const response = await fetch(url); - Network accessline 155
const response = await fetch(url); - Network accessline 180
- [Fetch Standard](https://fetch.spec.whatwg.org/#fetch-method) - Network accessline 181
- [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/fetch) - Network accessline 185
- [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) - Network accessline 186
- [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) - [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) - [Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) - Network accessline 187
- [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) - Network accessline 188
- [Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
benchmarks/extraction/fixtures/golden/docs-002.md
- Network accessline 120
const results = await urls.reduce(async (accPromise, url) => { const acc = await accPromise; const response = await fetch(url); - Network accessline 121
const acc = await accPromise; const response = await fetch(url); const data = await response.json(); - Network accessline 122
const response = await fetch(url); - Network accessline 170
- [Array.prototype.reduceRight()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight) - Network accessline 171
- [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - Network accessline 172
- [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) - Network accessline 173
- [Array.prototype.forEach()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
benchmarks/extraction/fixtures/golden/docs-003.md
benchmarks/extraction/fixtures/golden/example-article.md
- Network accessline 24
[Official TypeScript docs](https://www.typescriptlang.org/docs/)
benchmarks/extraction/fixtures/golden/github-001.md
- Network accessline 5
[](https://github.com/valyala/fasthttp/actions) - Network accessline 6
[](https://goreportcard.com/report/github.com/valyala/fasthttp) - Network accessline 7
[](https://godoc.org/github.com/valyala/fasthttp) - Network accessline 18
- Built-in support for HTTP pipelining - Streaming request/response bodies - WebSocket support via [fasthttp/websocket](https://github.com/fasthttp/websocket) - Network accessline 19
- Streaming request/response bodies - WebSocket support via [fasthttp/websocket](https://github.com/fasthttp/websocket) - TLS support - Network accessline 20
- WebSocket support via [fasthttp/websocket](https://github.com/fasthttp/websocket) - Network accessline 76
func main() { status, body, err := fasthttp.Get(nil, "https://httpbin.org/get") - Network accessline 77
status, body, err := fasthttp.Get(nil, "https://httpbin.org/get") - Network accessline 184
- [Documentation](https://pkg.go.dev/github.com/valyala/fasthttp) - Network accessline 185
- [Examples](https://github.com/valyala/fasthttp/tree/master/examples) - Network accessline 186
- [FAQ](https://github.com/valyala/fasthttp/wiki/FAQ)
benchmarks/extraction/fixtures/golden/github-002.md
benchmarks/extraction/fixtures/golden/github-003.md
- Network accessline 5
[](https://www.npmjs.com/package/zod) - Network accessline 6
[](https://github.com/colinhacks/zod) - Network accessline 198
- [Documentation](https://zod.dev) - Network accessline 199
- [GitHub](https://github.com/colinhacks/zod) - Network accessline 200
- [npm](https://www.npmjs.com/package/zod) - Network accessline 201
- [Discord](https://discord.gg/zod)
benchmarks/extraction/fixtures/golden/reference-001.md
- Network accessline 290
| Specification | Status | |---|---| | [CSS Grid Layout Module Level 2 — grid-template-areas](https://drafts.csswg.org/css-grid/#propdef-grid-template-areas) | Working Draft | - Network accessline 291
|---|---| | [CSS Grid Layout Module Level 2 — grid-template-areas](https://drafts.csswg.org/css-grid/#propdef-grid-template-areas) | Working Draft | | [CSS Grid Layout Module Level 1 — grid-template-areas](https://www.w3.org/TR/css-grid-1/# - Network accessline 292
| [CSS Grid Layout Module Level 2 — grid-template-areas](https://drafts.csswg.org/css-grid/#propdef-grid-template-areas) | Working Draft | - Network accessline 293
| [CSS Grid Layout Module Level 1 — grid-template-areas](https://www.w3.org/TR/css-grid-1/#propdef-grid-template-areas) | W3C Recommendation | - Network accessline 297
- [`grid-template-columns`](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns) — defines column track sizes - Network accessline 298
- [`grid-template-rows`](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-rows) — defines row track sizes - Network accessline 299
- [`grid-template`](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template) — shorthand for rows, columns, and areas - Network accessline 300
- [`grid-area`](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-area) — places an item into a named area - Network accessline 301
- [CSS Grid Layout Guide](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout) — comprehensive grid reference - Network accessline 302
- [A Complete Guide to CSS Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) — visual guide with examples
benchmarks/extraction/fixtures/golden/so-001.md
- Network accessline 19
useEffect(() => { fetch('/api/users') - Network accessline 20
fetch('/api/users') - Network accessline 77
useEffect(() => { fetch('/api/users') - Network accessline 78
fetch('/api/users') - Network accessline 130
fetch(url) - Network accessline 183
useEffect(() => { fetch('/api/users') - Network accessline 184
fetch('/api/users') - Network accessline 207
- [How to fix "Cannot read property of undefined" in JavaScript?](https://stackoverflow.com/questions/14782232) - Network accessline 208
- [React useEffect hook and async data fetching](https://stackoverflow.com/questions/53332321) - Network accessline 209
- [Optional chaining (?.) in JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining)
benchmarks/extraction/fixtures/golden/so-002.md
- Network accessline 16
async function getUser(id) { const response = await fetch(`/api/users/${id}`); - Network accessline 17
const response = await fetch(`/api/users/${id}`); - Network accessline 22
async function getUserPosts(userId) { const response = await fetch(`/api/users/${userId}/posts`); - Network accessline 23
const response = await fetch(`/api/users/${userId}/posts`); - Network accessline 225
- [What is the difference between Promise.all and Promise.allSettled?](https://stackoverflow.com/questions/55664825) - Network accessline 226
- [How to retry failed async operations?](https://stackoverflow.com/questions/38213668) - Network accessline 227
- [Error handling in Express.js async routes](https://stackoverflow.com/questions/51391080)
benchmarks/extraction/fixtures/golden/table-001.md
- Network accessline 111
- [JS Framework Benchmark](https://krausest.github.io/js-framework-benchmark/) - Network accessline 112
- [State of JS 2023](https://stateofjs.com/) - Network accessline 113
- [npm trends](https://npmtrends.com/) - Network accessline 114
- [Web Framework Benchmarks (TechEmpower)](https://www.techempower.com/benchmarks/)
benchmarks/extraction/fixtures/golden/tutorial-001.md
- Network accessline 129
fetch(`https://api.example.com/search?q=${encodeURIComponent(debouncedQuery)}`, { - Network accessline 189
fetch(url, { ...options, signal: controller.signal }) - Network accessline 215
function UserProfile({ userId }: { userId: string }) { const { data: user, error, isLoading, refetch } = useFetch<User>( `https://api.example.com/users/${userId}`, - Network accessline 216
const { data: user, error, isLoading, refetch } = useFetch<User>( `https://api.example.com/users/${userId}`, ); - Network accessline 217
`https://api.example.com/users/${userId}`, - Network accessline 401
- [React Docs: Reusing Logic with Custom Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) - Network accessline 402
- [React Docs: Rules of Hooks](https://react.dev/reference/rules/rules-of-hooks) - Network accessline 403
- [TanStack Query](https://tanstack.com/query/latest) - Network accessline 404
- [usehooks.com](https://usehooks.com/) — collection of community hooks
benchmarks/extraction/fixtures/golden/wiki-001.md
- Network accessline 208
- [asm.js](https://en.wikipedia.org/wiki/Asm.js) - Network accessline 209
- [Emscripten](https://emscripten.org/) - Network accessline 210
- [WASI](https://wasi.dev/) - Network accessline 211
- [Bytecode Alliance](https://bytecodealliance.org/) - Network accessline 215
1. Haas, A., et al. "Bringing the Web up to Speed with WebAssembly." *ACM SIGPLAN Notices*, vol. 52, no. 6, 2017, pp. 185-200. 2. W3C. "WebAssembly Core Specification." W3C Recommendation, 5 December 2019. [https://www.w3.org/TR/wasm-core-1 - Network accessline 216
2. W3C. "WebAssembly Core Specification." W3C Recommendation, 5 December 2019. [https://www.w3.org/TR/wasm-core-1/](https://www.w3.org/TR/wasm-core-1/) - Network accessline 217
3. Clark, L. "A cartoon intro to WebAssembly." Mozilla Hacks, 2017. [https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/](https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/) - Network accessline 218
4. Bytecode Alliance. "WASI: The WebAssembly System Interface." [https://wasi.dev/](https://wasi.dev/) - Network accessline 219
5. Google. "WebAssembly Garbage Collection (WasmGC)." V8 Blog, 2023. [https://v8.dev/blog/wasm-gc](https://v8.dev/blog/wasm-gc)
benchmarks/extraction/fixtures/manifest.json
- Network accessline 5
{ "id": "example-article", "url": "https://example.com/blog/web-scraping", - Network accessline 6
"id": "example-article", "url": "https://example.com/blog/web-scraping", "category": "article", - Network accessline 7
"url": "https://example.com/blog/web-scraping", - Network accessline 14
{ "id": "article-001", "url": "https://example.com/blog/typescript-guide", - Network accessline 15
"id": "article-001", "url": "https://example.com/blog/typescript-guide", "category": "article", - Network accessline 16
"url": "https://example.com/blog/typescript-guide", - Network accessline 23
{ "id": "article-002", "url": "https://example.com/blog/async-patterns", - Network accessline 24
"id": "article-002", "url": "https://example.com/blog/async-patterns", "category": "article", - Network accessline 25
"url": "https://example.com/blog/async-patterns", - Network accessline 32
{ "id": "article-003", "url": "https://example.com/blog/rust-wasm", - Network accessline 33
"id": "article-003", "url": "https://example.com/blog/rust-wasm", "category": "article", - Network accessline 34
"url": "https://example.com/blog/rust-wasm", - Network accessline 41
{ "id": "docs-001", "url": "https://docs.example.com/api/reference", - Network accessline 42
"id": "docs-001", "url": "https://docs.example.com/api/reference", "category": "docs", - Network accessline 43
"url": "https://docs.example.com/api/reference", - Network accessline 50
{ "id": "docs-002", "url": "https://docs.example.com/sdk/getting-started", - Network accessline 51
"id": "docs-002", "url": "https://docs.example.com/sdk/getting-started", "category": "docs", - Network accessline 52
"url": "https://docs.example.com/sdk/getting-started", - Network accessline 59
{ "id": "docs-003", "url": "https://docs.example.com/cli/commands", - Network accessline 60
"id": "docs-003", "url": "https://docs.example.com/cli/commands", "category": "docs", - Network accessline 61
"url": "https://docs.example.com/cli/commands", - Network accessline 68
{ "id": "github-001", "url": "https://github.com/user/repo", - Network accessline 69
"id": "github-001", "url": "https://github.com/user/repo", "category": "github", - Network accessline 70
"url": "https://github.com/user/repo", - Network accessline 77
{ "id": "github-002", "url": "https://github.com/user/repo/issues/42", - Network accessline 78
"id": "github-002", "url": "https://github.com/user/repo/issues/42", "category": "github", - Network accessline 79
"url": "https://github.com/user/repo/issues/42", - Network accessline 86
{ "id": "github-003", "url": "https://github.com/user/repo/blob/main/README.md", - Network accessline 87
"id": "github-003", "url": "https://github.com/user/repo/blob/main/README.md", "category": "github", - Network accessline 88
"url": "https://github.com/user/repo/blob/main/README.md", - Network accessline 95
{ "id": "so-001", "url": "https://stackoverflow.com/questions/12345", - Network accessline 96
"id": "so-001", "url": "https://stackoverflow.com/questions/12345", "category": "stackoverflow", - Network accessline 97
"url": "https://stackoverflow.com/questions/12345", - Network accessline 104
{ "id": "so-002", "url": "https://stackoverflow.com/questions/67890", - Network accessline 105
"id": "so-002", "url": "https://stackoverflow.com/questions/67890", "category": "stackoverflow", - Network accessline 106
"url": "https://stackoverflow.com/questions/67890", - Network accessline 113
{ "id": "spa-001", "url": "https://spa-app.example.com/page", - Network accessline 114
"id": "spa-001", "url": "https://spa-app.example.com/page", "category": "spa", - Network accessline 115
"url": "https://spa-app.example.com/page", - Network accessline 121
{ "id": "table-001", "url": "https://example.com/data/comparison", - Network accessline 122
"id": "table-001", "url": "https://example.com/data/comparison", "category": "table-heavy", - Network accessline 123
"url": "https://example.com/data/comparison", - Network accessline 130
{ "id": "code-001", "url": "https://example.com/snippets/advanced", - Network accessline 131
"id": "code-001", "url": "https://example.com/snippets/advanced", "category": "code-heavy", - Network accessline 132
"url": "https://example.com/snippets/advanced", - Network accessline 139
{ "id": "api-001", "url": "https://api.example.com/docs/v2", - Network accessline 140
"id": "api-001", "url": "https://api.example.com/docs/v2", "category": "docs", - Network accessline 141
"url": "https://api.example.com/docs/v2", - Network accessline 148
{ "id": "blog-001", "url": "https://example.com/blog/postgres-optimization", - Network accessline 149
"id": "blog-001", "url": "https://example.com/blog/postgres-optimization", "category": "article", - Network accessline 150
"url": "https://example.com/blog/postgres-optimization", - Network accessline 157
{ "id": "wiki-001", "url": "https://en.wikipedia.org/wiki/WebAssembly", - Network accessline 158
"id": "wiki-001", "url": "https://en.wikipedia.org/wiki/WebAssembly", "category": "article", - Network accessline 159
"url": "https://en.wikipedia.org/wiki/WebAssembly", - Network accessline 166
{ "id": "tutorial-001", "url": "https://example.com/tutorials/react-hooks", - Network accessline 167
"id": "tutorial-001", "url": "https://example.com/tutorials/react-hooks", "category": "docs", - Network accessline 168
"url": "https://example.com/tutorials/react-hooks", - Network accessline 175
{ "id": "changelog-001", "url": "https://example.com/changelog", - Network accessline 176
"id": "changelog-001", "url": "https://example.com/changelog", "category": "article", - Network accessline 177
"url": "https://example.com/changelog", - Network accessline 184
{ "id": "reference-001", "url": "https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas", - Network accessline 185
"id": "reference-001", "url": "https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas", "category": "docs", - Network accessline 186
"url": "https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas",
benchmarks/extraction/metrics.ts
- Executable scriptline 1
Executable file
benchmarks/extraction/per-category.ts
- Executable scriptline 1
#!/usr/bin/env node
benchmarks/extraction/report.ts
- Executable scriptline 1
Executable file
benchmarks/extraction/runner.ts
- Executable scriptline 1
Executable file
benchmarks/extraction/tokenizer.ts
- Executable scriptline 1
Executable file
benchmarks/extraction/types.ts
- Executable scriptline 1
Executable file
benchmarks/perf/tool-latency.ts
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 113
const EXTRACT_INPUTS = SEARCH_QUERIES.map((_, i) => ({ html: EXTRACT_HTML, url: `https://example.test/perf/${i}`, - Network accessline 114
html: EXTRACT_HTML, url: `https://example.test/perf/${i}`, })); - Network accessline 115
url: `https://example.test/perf/${i}`,
benchmarks/search/fixtures/relevance.json
- Network accessline 2
"version": "1.0.0", "judgments": [ { "queryId": "docs-001", "url": "https://www.typescriptlang.org/docs/handbook/utility-types.html", "grade": 3 }, - Network accessline 3
"judgments": [ { "queryId": "docs-001", "url": "https://www.typescriptlang.org/docs/handbook/utility-types.html", "grade": 3 }, { "queryId": "docs-001", "url": "https://www.typescriptlang.org/docs/handbook/2/mapped-types.html", "gra - Network accessline 4
{ "queryId": "docs-001", "url": "https://www.typescriptlang.org/docs/handbook/utility-types.html", "grade": 3 }, - Network accessline 5
{ "queryId": "docs-001", "url": "https://www.typescriptlang.org/docs/handbook/2/mapped-types.html", "grade": 2 }, - Network accessline 6
{ "queryId": "docs-001", "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object", "grade": 0 }, - Network accessline 7
{ "queryId": "docs-002", "url": "https://playwright.dev/docs/api/class-page#page-goto", "grade": 3 }, - Network accessline 8
{ "queryId": "docs-002", "url": "https://playwright.dev/docs/navigations", "grade": 2 }, - Network accessline 9
{ "queryId": "error-001", "url": "https://stackoverflow.com/questions/14782232/how-to-avoid-cannot-read-properties-of-undefined", "grade": 3 }, - Network accessline 10
{ "queryId": "error-002", "url": "https://stackoverflow.com/questions/20259473/econnrefused", "grade": 3 }, - Network accessline 11
{ "queryId": "concept-001", "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop", "grade": 3 }, - Network accessline 12
{ "queryId": "concept-001", "url": "https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick", "grade": 2 }, - Network accessline 13
{ "queryId": "code-001", "url": "https://expressjs.com/en/guide/error-handling.html", "grade": 3 }, - Network accessline 14
{ "queryId": "multi-001", "url": "https://vitest.dev/api/vi.html", "grade": 3 }, - Network accessline 15
{ "queryId": "multi-001", "url": "https://vitest.dev/guide/mocking.html", "grade": 2 }, - Network accessline 17
{ "queryId": "tutorial-001", "url": "https://react.dev/reference/react/useEffect#specifying-reactive-dependencies", "grade": 3 }, - Network accessline 18
{ "queryId": "tutorial-001", "url": "https://react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development", "grade": 2 }, - Network accessline 19
{ "queryId": "tutorial-001", "url": "https://blog.logrocket.com/understanding-react-useeffect-cleanup-function/", "grade": 2 }, - Network accessline 21
{ "queryId": "tutorial-002", "url": "https://docs.python.org/3/library/asyncio-task.html#asyncio.gather", "grade": 3 }, - Network accessline 22
{ "queryId": "tutorial-002", "url": "https://docs.python.org/3/library/asyncio-task.html#asyncio.wait", "grade": 3 }, - Network accessline 23
{ "queryId": "tutorial-002", "url": "https://stackoverflow.com/questions/42231161/asyncio-gather-vs-asyncio-wait", "grade": 2 }, - Network accessline 25
{ "queryId": "api-001", "url": "https://docs.github.com/en/rest/pulls/pulls#create-a-pull-request", "grade": 3 }, - Network accessline 26
{ "queryId": "api-001", "url": "https://docs.github.com/en/rest/pulls", "grade": 2 }, - Network accessline 27
{ "queryId": "api-001", "url": "https://stackoverflow.com/questions/19614550/how-to-create-pull-request-using-github-api", "grade": 1 }, - Network accessline 29
{ "queryId": "api-002", "url": "https://stripe.com/docs/api/payment_intents/create", "grade": 3 }, - Network accessline 30
{ "queryId": "api-002", "url": "https://stripe.com/docs/payments/payment-intents", "grade": 2 }, - Network accessline 32
{ "queryId": "comparison-001", "url": "https://bun.sh/docs/benchmarks", "grade": 2 }, - Network accessline 33
{ "queryId": "comparison-001", "url": "https://medium.com/@bun-vs-node/bun-vs-node-js-performance-comparison-2024", "grade": 1 }, - Network accessline 34
{ "queryId": "comparison-001", "url": "https://www.phoronix.com/review/bun-nodejs-benchmarks", "grade": 2 }, - Network accessline 36
{ "queryId": "comparison-002", "url": "https://www.postgresql.org/docs/current/datatype-json.html", "grade": 3 }, - Network accessline 37
{ "queryId": "comparison-002", "url": "https://dev.mysql.com/doc/refman/8.0/en/json.html", "grade": 3 }, - Network accessline 38
{ "queryId": "comparison-002", "url": "https://www.percona.com/blog/postgresql-vs-mysql-json-support/", "grade": 2 }, - Network accessline 40
{ "queryId": "recent-001", "url": "https://deno.com/blog/v2.0", "grade": 3 }, - Network accessline 41
{ "queryId": "recent-001", "url": "https://docs.deno.com/runtime/manual/advanced/migrate_deprecations", "grade": 2 }, - Network accessline 43
{ "queryId": "recent-002", "url": "https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/", "grade": 3 }, - Network accessline 44
{ "queryId": "recent-002", "url": "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html", "grade": 3 }, - Network accessline 45
{ "queryId": "recent-002", "url": "https://www.totaltypescript.com/typescript-5-5", "grade": 1 }, - Network accessline 47
{ "queryId": "debug-001", "url": "https://nodejs.org/api/addons.html", "grade": 2 }, - Network accessline 48
{ "queryId": "debug-001", "url": "https://github.com/nicolo-ribaudo/tc39-proposal-nodejs-debugging/issues/1", "grade": 0 }, - Network accessline 49
{ "queryId": "debug-001", "url": "https://stackoverflow.com/questions/25400524/node-js-native-addon-segfault-debugging", "grade": 3 }, - Network accessline 51
{ "queryId": "debug-002", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS", "grade": 3 }, - Network accessline 52
{ "queryId": "debug-002", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSPreflightDidNotSucceed", "grade": 3 }, - Network accessline 53
{ "queryId": "debug-002", "url": "https://stackoverflow.com/questions/21783079/cors-preflight-request-failing", "grade": 2 }, - Network accessline 55
{ "queryId": "config-001", "url": "https://nginx.org/en/docs/http/websocket.html", "grade": 3 }, - Network accessline 56
{ "queryId": "config-001", "url": "https://www.nginx.com/blog/websocket-nginx/", "grade": 2 }, - Network accessline 58
{ "queryId": "config-002", "url": "https://docs.docker.com/compose/compose-file/05-services/#healthcheck", "grade": 3 }, - Network accessline 59
{ "queryId": "config-002", "url": "https://docs.docker.com/engine/reference/builder/#healthcheck", "grade": 2 }, - Network accessline 60
{ "queryId": "config-002", "url": "https://stackoverflow.com/questions/42567475/docker-compose-check-if-service-is-healthy", "grade": 1 }, - Network accessline 62
{ "queryId": "security-001", "url": "https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/", "grade": 3 }, - Network accessline 63
{ "queryId": "security-001", "url": "https://datatracker.ietf.org/doc/html/rfc6749#section-10.4", "grade": 2 }, - Network accessline 64
{ "queryId": "security-001", "url": "https://stackoverflow.com/questions/27726066/jwt-refresh-token-flow", "grade": 2 }, - Network accessline 66
{ "queryId": "multi-002", "url": "https://react.dev/reference/rsc/server-components", "grade": 3 }, - Network accessline 67
{ "queryId": "multi-002", "url": "https://nextjs.org/docs/app/building-your-application/rendering/server-components", "grade": 3 }, - Network accessline 68
{ "queryId": "multi-002", "url": "https://nextjs.org/docs/app/building-your-application/routing", "grade": 2 }
benchmarks/search/metrics.ts
- Executable scriptline 1
Executable file
benchmarks/search/mock-engine.ts
- Executable scriptline 1
Executable file
benchmarks/search/report.ts
- Executable scriptline 1
Executable file
benchmarks/search/rerank-quality.ts
- Executable scriptline 1
#!/usr/bin/env node
benchmarks/search/runner.ts
- Executable scriptline 1
Executable file
benchmarks/search/types.ts
- Executable scriptline 1
Executable file
docs/README.md
- Network accessline 14
| [Tools](./tools.md) | The 10 tools with parameters, response fields, and worked examples. | | [CLI](./cli.md) | Full command reference: management commands, one-shot tools, the interactive shell, and the `--json` contract. | | [REST API]( - Network accessline 15
| [CLI](./cli.md) | Full command reference: management commands, one-shot tools, the interactive shell, and the `--json` contract. | | [REST API](./rest-api.md) | `wigolo serve`, endpoints, the fail-closed auth model, resource limits, and a - Network accessline 16
| [REST API](./rest-api.md) | `wigolo serve`, endpoints, the fail-closed auth model, resource limits, and a live curl quickstart. | - Network accessline 27
- Bugs and feature requests: [GitHub issues](https://github.com/KnockOutEZ/wigolo/issues) - Network accessline 28
- Questions and ideas: [GitHub discussions](https://github.com/KnockOutEZ/wigolo/discussions)
docs/cli.md
- Access to secretsline 31
[Credential-related source omitted] - Dangerous shell operationline 157
wigolo watch add <url> --interval=SECONDS | watch list | watch rm <id> | watch run <id> - Network accessline 163
wigolo extract https://example.com/pricing --mode=schema --schema=@pricing-schema.json --json - Dangerous shell operationline 187
watch add <url> [--interval=SECONDS] | watch list | watch rm <id> - Network accessline 200
printf 'search "bun test runner"\nfetch https://bun.sh/docs/cli/test\n' \
docs/configuration.md
- Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Network accessline 100
export WIGOLO_RERANKER=remote export WIGOLO_RERANK_API_BASE=http://127.0.0.1:8082/v1 - Network accessline 101
export WIGOLO_RERANK_API_BASE=http://127.0.0.1:8082/v1 - Access to secretsline 103
[Credential-related source omitted] - Access to secretsline 115
[Credential-related source omitted] - Network accessline 116
[Credential-related source omitted] - Access to secretsline 116
[Credential-related source omitted] - Network accessline 117
| `WIGOLO_LLM_MODEL` | provider default | Override the model name. | | `WIGOLO_LLM_BASE_URL` | `http://localhost:11434` | Custom base URL for the `ollama` provider — point it at any keyless OpenAI-compatible server (Ollama, vLLM, LM Studio) - Network accessline 118
| `WIGOLO_LLM_BASE_URL` | `http://localhost:11434` | Custom base URL for the `ollama` provider — point it at any keyless OpenAI-compatible server (Ollama, vLLM, LM Studio). | | `OPENAI_BASE_URL` | OpenAI | With `WIGOLO_LLM_PROVIDER=openai`, - Network accessline 128
export WIGOLO_LLM_PROVIDER=openai export OPENAI_BASE_URL=https://api.example.com/v1 # the service's OpenAI-compatible endpoint - Network accessline 129
export OPENAI_BASE_URL=https://api.example.com/v1 # the service's OpenAI-compatible endpoint - Access to secretsline 130
[Credential-related source omitted]
docs/getting-started.md
docs/installation.md
- Network accessline 66
wigolo carries registry manifests at the repo root — `smithery.yaml`, `glama.json`, and `mcp.json` (a plain MCP server config you can copy) — and is listed on MCP directories including [Glama](https://glama.ai/mcp/servers/KnockOutEZ/wigolo) - Network accessline 121
For hosts that speak HTTP instead of stdio, run `wigolo serve` and use `http://127.0.0.1:3333/mcp` — see the [REST API](./rest-api.md). - Dangerous shell operationline 132
rm -rf ~/.wigolo
docs/plugins.md
- Network accessline 8
wigolo plugin add https://github.com/you/your-plugin # clone; prompts before trusting - Network accessline 50
{ title: `Example result for ${query}`, url: 'https://example.com/search-engine-example', - Network accessline 51
title: `Example result for ${query}`, url: 'https://example.com/search-engine-example', snippet: 'Minimal search engine plugin example.', - Network accessline 52
url: 'https://example.com/search-engine-example',
docs/privacy-security.md
docs/rest-api.md
- Network accessline 12
[wigolo serve] Daemon running at http://127.0.0.1:3333 [wigolo serve] Health check: curl http://127.0.0.1:3333/health - Network accessline 13
[wigolo serve] Health check: curl http://127.0.0.1:3333/health - Network accessline 14
[wigolo serve] REST API: http://127.0.0.1:3333/v1 (OpenAPI: http://127.0.0.1:3333/openapi.json) - Network accessline 15
[wigolo serve] Auth: open on loopback only [wigolo serve] MCP endpoint: http://127.0.0.1:3333/mcp (StreamableHTTP) [wigolo serve] SSE endpoint: http://127.0.0.1:3333/sse - Network accessline 16
[wigolo serve] MCP endpoint: http://127.0.0.1:3333/mcp (StreamableHTTP) - Network accessline 17
[wigolo serve] SSE endpoint: http://127.0.0.1:3333/sse - Network accessline 61
curl -s http://127.0.0.1:3477/health - Network accessline 71
curl -s -X POST http://127.0.0.1:3477/v1/search \ - Network accessline 77
{"results":[{"title":"...","url":"https://github.com/KnockOutEZ/wigolo", - Network accessline 88
[Credential-related source omitted] - Network accessline 89
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted]
docs/sdks.md
- Network accessline 23
// baseUrl defaults to http://127.0.0.1:3333 (or WIGOLO_BASE_URL); - Network accessline 37
const { client, owned, close } = await createLocalClient(); try { const page = await client.fetch({ url: 'https://example.com' }); - Network accessline 38
try { const page = await client.fetch({ url: 'https://example.com' }); } finally { - Network accessline 39
const page = await client.fetch({ url: 'https://example.com' }); - Network accessline 56
with Client(base_url="http://127.0.0.1:3333") as client: res = client.search(query="local first web search", max_results=5) page = client.fetch(url="https://example.com") - Network accessline 58
page = client.fetch(url="https://example.com") - Access to secretsline 70
[Credential-related source omitted] - Network accessline 122
async with WigoloMcpClient() as client: reader = WigoloWebReader(client=client) docs = await reader.aload_data(urls=["https://react.dev/learn"]) - Network accessline 123
reader = WigoloWebReader(client=client) docs = await reader.aload_data(urls=["https://react.dev/learn"]) index = VectorStoreIndex.from_documents(docs) - Network accessline 124
docs = await reader.aload_data(urls=["https://react.dev/learn"])
docs/self-hosting.md
docs/tools.md
- Network accessline 68
{ "url": "https://nextjs.org/docs/app/building-your-application/caching", - Network accessline 89
{ "url": "https://docs.astro.build", "strategy": "sitemap", - Network accessline 128
{ "url": "https://www.postgresql.org/support/versioning/", "mode": "tables" } - Network accessline 147
{ "url": "https://12factor.net/config", "max_results": 8 } - Network accessline 202
{ "old": { "url": "https://nodejs.org/en/about/previous-releases" }, - Network accessline 203
"new": { "url": "https://nodejs.org/en/about/previous-releases" }, - Network accessline 221
{ "action": "create", "url": "https://go.dev/doc/devel/release",
docs/troubleshooting.md
- Dangerous shell operationline 15
| Browser engine won't launch on Linux | `wigolo warmup --browser` installs the OS system libraries the browser engine needs (escalating with sudo where required); when it can't, the error prints the exact install command to run yourself, t - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Network accessline 36
| If this failed… | What you lose | What still works | | --- | --- | --- | | Browser engine | JS-rendered pages fall back to plain HTTP fetch (some single-page-app content may be missing) | search, HTTP fetch, crawl, extract, cache, models - Network accessline 37
| --- | --- | --- | | Browser engine | JS-rendered pages fall back to plain HTTP fetch (some single-page-app content may be missing) | search, HTTP fetch, crawl, extract, cache, models | | Embeddings model | semantic discovery — `find_simil - Network accessline 38
| Browser engine | JS-rendered pages fall back to plain HTTP fetch (some single-page-app content may be missing) | search, HTTP fetch, crawl, extract, cache, models | - Access to secretsline 52
[Credential-related source omitted] - Dangerous shell operationline 107
**Linux (minimal images / containers).** The browser engine needs a handful of OS libraries; `wigolo warmup --browser` installs them (with sudo where available) and otherwise prints the exact command to run. **Python is _not_ required** — i - Access to secretsline 116
[Credential-related source omitted]
examples/n8n-remote-mcp/README.md
- Network accessline 3
> **Config reference.** Nothing to run here — this page shows how to point a > self-hosted [n8n](https://n8n.io) (or *any* remote MCP or REST client) at a - Network accessline 4
> self-hosted [n8n](https://n8n.io) (or *any* remote MCP or REST client) at a - Network accessline 10
| Surface | URL | Speaks | |---|---|---| | MCP (streamable HTTP) | `http://HOST:3477/mcp` | MCP clients: n8n MCP Client node, agent frameworks | - Network accessline 11
|---|---|---| | MCP (streamable HTTP) | `http://HOST:3477/mcp` | MCP clients: n8n MCP Client node, agent frameworks | | MCP (legacy SSE) | `http://HOST:3477/sse` (+ `/messages`) | older MCP clients | - Network accessline 12
| MCP (streamable HTTP) | `http://HOST:3477/mcp` | MCP clients: n8n MCP Client node, agent frameworks | - Network accessline 13
| MCP (legacy SSE) | `http://HOST:3477/sse` (+ `/messages`) | older MCP clients | - Network accessline 14
| REST | `http://HOST:3477/v1/{tool}` | anything that can POST JSON | - Network accessline 31
Running n8n in docker on the same machine? `--host 0.0.0.0` plus `http://host.docker.internal:3477` from inside the container is the usual pair. - Network accessline 32
`http://host.docker.internal:3477` from inside the container is the usual pair. - Network accessline 38
- Endpoint: `http://YOUR-WIGOLO-HOST:3477/mcp` - Network accessline 51
> > 1. **Bind the address clients will use.** `--host 192.168.1.20` and point > n8n at `http://192.168.1.20:3477/mcp` — Host matches, done. (A `0.0.0.0` - Network accessline 52
> 1. **Bind the address clients will use.** `--host 192.168.1.20` and point > n8n at `http://192.168.1.20:3477/mcp` — Host matches, done. (A `0.0.0.0` > bind does *not* whitelist your LAN IP.) - Network accessline 53
> n8n at `http://192.168.1.20:3477/mcp` — Host matches, done. (A `0.0.0.0` - Network accessline 70
Everything the workflow does is one curl — this is what "any remote client" - Network accessline 74
curl -s -X POST http://YOUR-WIGOLO-HOST:3477/v1/search \ - Network accessline 84
curl -s -X POST http://YOUR-WIGOLO-HOST:3477/mcp \
examples/n8n-remote-mcp/workflow.json
examples/one-shot-cli/README.md
- Network accessline 12
npx wigolo search "css grid layout guide" --max-results 5 npx wigolo fetch https://developer.mozilla.org/en-US/docs/Web/API/structuredClone - Network accessline 13
npx wigolo fetch https://developer.mozilla.org/en-US/docs/Web/API/structuredClone - Network accessline 50
Fetch: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone
examples/one-shot-cli/demo.tape
- Network accessline 35
Type `wigolo fetch https://developer.mozilla.org/en-US/docs/Web/API/structuredClone 2>/dev/null`
examples/one-shot-cli/run.sh
examples/plugin-search-engine/index.mjs
- Executable scriptline 1
Executable file - Network accessline 5
{ title: `Example result for ${query}`, url: 'https://example.com/search-engine-example', - Network accessline 6
title: `Example result for ${query}`, url: 'https://example.com/search-engine-example', snippet: 'Minimal search engine plugin example.', - Network accessline 7
url: 'https://example.com/search-engine-example',
examples/plugin-search-engine/package.json
- Executable scriptline 1
Executable file
examples/rest-curl/README.md
- Network accessline 22
$ curl -s http://127.0.0.1:3477/health | jq . - Network accessline 31
$ curl -s http://127.0.0.1:3477/v1/tools | jq -r 'map(.name) | join(" ")' - Network accessline 34
$ curl -s -X POST http://127.0.0.1:3477/v1/search \ - Network accessline 39
"results": [ { "title": "Documentation - TypeScript 4.9", "url": "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html" }, - Network accessline 40
{ "title": "Documentation - TypeScript 4.9", "url": "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html" }, { "title": "Mastering the `satisfies` Operator in TypeScript", - Network accessline 41
"url": "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html" }, - Network accessline 42
{ "title": "Mastering the `satisfies` Operator in TypeScript", "url": "https://www.xjavascript.com/blog/satisfies-typescript/" }, { "title": "The satisfies Operator - Learning TypeScript", - Network accessline 43
"url": "https://www.xjavascript.com/blog/satisfies-typescript/" }, - Network accessline 44
{ "title": "The satisfies Operator - Learning TypeScript", "url": "https://www.learningtypescript.com/articles/the-satisfies-operator" } ], - Network accessline 45
"url": "https://www.learningtypescript.com/articles/the-satisfies-operator" } - Network accessline 50
$ curl -s http://127.0.0.1:3477/openapi.json | jq '.info.version' - Network accessline 64
$ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3477/v1/tools - Network accessline 65
[Credential-related source omitted] - Network accessline 66
$ curl -s -o /dev/null -w '%{http_code}\n' \ - Network accessline 67
[Credential-related source omitted]
examples/rest-curl/demo.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 12
WIGOLO="${WIGOLO:-npx wigolo}" PORT="${PORT:-3477}" BASE="http://127.0.0.1:${PORT}" - Network accessline 14
BASE="http://127.0.0.1:${PORT}" - Network accessline 18
[Credential-related source omitted] - Network accessline 19
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Network accessline 20
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Network accessline 21
else curl -s "$@" fi - Network accessline 22
curl -s "$@" - Network accessline 31
for _ in $(seq 1 60); do curl -sf "${BASE}/health" >/dev/null 2>&1 && break - Network accessline 32
curl -sf "${BASE}/health" >/dev/null 2>&1 && break - Network accessline 36
echo echo "== GET /health (never needs a token) ==" curl -s "${BASE}/health" | jq . - Network accessline 38
curl -s "${BASE}/health" | jq . - Network accessline 40
echo echo "== GET /v1/tools — discover the tool surface ==" wcurl "${BASE}/v1/tools" | jq -r 'map(.name) | join(" ")' - Network accessline 42
wcurl "${BASE}/v1/tools" | jq -r 'map(.name) | join(" ")' - Network accessline 44
echo echo "== POST /v1/search ==" wcurl -X POST "${BASE}/v1/search" \ - Network accessline 45
echo "== POST /v1/search ==" wcurl -X POST "${BASE}/v1/search" \ -H 'Content-Type: application/json' \ - Network accessline 46
wcurl -X POST "${BASE}/v1/search" \ - Network accessline 51
echo echo "== GET /openapi.json — the whole API, machine-readable ==" wcurl "${BASE}/openapi.json" | jq '.info' - Network accessline 53
wcurl "${BASE}/openapi.json" | jq '.info' - Access to secretsline 55
[Credential-related source omitted] - Network accessline 56
echo echo "== token mode: the same call WITHOUT the header is refused ==" curl -s -o /dev/null -w 'GET /v1/tools without token -> HTTP %{http_code}\n' "${BASE}/v1/tools" - Network accessline 57
echo "== token mode: the same call WITHOUT the header is refused ==" curl -s -o /dev/null -w 'GET /v1/tools without token -> HTTP %{http_code}\n' "${BASE}/v1/tools" fi - Network accessline 58
curl -s -o /dev/null -w 'GET /v1/tools without token -> HTTP %{http_code}\n' "${BASE}/v1/tools"
examples/sdk-python-agent/README.md
- Network accessline 3
The [`wigolo` PyPI package](https://pypi.org/project/wigolo/) is a thin, - Network accessline 31
### [1] SQLite Home Page **URL:** https://sqlite.org/ - Network accessline 32
**URL:** https://sqlite.org/ - Network accessline 36
[Version 3.53.3](https://sqlite.org/releaselog/3_53_3.html) (2026-06-26). ... - Network accessline 38
sources: - https://sqlite.org/ - Network accessline 39
- https://sqlite.org/ - Network accessline 40
- https://sqlite.org/releaselog/current.html - Network accessline 55
}, }, urls=["https://sqlite.org/"], # optional seed; the agent also plans its own searches - Network accessline 56
}, urls=["https://sqlite.org/"], # optional seed; the agent also plans its own searches max_pages=3, - Network accessline 57
urls=["https://sqlite.org/"], # optional seed; the agent also plans its own searches - Network accessline 78
with local_client() as client: client.search(query="css container queries", max_results=5) client.fetch(url="https://example.com") - Network accessline 79
client.search(query="css container queries", max_results=5) client.fetch(url="https://example.com") client.research(question="...", depth="quick") - Network accessline 80
client.fetch(url="https://example.com") - Network accessline 84
Full client docs: the [wigolo PyPI page](https://pypi.org/project/wigolo/).
examples/sdk-python-agent/gather.py
- Executable scriptline 1
Executable file - Network accessline 33
prompt="What is the latest SQLite release version and release date?", schema=SCHEMA, urls=["https://sqlite.org/"], # optional seed; the agent also plans its own searches - Network accessline 34
schema=SCHEMA, urls=["https://sqlite.org/"], # optional seed; the agent also plans its own searches max_pages=3, - Network accessline 35
urls=["https://sqlite.org/"], # optional seed; the agent also plans its own searches
examples/sdk-typescript-research/README.md
- Network accessline 3
[`wigolo-sdk`](https://www.npmjs.com/package/wigolo-sdk) is a thin, zero-dependency - Network accessline 31
proxy between our web application and the network. It can intercept http requests and serve the responses from the network or from a local cache, ... source: https://dev.to/paco_ita/service-workers-and-caching-strategies-explained-step- - Network accessline 33
source: https://dev.to/paco_ita/service-workers-and-caching-strategies-explained-step-3-m4f - Network accessline 36
* Service Worker Caching doesn't need to be consistent with HTTP Caching expiry. * HTTP Caching still plays an important role in the cache layers, ... source: https://dev.to/jonchen/service-worker-caching-and-http-caching-p82 - Network accessline 38
source: https://dev.to/jonchen/service-worker-caching-and-http-caching-p82 - Network accessline 40
- Service workers are a powerful browser API that sits between your web application and the network, acting as a programmable network proxy. ... source: https://jsguides.dev/tutorials/browser-apis/browser-service-workers/ - Network accessline 42
source: https://jsguides.dev/tutorials/browser-apis/browser-service-workers/ - Network accessline 68
Full client docs: the [wigolo-sdk README](https://www.npmjs.com/package/wigolo-sdk).
examples/sdk-typescript-research/package-lock.json
- Network accessline 12
"node_modules/wigolo-sdk": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/wigolo-sdk/-/wigolo-sdk-0.2.0.tgz", - Network accessline 13
"version": "0.2.0", "resolved": "https://registry.npmjs.org/wigolo-sdk/-/wigolo-sdk-0.2.0.tgz", "integrity": "sha512-xoDxye63eF5bHJDgactncFw7As5oGsgPE5/LhvEDnJAOTgXMYPgi1SIiEIubk+4fvXIRwjWDJcRg8ifxb7L0WA==", - Network accessline 14
"resolved": "https://registry.npmjs.org/wigolo-sdk/-/wigolo-sdk-0.2.0.tgz",
examples/sdk-typescript-research/package.json
- Executable scriptline 1
Executable file
examples/sdk-typescript-research/research.mjs
- Executable scriptline 1
Executable file
examples/shell-ndjson-pipeline/README.md
- Network accessline 28
search "css container queries" --limit 3 --no-content EOF 0.99 https://web.dev/articles/declarative-shadow-dom - Network accessline 29
EOF 0.99 https://web.dev/articles/declarative-shadow-dom 0.75 https://jsguides.dev/guides/javascript-shadow-dom/ - Network accessline 30
0.99 https://web.dev/articles/declarative-shadow-dom - Network accessline 31
0.75 https://jsguides.dev/guides/javascript-shadow-dom/ - Network accessline 32
0.75 https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM - Network accessline 33
0.98 https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Containment/Container_queries - Network accessline 34
0.92 https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Containment/Container_size_and_style_queries - Network accessline 35
0.78 https://www.geeksforgeeks.org/css/css-container-queries/ - Network accessline 51
$ printf 'fetch https://no-such-host.invalid\n' | npx wigolo shell --json | jq -c '{url, error}' - Network accessline 52
{"url":"https://no-such-host.invalid","error":"DNS resolution failed (ENOTFOUND)"}
examples/shell-ndjson-pipeline/demo.tape
- Network accessline 33
Type `printf 'fetch https://no-such-host.invalid\n' | wigolo shell --json 2>/dev/null | jq -c '{url, error}'; echo "exit=$?"`
examples/shell-ndjson-pipeline/pipeline.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 23
$WIGOLO shell --json 2>/dev/null <<'EOF' \ | jq -c 'if .markdown then {title, chars: (.markdown | length), cached} elif .stats then .stats else . end' fetch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ - Network accessline 24
| jq -c 'if .markdown then {title, chars: (.markdown | length), cached} elif .stats then .stats else . end' fetch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl cache stats - Network accessline 25
fetch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl - Network accessline 30
echo "== 3. exit code: any failed command fails the whole pipe ==" set +e printf 'fetch https://no-such-host.invalid\n' | $WIGOLO shell --json 2>/dev/null | jq -c '{url, error}' - Network accessline 31
set +e printf 'fetch https://no-such-host.invalid\n' | $WIGOLO shell --json 2>/dev/null | jq -c '{url, error}' code=$? - Network accessline 32
printf 'fetch https://no-such-host.invalid\n' | $WIGOLO shell --json 2>/dev/null | jq -c '{url, error}'
examples/vercel-ai-sdk-tools/README.md
examples/vercel-ai-sdk-tools/package-lock.json
- Network accessline 18
"node_modules/@ai-sdk/provider": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - Network accessline 19
"version": "1.1.3", "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", - Network accessline 20
"resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", - Network accessline 30
"node_modules/@ai-sdk/provider-utils": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - Network accessline 31
"version": "2.2.8", "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", - Network accessline 32
"resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", - Network accessline 47
"node_modules/@ai-sdk/react": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", - Network accessline 48
"version": "1.2.12", "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", - Network accessline 49
"resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", - Network accessline 71
"node_modules/@ai-sdk/ui-utils": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", - Network accessline 72
"version": "1.2.11", "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", - Network accessline 73
"resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", - Network accessline 88
"node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - Network accessline 89
"version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - Network accessline 90
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - Network accessline 97
"node_modules/@types/diff-match-patch": { "version": "1.0.36", "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", - Network accessline 98
"version": "1.0.36", "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==", - Network accessline 99
"resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", - Network accessline 103
"node_modules/@types/node": { "version": "22.20.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - Network accessline 104
"version": "22.20.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", - Network accessline 105
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - Network accessline 113
"node_modules/ai": { "version": "4.3.19", "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", - Network accessline 114
"version": "4.3.19", "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", "integrity": "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==", - Network accessline 115
"resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", - Network accessline 139
"node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - Network accessline 140
"version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - Network accessline 141
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - Network accessline 146
}, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 147
"funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } - Network accessline 148
"url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 151
"node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - Network accessline 152
"version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - Network accessline 153
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - Network accessline 160
"node_modules/diff-match-patch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - Network accessline 161
"version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - Network accessline 162
"resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - Network accessline 166
"node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - Network accessline 167
"version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - Network accessline 168
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - Network accessline 172
"node_modules/jsondiffpatch": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", - Network accessline 173
"version": "0.6.0", "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", - Network accessline 174
"resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", - Network accessline 189
"node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - Network accessline 190
"version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", - Network accessline 191
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - Network accessline 194
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 195
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 196
"url": "https://github.com/sponsors/ai" - Network accessline 207
"node_modules/react": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - Network accessline 208
"version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - Network accessline 209
"resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - Network accessline 217
"node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - Network accessline 218
"version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", - Network accessline 219
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - Network accessline 223
"node_modules/swr": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.2.tgz", - Network accessline 224
"version": "2.4.2", "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.2.tgz", "integrity": "sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw==", - Network accessline 225
"resolved": "https://registry.npmjs.org/swr/-/swr-2.4.2.tgz", - Network accessline 236
"node_modules/throttleit": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - Network accessline 237
"version": "2.1.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", - Network accessline 238
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - Network accessline 243
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 244
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 245
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 248
"node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 249
"version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - Network accessline 250
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 262
"node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - Network accessline 263
"version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - Network accessline 264
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - Network accessline 269
"node_modules/use-sync-external-store": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - Network accessline 270
"version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9 - Network accessline 271
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - Network accessline 278
"node_modules/wigolo-vercel-ai-sdk": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/wigolo-vercel-ai-sdk/-/wigolo-vercel-ai-sdk-0.2.0.tgz", - Network accessline 279
"version": "0.2.0", "resolved": "https://registry.npmjs.org/wigolo-vercel-ai-sdk/-/wigolo-vercel-ai-sdk-0.2.0.tgz", "integrity": "sha512-+d+7d68j8vkZKUrIEWxQJijPoXZQU3YjYtE8FckclR8Jh3mavccw+ldr7oiC4EKbyTfTx9tZn/UaT/qXkkdGww==", - Network accessline 280
"resolved": "https://registry.npmjs.org/wigolo-vercel-ai-sdk/-/wigolo-vercel-ai-sdk-0.2.0.tgz", - Network accessline 291
"node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - Network accessline 292
"version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - Network accessline 293
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - Network accessline 295
"license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" - Network accessline 296
"funding": { "url": "https://github.com/sponsors/colinhacks" } - Network accessline 297
"url": "https://github.com/sponsors/colinhacks" - Network accessline 300
"node_modules/zod-to-json-schema": { "version": "3.25.2", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - Network accessline 301
"version": "3.25.2", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", - Network accessline 302
"resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
examples/vercel-ai-sdk-tools/package.json
- Executable scriptline 1
Executable file
examples/vercel-ai-sdk-tools/tools.ts
- Executable scriptline 1
Executable file
examples/watch-changelog-webhook/README.md
- Network accessline 10
./watch.sh # watches https://nodejs.org/en/blog - Network accessline 11
URL=https://your-site/changelog ./watch.sh # or any changelog you care about - Network accessline 19
== 1. register a watch on https://nodejs.org/en/blog == - Network accessline 22
== 2. list registered jobs == 74bec5cfdc2c… active every 3600s https://nodejs.org/en/blog - Network accessline 23
74bec5cfdc2c… active every 3600s https://nodejs.org/en/blog - Network accessline 25
== 3. on-demand check (first check records the baseline) == { "url": "https://nodejs.org/en/blog", - Network accessline 26
{ "url": "https://nodejs.org/en/blog", "changed": false, - Network accessline 27
"url": "https://nodejs.org/en/blog", - Network accessline 66
npx wigolo watch add https://nodejs.org/en/blog --interval 3600 \ - Network accessline 67
--notify https://hooks.example.com/wigolo - Network accessline 71
{ "job_id": "74bec5cf…", "url": "https://nodejs.org/en/blog",
examples/watch-changelog-webhook/watch.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 5
# ./watch.sh # uses `npx wigolo` # WIGOLO="wigolo" ./watch.sh # or any wigolo entry point # URL=https://your-site/changelog ./watch.sh - Network accessline 6
# WIGOLO="wigolo" ./watch.sh # or any wigolo entry point # URL=https://your-site/changelog ./watch.sh # - Network accessline 7
# URL=https://your-site/changelog ./watch.sh - Network accessline 12
WIGOLO="${WIGOLO:-npx wigolo}" URL="${URL:-https://nodejs.org/en/blog}" - Network accessline 13
URL="${URL:-https://nodejs.org/en/blog}" - Network accessline 15
echo "== 1. register a watch on ${URL} ==" - Network accessline 16
JOB=$($WIGOLO watch add "$URL" --interval 3600 --json 2>/dev/null | jq -r '.job.id') - Network accessline 18
# Webhook variant: deliver every change report as a POST to your endpoint. # $WIGOLO watch add "$URL" --interval 3600 --notify https://hooks.example.com/wigolo - Network accessline 19
# $WIGOLO watch add "$URL" --interval 3600 --notify https://hooks.example.com/wigolo - Dangerous shell operationline 47
$WIGOLO watch rm "$JOB" --json 2>/dev/null | jq -c '{removed_jobs: (.jobs | length)}'
glama.json
llms.txt
mcpb/manifest.json
- Network accessline 10
"repository": { "type": "git", "url": "https://github.com/KnockOutEZ/wigolo" - Network accessline 11
"type": "git", "url": "https://github.com/KnockOutEZ/wigolo" }, - Network accessline 12
"url": "https://github.com/KnockOutEZ/wigolo" - Network accessline 13
}, "homepage": "https://wigolo.app", "license": "AGPL-3.0-only", - Network accessline 14
"homepage": "https://wigolo.app",
mcpb/server/index.cjs
- Executable scriptline 1
#!/usr/bin/env node
package-lock.json
- Network accessline 72
"node_modules/@alcalzone/ansi-tokenize": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", - Network accessline 73
"version": "0.1.3", "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", - Network accessline 74
"resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", - Network accessline 85
"node_modules/@anthropic-ai/sdk": { "version": "0.91.1", "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", - Network accessline 86
"version": "0.91.1", "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", "integrity": "sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==", - Network accessline 87
"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz", - Network accessline 105
"node_modules/@anush008/tokenizers": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers/-/tokenizers-0.0.0.tgz", - Network accessline 106
"version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers/-/tokenizers-0.0.0.tgz", "integrity": "sha512-IQD9wkVReKAhsEAbDjh/0KrBGTEXelqZLpOBRDaIRvlzZ9sjmUP+gKbpvzyJnei2JHQiE8JAgj7YcNloINbGBw==", - Network accessline 107
"resolved": "https://registry.npmjs.org/@anush008/tokenizers/-/tokenizers-0.0.0.tgz", - Network accessline 119
"node_modules/@anush008/tokenizers-darwin-universal": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-darwin-universal/-/tokenizers-darwin-universal-0.0.0.tgz", - Network accessline 120
"version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-darwin-universal/-/tokenizers-darwin-universal-0.0.0.tgz", "integrity": "sha512-SACpWEooTjFX89dFKRVUhivMxxcZRtA3nJGVepdLyrwTkQ1TZQ8581B5JoXp0TcTMHf - Network accessline 121
"resolved": "https://registry.npmjs.org/@anush008/tokenizers-darwin-universal/-/tokenizers-darwin-universal-0.0.0.tgz", - Network accessline 132
"node_modules/@anush008/tokenizers-linux-arm64-gnu": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-linux-arm64-gnu/-/tokenizers-linux-arm64-gnu-0.5.0.tgz", - Network accessline 133
"version": "0.5.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-linux-arm64-gnu/-/tokenizers-linux-arm64-gnu-0.5.0.tgz", "integrity": "sha512-RrlHyBCY+Vo4lPeYtU1HwkIQ8mAEbYn0EAIAPrLY3c6a6WSj2UOVG64uYBQs2yiOpDsUP - Network accessline 134
"resolved": "https://registry.npmjs.org/@anush008/tokenizers-linux-arm64-gnu/-/tokenizers-linux-arm64-gnu-0.5.0.tgz", - Network accessline 148
"node_modules/@anush008/tokenizers-linux-x64-gnu": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-linux-x64-gnu/-/tokenizers-linux-x64-gnu-0.0.0.tgz", - Network accessline 149
"version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-linux-x64-gnu/-/tokenizers-linux-x64-gnu-0.0.0.tgz", "integrity": "sha512-TLjByOPWUEq51L3EJkS+slyH57HKJ7lAz/aBtEt7TIPq4QsE2owOPGovByOLIq1x5Wgh9b+a4 - Network accessline 150
"resolved": "https://registry.npmjs.org/@anush008/tokenizers-linux-x64-gnu/-/tokenizers-linux-x64-gnu-0.0.0.tgz", - Network accessline 164
"node_modules/@anush008/tokenizers-win32-x64-msvc": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-win32-x64-msvc/-/tokenizers-win32-x64-msvc-0.0.0.tgz", - Network accessline 165
"version": "0.0.0", "resolved": "https://registry.npmjs.org/@anush008/tokenizers-win32-x64-msvc/-/tokenizers-win32-x64-msvc-0.0.0.tgz", "integrity": "sha512-/5kP0G96+Cr6947F0ZetXnmL31YCaN15dbNbh2NHg7TXXRwfqk95+JtPP5Q7v4jbR2xxAmu - Network accessline 166
"resolved": "https://registry.npmjs.org/@anush008/tokenizers-win32-x64-msvc/-/tokenizers-win32-x64-msvc-0.0.0.tgz", - Network accessline 180
"node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - Network accessline 181
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - Network accessline 182
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - Network accessline 195
"node_modules/@babel/generator": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - Network accessline 196
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - Network accessline 197
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - Network accessline 212
"node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - Network accessline 213
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - Network accessline 214
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - Network accessline 222
"node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - Network accessline 223
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErI - Network accessline 224
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - Network accessline 232
"node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - Network accessline 233
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+s - Network accessline 234
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - Network accessline 242
"node_modules/@babel/parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - Network accessline 243
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - Network accessline 244
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - Network accessline 258
"node_modules/@babel/runtime": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - Network accessline 259
"version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", - Network accessline 260
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - Network accessline 267
"node_modules/@babel/template": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - Network accessline 268
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - Network accessline 269
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - Network accessline 282
"node_modules/@babel/traverse": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - Network accessline 283
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - Network accessline 284
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - Network accessline 301
"node_modules/@babel/types": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - Network accessline 302
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - Network accessline 303
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - Network accessline 315
"node_modules/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - Network accessline 316
"version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - Network accessline 317
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - Network accessline 327
"node_modules/@emnapi/runtime": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - Network accessline 328
"version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - Network accessline 329
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - Network accessline 337
"node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - Network accessline 338
"version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - Network accessline 339
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - Network accessline 348
"node_modules/@esbuild/aix-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - Network accessline 349
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", - Network accessline 350
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - Network accessline 365
"node_modules/@esbuild/android-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - Network accessline 366
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", - Network accessline 367
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - Network accessline 382
"node_modules/@esbuild/android-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - Network accessline 383
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", - Network accessline 384
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - Network accessline 399
"node_modules/@esbuild/android-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - Network accessline 400
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", - Network accessline 401
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - Network accessline 416
"node_modules/@esbuild/darwin-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - Network accessline 417
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", - Network accessline 418
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - Network accessline 433
"node_modules/@esbuild/darwin-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - Network accessline 434
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", - Network accessline 435
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - Network accessline 450
"node_modules/@esbuild/freebsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - Network accessline 451
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", - Network accessline 452
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - Network accessline 467
"node_modules/@esbuild/freebsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - Network accessline 468
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", - Network accessline 469
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - Network accessline 484
"node_modules/@esbuild/linux-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - Network accessline 485
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", - Network accessline 486
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - Network accessline 501
"node_modules/@esbuild/linux-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - Network accessline 502
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", - Network accessline 503
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - Network accessline 518
"node_modules/@esbuild/linux-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - Network accessline 519
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", - Network accessline 520
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - Network accessline 535
"node_modules/@esbuild/linux-loong64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - Network accessline 536
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", - Network accessline 537
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - Network accessline 552
"node_modules/@esbuild/linux-mips64el": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - Network accessline 553
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", - Network accessline 554
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - Network accessline 569
"node_modules/@esbuild/linux-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - Network accessline 570
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", - Network accessline 571
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - Network accessline 586
"node_modules/@esbuild/linux-riscv64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - Network accessline 587
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", - Network accessline 588
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - Network accessline 603
"node_modules/@esbuild/linux-s390x": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - Network accessline 604
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", - Network accessline 605
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - Network accessline 620
"node_modules/@esbuild/linux-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - Network accessline 621
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", - Network accessline 622
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - Network accessline 637
"node_modules/@esbuild/netbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - Network accessline 638
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", - Network accessline 639
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - Network accessline 654
"node_modules/@esbuild/netbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - Network accessline 655
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", - Network accessline 656
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - Network accessline 671
"node_modules/@esbuild/openbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - Network accessline 672
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", - Network accessline 673
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - Network accessline 688
"node_modules/@esbuild/openbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - Network accessline 689
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", - Network accessline 690
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - Network accessline 705
"node_modules/@esbuild/openharmony-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - Network accessline 706
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w - Network accessline 707
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - Network accessline 722
"node_modules/@esbuild/sunos-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - Network accessline 723
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", - Network accessline 724
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - Network accessline 739
"node_modules/@esbuild/win32-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - Network accessline 740
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", - Network accessline 741
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - Network accessline 756
"node_modules/@esbuild/win32-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - Network accessline 757
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", - Network accessline 758
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - Network accessline 773
"node_modules/@esbuild/win32-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - Network accessline 774
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", - Network accessline 775
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - Network accessline 790
"node_modules/@google/genai": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", - Network accessline 791
"version": "1.52.0", "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", "integrity": "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==", - Network accessline 792
"resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.52.0.tgz", - Network accessline 814
"node_modules/@hono/node-server": { "version": "1.19.14", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - Network accessline 815
"version": "1.19.14", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", - Network accessline 816
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - Network accessline 826
"node_modules/@huggingface/blake3-jit": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@huggingface/blake3-jit/-/blake3-jit-0.0.2.tgz", - Network accessline 827
"version": "0.0.2", "resolved": "https://registry.npmjs.org/@huggingface/blake3-jit/-/blake3-jit-0.0.2.tgz", "integrity": "sha512-Bq7B5qabyjrJfhBsl85Jd2QBtf+HzRD7h7A9GfN2lzrrsABhOa5evVPgzoCTxR7Ub0QFj7YDK1YkYRWBU25+2w==", - Network accessline 828
"resolved": "https://registry.npmjs.org/@huggingface/blake3-jit/-/blake3-jit-0.0.2.tgz", - Network accessline 832
"node_modules/@huggingface/hub": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-2.12.0.tgz", - Network accessline 833
"version": "2.12.0", "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-2.12.0.tgz", "integrity": "sha512-PU+CBtOVsg6e35LkHBe5WjkIxwEhGkoh93ZLIi/J/zgvv4JhLmfwtQ8+t/HodibBzIIloC1jvaAMkJqDJaml1g==", - Network accessline 834
"resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-2.12.0.tgz", - Network accessline 851
"node_modules/@huggingface/jinja": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.4.tgz", - Network accessline 852
"version": "0.3.4", "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.4.tgz", "integrity": "sha512-kFFQWJiWwvxezKQnvH1X7GjsECcMljFx+UZK9hx6P26aVHwwidJVTB0ptLfRVZQvVkOGHoMmTGvo4nT0X9hHOA==", - Network accessline 853
"resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.4.tgz", - Network accessline 860
"node_modules/@huggingface/tasks": { "version": "0.20.25", "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.20.25.tgz", - Network accessline 861
"version": "0.20.25", "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.20.25.tgz", "integrity": "sha512-id1Yp40dLFh2Hqy6PFN+9+PEXyKCB13hq6JSe0AkHfq3XVGjQGEO8C0UFVFUlHWCzB7FgI+u/hXn6aeRs/SE9w==", - Network accessline 862
"resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.20.25.tgz", - Network accessline 866
"node_modules/@huggingface/transformers": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.5.0.tgz", - Network accessline 867
"version": "3.5.0", "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.5.0.tgz", "integrity": "sha512-/KE7pb22NIJw30gjA56MKuvOI7KgipfcP2n1PSmNKfxXnaBE6T75JUVYWAExp1UNmrwaMm20yzDhSgoCk2NL7w==", - Network accessline 868
"resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.5.0.tgz", - Network accessline 878
"node_modules/@huggingface/xetchunk-wasm": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@huggingface/xetchunk-wasm/-/xetchunk-wasm-0.0.6.tgz", - Network accessline 879
"version": "0.0.6", "resolved": "https://registry.npmjs.org/@huggingface/xetchunk-wasm/-/xetchunk-wasm-0.0.6.tgz", "integrity": "sha512-LoYPl7jvUvOnkysrhMjAeBzK5mVe2GFu8O3IsZb1w7l7v+NqjDsyRduwct3yraPAGmzTxxdb/2aIORL98Y949g==", - Network accessline 880
"resolved": "https://registry.npmjs.org/@huggingface/xetchunk-wasm/-/xetchunk-wasm-0.0.6.tgz", - Network accessline 888
"node_modules/@iarna/toml": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - Network accessline 889
"version": "2.2.5", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - Network accessline 890
"resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - Network accessline 894
"node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - Network accessline 895
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - Network accessline 896
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - Network accessline 903
"node_modules/@img/sharp-darwin-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - Network accessline 904
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w== - Network accessline 905
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - Network accessline 917
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 918
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 919
"url": "https://opencollective.com/libvips" - Network accessline 925
"node_modules/@img/sharp-darwin-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - Network accessline 926
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - Network accessline 927
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - Network accessline 939
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 940
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 941
"url": "https://opencollective.com/libvips" - Network accessline 947
"node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - Network accessline 948
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCv - Network accessline 949
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - Network accessline 958
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 959
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 960
"url": "https://opencollective.com/libvips" - Network accessline 963
"node_modules/@img/sharp-libvips-darwin-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - Network accessline 964
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdj - Network accessline 965
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - Network accessline 974
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 975
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 976
"url": "https://opencollective.com/libvips" - Network accessline 979
"node_modules/@img/sharp-libvips-linux-arm": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - Network accessline 980
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11 - Network accessline 981
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - Network accessline 990
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 991
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 992
"url": "https://opencollective.com/libvips" - Network accessline 995
"node_modules/@img/sharp-libvips-linux-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - Network accessline 996
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28 - Network accessline 997
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - Network accessline 1006
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1007
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1008
"url": "https://opencollective.com/libvips" - Network accessline 1011
"node_modules/@img/sharp-libvips-linux-ppc64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - Network accessline 1012
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQ - Network accessline 1013
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - Network accessline 1022
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1023
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1024
"url": "https://opencollective.com/libvips" - Network accessline 1027
"node_modules/@img/sharp-libvips-linux-riscv64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - Network accessline 1028
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNb - Network accessline 1029
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - Network accessline 1038
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1039
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1040
"url": "https://opencollective.com/libvips" - Network accessline 1043
"node_modules/@img/sharp-libvips-linux-s390x": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - Network accessline 1044
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdw - Network accessline 1045
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - Network accessline 1054
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1055
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1056
"url": "https://opencollective.com/libvips" - Network accessline 1059
"node_modules/@img/sharp-libvips-linux-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - Network accessline 1060
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfA - Network accessline 1061
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - Network accessline 1070
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1071
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1072
"url": "https://opencollective.com/libvips" - Network accessline 1075
"node_modules/@img/sharp-libvips-linuxmusl-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - Network accessline 1076
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0p - Network accessline 1077
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - Network accessline 1086
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1087
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1088
"url": "https://opencollective.com/libvips" - Network accessline 1091
"node_modules/@img/sharp-libvips-linuxmusl-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - Network accessline 1092
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCyl - Network accessline 1093
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - Network accessline 1102
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1103
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1104
"url": "https://opencollective.com/libvips" - Network accessline 1107
"node_modules/@img/sharp-linux-arm": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - Network accessline 1108
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - Network accessline 1109
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - Network accessline 1121
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1122
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1123
"url": "https://opencollective.com/libvips" - Network accessline 1129
"node_modules/@img/sharp-linux-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - Network accessline 1130
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - Network accessline 1131
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - Network accessline 1143
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1144
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1145
"url": "https://opencollective.com/libvips" - Network accessline 1151
"node_modules/@img/sharp-linux-ppc64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - Network accessline 1152
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - Network accessline 1153
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - Network accessline 1165
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1166
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1167
"url": "https://opencollective.com/libvips" - Network accessline 1173
"node_modules/@img/sharp-linux-riscv64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - Network accessline 1174
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw - Network accessline 1175
"resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - Network accessline 1187
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1188
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1189
"url": "https://opencollective.com/libvips" - Network accessline 1195
"node_modules/@img/sharp-linux-s390x": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - Network accessline 1196
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - Network accessline 1197
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - Network accessline 1209
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1210
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1211
"url": "https://opencollective.com/libvips" - Network accessline 1217
"node_modules/@img/sharp-linux-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - Network accessline 1218
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - Network accessline 1219
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - Network accessline 1231
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1232
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1233
"url": "https://opencollective.com/libvips" - Network accessline 1239
"node_modules/@img/sharp-linuxmusl-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - Network accessline 1240
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id - Network accessline 1241
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - Network accessline 1253
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1254
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1255
"url": "https://opencollective.com/libvips" - Network accessline 1261
"node_modules/@img/sharp-linuxmusl-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - Network accessline 1262
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q - Network accessline 1263
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - Network accessline 1275
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1276
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1277
"url": "https://opencollective.com/libvips" - Network accessline 1283
"node_modules/@img/sharp-wasm32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - Network accessline 1284
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - Network accessline 1285
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - Network accessline 1297
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1298
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1299
"url": "https://opencollective.com/libvips" - Network accessline 1302
"node_modules/@img/sharp-win32-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - Network accessline 1303
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - Network accessline 1304
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - Network accessline 1316
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1317
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1318
"url": "https://opencollective.com/libvips" - Network accessline 1321
"node_modules/@img/sharp-win32-ia32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - Network accessline 1322
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - Network accessline 1323
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - Network accessline 1335
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1336
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1337
"url": "https://opencollective.com/libvips" - Network accessline 1340
"node_modules/@img/sharp-win32-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - Network accessline 1341
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - Network accessline 1342
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - Network accessline 1354
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1355
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1356
"url": "https://opencollective.com/libvips" - Network accessline 1359
"node_modules/@inkjs/ui": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@inkjs/ui/-/ui-2.0.0.tgz", - Network accessline 1360
"version": "2.0.0", "resolved": "https://registry.npmjs.org/@inkjs/ui/-/ui-2.0.0.tgz", "integrity": "sha512-5+8fJmwtF9UvikzLfph9sA+LS+l37Ij/szQltkuXLOAXwNkBX9innfzh4pLGXIB59vKEQUtc6D4qGvhD7h3pAg==", - Network accessline 1361
"resolved": "https://registry.npmjs.org/@inkjs/ui/-/ui-2.0.0.tgz", - Network accessline 1377
"node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - Network accessline 1378
"version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - Network accessline 1379
"resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - Network accessline 1386
"node_modules/@inquirer/checkbox": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - Network accessline 1387
"version": "4.3.2", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", - Network accessline 1388
"resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - Network accessline 1410
"node_modules/@inquirer/confirm": { "version": "5.1.21", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - Network accessline 1411
"version": "5.1.21", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - Network accessline 1412
"resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - Network accessline 1431
"node_modules/@inquirer/core": { "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - Network accessline 1432
"version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - Network accessline 1433
"resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - Network accessline 1458
"node_modules/@inquirer/editor": { "version": "4.2.23", "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - Network accessline 1459
"version": "4.2.23", "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", - Network accessline 1460
"resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - Network accessline 1480
"node_modules/@inquirer/expand": { "version": "4.0.23", "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - Network accessline 1481
"version": "4.0.23", "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", - Network accessline 1482
"resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - Network accessline 1502
"node_modules/@inquirer/external-editor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - Network accessline 1503
"version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - Network accessline 1504
"resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - Network accessline 1523
"node_modules/@inquirer/figures": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - Network accessline 1524
"version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - Network accessline 1525
"resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - Network accessline 1532
"node_modules/@inquirer/input": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - Network accessline 1533
"version": "4.3.1", "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", - Network accessline 1534
"resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - Network accessline 1553
"node_modules/@inquirer/number": { "version": "3.0.23", "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - Network accessline 1554
"version": "3.0.23", "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", - Network accessline 1555
"resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - Network accessline 1574
[Credential-related source omitted] - Network accessline 1575
"version": "4.0.23", "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", - Network accessline 1576
"resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - Network accessline 1596
"node_modules/@inquirer/prompts": { "version": "7.10.1", "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - Network accessline 1597
"version": "7.10.1", "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", - Network accessline 1598
"resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - Network accessline 1625
"node_modules/@inquirer/rawlist": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - Network accessline 1626
"version": "4.1.11", "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", - Network accessline 1627
"resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - Network accessline 1647
"node_modules/@inquirer/search": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - Network accessline 1648
"version": "3.2.2", "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", - Network accessline 1649
"resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - Network accessline 1670
"node_modules/@inquirer/select": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - Network accessline 1671
"version": "4.4.2", "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", - Network accessline 1672
"resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - Network accessline 1694
"node_modules/@inquirer/type": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - Network accessline 1695
"version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - Network accessline 1696
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - Network accessline 1711
"node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - Network accessline 1712
"version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - Network accessline 1713
"resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - Network accessline 1723
"node_modules/@isaacs/fs-minipass/node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - Network accessline 1724
"version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - Network accessline 1725
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - Network accessline 1732
"node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 1733
"version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - Network accessline 1734
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 1743
"node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 1744
"version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - Network accessline 1745
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 1753
"node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 1754
"version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - Network accessline 1755
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 1760
"node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 1761
"version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - Network accessline 1762
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 1771
"node_modules/@mixmark-io/domino": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", - Network accessline 1772
"version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", - Network accessline 1773
"resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", - Network accessline 1777
"node_modules/@modelcontextprotocol/sdk": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - Network accessline 1778
"version": "1.29.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", - Network accessline 1779
"resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - Network accessline 1817
"node_modules/@mozilla/readability": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.6.0.tgz", - Network accessline 1818
"version": "0.6.0", "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.6.0.tgz", "integrity": "sha512-juG5VWh4qAivzTAeMzvY9xs9HY5rAcr2E4I7tiSSCokRFi7XIZCAu92ZkSTsIj1OPceCifL3cpfteP3pDT9/QQ==", - Network accessline 1819
"resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.6.0.tgz", - Network accessline 1826
"node_modules/@napi-rs/canvas": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", - Network accessline 1827
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==", - Network accessline 1828
"resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", - Network accessline 1850
"node_modules/@napi-rs/canvas-android-arm64": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz", - Network accessline 1851
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz", "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX - Network accessline 1852
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz", - Network accessline 1866
"node_modules/@napi-rs/canvas-darwin-arm64": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz", - Network accessline 1867
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz", "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg - Network accessline 1868
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz", - Network accessline 1882
"node_modules/@napi-rs/canvas-darwin-x64": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz", - Network accessline 1883
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz", "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA - Network accessline 1884
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz", - Network accessline 1898
"node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz", - Network accessline 1899
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz", "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQ - Network accessline 1900
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz", - Network accessline 1914
"node_modules/@napi-rs/canvas-linux-arm64-gnu": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz", - Network accessline 1915
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz", "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzU - Network accessline 1916
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz", - Network accessline 1930
"node_modules/@napi-rs/canvas-linux-arm64-musl": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz", - Network accessline 1931
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz", "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2Jlf - Network accessline 1932
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz", - Network accessline 1946
"node_modules/@napi-rs/canvas-linux-riscv64-gnu": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz", - Network accessline 1947
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz", "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7M - Network accessline 1948
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz", - Network accessline 1962
"node_modules/@napi-rs/canvas-linux-x64-gnu": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", - Network accessline 1963
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9 - Network accessline 1964
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", - Network accessline 1978
"node_modules/@napi-rs/canvas-linux-x64-musl": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", - Network accessline 1979
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fu - Network accessline 1980
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", - Network accessline 1994
"node_modules/@napi-rs/canvas-win32-x64-msvc": { "version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz", - Network accessline 1995
"version": "0.1.80", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz", "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbT - Network accessline 1996
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz", - Network accessline 2010
"node_modules/@napi-rs/keyring": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.3.0.tgz", - Network accessline 2011
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.3.0.tgz", "integrity": "sha512-WrOw/bcXm0f9qHkumlT1QlArXSTWqaY9sunsDpOk+yCCorCKMxvWT/a3xko4EYHVdeZoh00yI2TydXn6eyICDA==", - Network accessline 2012
"resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.3.0.tgz", - Network accessline 2019
"funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 2020
"type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, - Network accessline 2021
"url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 2038
"node_modules/@napi-rs/keyring-darwin-arm64": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.3.0.tgz", - Network accessline 2039
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.3.0.tgz", "integrity": "sha512-pl76hJvdYUBn6I24bXiOBMA9nbDapo3I5B+f3OorjDU4dUMSypXeKbOVehJe8fhgTiH24flMyTS3aAIy43 - Network accessline 2040
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.3.0.tgz", - Network accessline 2054
"node_modules/@napi-rs/keyring-darwin-x64": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.3.0.tgz", - Network accessline 2055
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.3.0.tgz", "integrity": "sha512-YcJtEV5LA3cvA4z3BurgxH5IhTsW1JfIvcAAcqcecwk06Si9F9NqkxbZVIfDwQ8oRHgaBmT3zZJnLAotCrVahw - Network accessline 2056
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.3.0.tgz", - Network accessline 2070
"node_modules/@napi-rs/keyring-freebsd-x64": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.3.0.tgz", - Network accessline 2071
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.3.0.tgz", "integrity": "sha512-vlLf31TGhfRAaxLDBhg8b89ss0HHD/lyNmL5F3UjSaz5CUXElsJmKYq9fqA/B+cZKUEUcLHHGhF0I/CqcFda - Network accessline 2072
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.3.0.tgz", - Network accessline 2086
"node_modules/@napi-rs/keyring-linux-arm-gnueabihf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.3.0.tgz", - Network accessline 2087
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.3.0.tgz", "integrity": "sha512-KiWdMMu/Inz/bHHIAGrnF7r54FZDYXuHO6UFF/rhIrshUsxbMG1Rl9lEymNtqqsVo927 - Network accessline 2088
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.3.0.tgz", - Network accessline 2102
"node_modules/@napi-rs/keyring-linux-arm64-gnu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.3.0.tgz", - Network accessline 2103
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.3.0.tgz", "integrity": "sha512-eyKGpY40lm9Jvs1aD294XRH4y7+TlJM0YVAryZeXA6TX0mb4gMkxVXwSQv7MCwgah7raeUd0dKUb - Network accessline 2104
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.3.0.tgz", - Network accessline 2118
"node_modules/@napi-rs/keyring-linux-arm64-musl": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.3.0.tgz", - Network accessline 2119
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.3.0.tgz", "integrity": "sha512-iIK6JWHXAJqDrEyLY3TmswwloVyt2vj+04TZnew+uSJ9gnDO8EwRbp3/iw3LpWaXiDO7VomGO6 - Network accessline 2120
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.3.0.tgz", - Network accessline 2134
"node_modules/@napi-rs/keyring-linux-riscv64-gnu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.3.0.tgz", - Network accessline 2135
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.3.0.tgz", "integrity": "sha512-/PGqrwn6EwgtK6vccASSXJRfOSP4vN1F4ASsIQ+7MdrK6hNvAJ1FZPrIuD5gGGdxezo3F++T - Network accessline 2136
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.3.0.tgz", - Network accessline 2150
"node_modules/@napi-rs/keyring-linux-x64-gnu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.3.0.tgz", - Network accessline 2151
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.3.0.tgz", "integrity": "sha512-2PDK1WKWTu9lBGq9VvNEkSlQD3O7YwVpmnyN2M3cy4v7NJ/8gDMd9GXv3G+FVXN13uhp4gnnPBS+Scef - Network accessline 2152
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.3.0.tgz", - Network accessline 2166
"node_modules/@napi-rs/keyring-linux-x64-musl": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.3.0.tgz", - Network accessline 2167
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.3.0.tgz", "integrity": "sha512-oJ2HkX8YUo46QBkn0pG+HuIKQNqr523q6vBobCn+P95s4C4K6/kLBqHY/1bg5J4ap31DzsznhnFKcf - Network accessline 2168
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.3.0.tgz", - Network accessline 2182
"node_modules/@napi-rs/keyring-win32-arm64-msvc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.3.0.tgz", - Network accessline 2183
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.3.0.tgz", "integrity": "sha512-tOd3c/uAaeoE4ycVlmAdSvygz0Zt3zdca6Y7gokBeIbaRDWpjDIUOpU3MvML59XAaqyuKGsVVu - Network accessline 2184
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.3.0.tgz", - Network accessline 2198
"node_modules/@napi-rs/keyring-win32-ia32-msvc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.3.0.tgz", - Network accessline 2199
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.3.0.tgz", "integrity": "sha512-sPSqeAFZMGqP1R++M2JTza7GQJJ/TpCo6JU6Vcd4jnebvOaEDs9b7eipakU1PJdSvhpC2yXMCNRk - Network accessline 2200
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.3.0.tgz", - Network accessline 2214
"node_modules/@napi-rs/keyring-win32-x64-msvc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.3.0.tgz", - Network accessline 2215
"version": "1.3.0", "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.3.0.tgz", "integrity": "sha512-4DnCWXwDc0HRKwyRlG5y0VhKZW2tNRQfKKfyj6IX/KWfDNyq9hn4n+GL1auyDcOO/v8PwnhmYo2+rO - Network accessline 2216
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.3.0.tgz", - Network accessline 2230
"node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - Network accessline 2231
"version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - Network accessline 2232
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - Network accessline 2240
"funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 2241
"type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, - Network accessline 2242
"url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 2249
"node_modules/@oxc-project/types": { "version": "0.139.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - Network accessline 2250
"version": "0.139.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", - Network accessline 2251
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - Network accessline 2254
"license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" - Network accessline 2255
"funding": { "url": "https://github.com/sponsors/Boshen" } - Network accessline 2256
"url": "https://github.com/sponsors/Boshen" - Network accessline 2259
"node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - Network accessline 2260
"version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - Network accessline 2261
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - Network accessline 2265
"node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - Network accessline 2266
"version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - Network accessline 2267
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - Network accessline 2271
"node_modules/@protobufjs/codegen": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - Network accessline 2272
"version": "2.0.5", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - Network accessline 2273
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - Network accessline 2277
"node_modules/@protobufjs/eventemitter": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - Network accessline 2278
"version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - Network accessline 2279
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - Network accessline 2283
"node_modules/@protobufjs/fetch": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - Network accessline 2284
"version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - Network accessline 2285
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - Network accessline 2292
"node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - Network accessline 2293
"version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - Network accessline 2294
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - Network accessline 2298
"node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - Network accessline 2299
"version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - Network accessline 2300
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - Network accessline 2304
"node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - Network accessline 2305
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - Network accessline 2306
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - Network accessline 2310
"node_modules/@protobufjs/utf8": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - Network accessline 2311
"version": "1.1.1", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - Network accessline 2312
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - Network accessline 2316
"node_modules/@roberts_lando/vfs": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.3.tgz", - Network accessline 2317
"version": "0.3.3", "resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.3.tgz", "integrity": "sha512-YjkxVSLw5WMZQoARaryRAjcxA+GbBzWMJdwYZX5oLUt9cC/gew9as4Dn7tcLzPp7BPoR221VpTZ+78TRPawnjg==", - Network accessline 2318
"resolved": "https://registry.npmjs.org/@roberts_lando/vfs/-/vfs-0.3.3.tgz", - Network accessline 2326
"node_modules/@rolldown/binding-android-arm64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - Network accessline 2327
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1 - Network accessline 2328
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - Network accessline 2343
"node_modules/@rolldown/binding-darwin-arm64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - Network accessline 2344
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K1 - Network accessline 2345
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - Network accessline 2360
"node_modules/@rolldown/binding-darwin-x64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - Network accessline 2361
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6 - Network accessline 2362
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - Network accessline 2377
"node_modules/@rolldown/binding-freebsd-x64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - Network accessline 2378
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF - Network accessline 2379
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - Network accessline 2394
"node_modules/@rolldown/binding-linux-arm-gnueabihf": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - Network accessline 2395
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm - Network accessline 2396
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - Network accessline 2411
"node_modules/@rolldown/binding-linux-arm64-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - Network accessline 2412
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZ - Network accessline 2413
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - Network accessline 2431
"node_modules/@rolldown/binding-linux-arm64-musl": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - Network accessline 2432
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN - Network accessline 2433
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - Network accessline 2451
"node_modules/@rolldown/binding-linux-ppc64-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - Network accessline 2452
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztM - Network accessline 2453
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - Network accessline 2471
"node_modules/@rolldown/binding-linux-s390x-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - Network accessline 2472
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/m - Network accessline 2473
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - Network accessline 2491
"node_modules/@rolldown/binding-linux-x64-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - Network accessline 2492
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9g - Network accessline 2493
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - Network accessline 2511
"node_modules/@rolldown/binding-linux-x64-musl": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - Network accessline 2512
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+ - Network accessline 2513
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - Network accessline 2531
"node_modules/@rolldown/binding-openharmony-arm64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - Network accessline 2532
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqng - Network accessline 2533
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - Network accessline 2548
"node_modules/@rolldown/binding-wasm32-wasi": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - Network accessline 2549
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvlt - Network accessline 2550
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - Network accessline 2567
"node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - Network accessline 2568
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMED - Network accessline 2569
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - Network accessline 2584
"node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - Network accessline 2585
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXI - Network accessline 2586
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - Network accessline 2601
"node_modules/@rolldown/pluginutils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - Network accessline 2602
"version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - Network accessline 2603
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - Network accessline 2608
"node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - Network accessline 2609
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYg - Network accessline 2610
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", - Network accessline 2622
"node_modules/@rollup/rollup-android-arm64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - Network accessline 2623
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjk - Network accessline 2624
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", - Network accessline 2636
"node_modules/@rollup/rollup-darwin-arm64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - Network accessline 2637
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj - Network accessline 2638
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", - Network accessline 2650
"node_modules/@rollup/rollup-darwin-x64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - Network accessline 2651
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg= - Network accessline 2652
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", - Network accessline 2664
"node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - Network accessline 2665
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKA - Network accessline 2666
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", - Network accessline 2678
"node_modules/@rollup/rollup-freebsd-x64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - Network accessline 2679
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/l - Network accessline 2680
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", - Network accessline 2692
"node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - Network accessline 2693
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/Ft - Network accessline 2694
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", - Network accessline 2706
"node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - Network accessline 2707
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqB - Network accessline 2708
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", - Network accessline 2720
"node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - Network accessline 2721
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbX - Network accessline 2722
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", - Network accessline 2734
"node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - Network accessline 2735
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3 - Network accessline 2736
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", - Network accessline 2748
"node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - Network accessline 2749
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs - Network accessline 2750
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", - Network accessline 2762
"node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - Network accessline 2763
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrD - Network accessline 2764
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", - Network accessline 2776
"node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - Network accessline 2777
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkS - Network accessline 2778
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", - Network accessline 2790
"node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - Network accessline 2791
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxs - Network accessline 2792
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", - Network accessline 2804
"node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - Network accessline 2805
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzk - Network accessline 2806
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", - Network accessline 2818
"node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - Network accessline 2819
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/ - Network accessline 2820
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", - Network accessline 2832
"node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - Network accessline 2833
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnT - Network accessline 2834
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", - Network accessline 2846
"node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - Network accessline 2847
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe - Network accessline 2848
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", - Network accessline 2860
"node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - Network accessline 2861
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xx - Network accessline 2862
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", - Network accessline 2874
"node_modules/@rollup/rollup-openbsd-x64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - Network accessline 2875
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWj - Network accessline 2876
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", - Network accessline 2888
"node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - Network accessline 2889
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2um - Network accessline 2890
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", - Network accessline 2902
"node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - Network accessline 2903
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6 - Network accessline 2904
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", - Network accessline 2916
"node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - Network accessline 2917
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1 - Network accessline 2918
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", - Network accessline 2930
"node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - Network accessline 2931
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY - Network accessline 2932
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", - Network accessline 2944
"node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - Network accessline 2945
"version": "4.60.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC - Network accessline 2946
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", - Network accessline 2958
"node_modules/@seriousme/openapi-schema-validator": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.0.tgz", - Network accessline 2959
"version": "2.9.0", "resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.0.tgz", "integrity": "sha512-bP/48Il7RMxhohq36Vg0c25tnCKOO+oEv8XSxDefuUBj0W8fYzL2Yb6C8tji0WBXykZ1S/79 - Network accessline 2960
"resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.0.tgz", - Network accessline 2975
"node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - Network accessline 2976
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - Network accessline 2977
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - Network accessline 2982
"node_modules/@tybys/wasm-util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - Network accessline 2983
"version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - Network accessline 2984
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - Network accessline 2993
"node_modules/@types/better-sqlite3": { "version": "7.6.13", "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - Network accessline 2994
"version": "7.6.13", "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", - Network accessline 2995
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - Network accessline 3003
"node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - Network accessline 3004
"version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - Network accessline 3005
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - Network accessline 3014
"node_modules/@types/cli-progress": { "version": "3.11.6", "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", - Network accessline 3015
"version": "3.11.6", "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", - Network accessline 3016
"resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", - Network accessline 3024
"node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - Network accessline 3025
"version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - Network accessline 3026
"resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - Network accessline 3031
"node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - Network accessline 3032
"version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - Network accessline 3033
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - Network accessline 3038
"node_modules/@types/gradient-string": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz", - Network accessline 3039
"version": "1.1.6", "resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz", "integrity": "sha512-LkaYxluY4G5wR1M4AKQUal2q61Di1yVVCw42ImFTuaIoQVgmV0WP1xUaLB8zwb47mp82vWTpePI9JmrjEnJ7nQ==", - Network accessline 3040
"resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz", - Network accessline 3047
"node_modules/@types/node": { "version": "25.9.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", - Network accessline 3048
"version": "25.9.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", - Network accessline 3049
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", - Network accessline 3056
"node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - Network accessline 3057
"version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - Network accessline 3058
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - Network accessline 3063
"node_modules/@types/react": { "version": "18.3.29", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz", - Network accessline 3064
"version": "18.3.29", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz", "integrity": "sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==", - Network accessline 3065
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz", - Network accessline 3074
"node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - Network accessline 3075
"version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - Network accessline 3076
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - Network accessline 3080
"node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", - Network accessline 3081
"version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", - Network accessline 3082
"resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", - Network accessline 3086
"node_modules/@types/turndown": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.6.tgz", - Network accessline 3087
"version": "5.0.6", "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.6.tgz", "integrity": "sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==", - Network accessline 3088
"resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.6.tgz", - Network accessline 3093
"node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - Network accessline 3094
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", "integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==", - Network accessline 3095
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - Network accessline 3106
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3107
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 3108
"url": "https://opencollective.com/vitest" - Network accessline 3111
"node_modules/@vitest/mocker": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - Network accessline 3112
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - Network accessline 3113
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - Network accessline 3121
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3122
"funding": { "url": "https://opencollective.com/vitest" }, - Network accessline 3123
"url": "https://opencollective.com/vitest" - Network accessline 3138
"node_modules/@vitest/pretty-format": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - Network accessline 3139
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==", - Network accessline 3140
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - Network accessline 3146
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3147
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 3148
"url": "https://opencollective.com/vitest" - Network accessline 3151
"node_modules/@vitest/runner": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - Network accessline 3152
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", "integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==", - Network accessline 3153
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - Network accessline 3160
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3161
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 3162
"url": "https://opencollective.com/vitest" - Network accessline 3165
"node_modules/@vitest/snapshot": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - Network accessline 3166
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", "integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==", - Network accessline 3167
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - Network accessline 3176
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3177
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 3178
"url": "https://opencollective.com/vitest" - Network accessline 3181
"node_modules/@vitest/spy": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - Network accessline 3182
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==", - Network accessline 3183
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - Network accessline 3186
"license": "MIT", "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3187
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 3188
"url": "https://opencollective.com/vitest" - Network accessline 3191
"node_modules/@vitest/utils": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - Network accessline 3192
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==", - Network accessline 3193
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - Network accessline 3201
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 3202
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 3203
"url": "https://opencollective.com/vitest" - Network accessline 3206
"node_modules/@xmldom/xmldom": { "version": "0.8.13", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", - Network accessline 3207
"version": "0.8.13", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", - Network accessline 3208
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", - Network accessline 3216
"node_modules/@yao-pkg/pkg": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.21.0.tgz", - Network accessline 3217
"version": "6.21.0", "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.21.0.tgz", "integrity": "sha512-dZl2C7rdwwEI4tv7WW+Cvnl+2K8OqHKUXfNQRq3mZCTC4degoFx1jA4d5wOn9d8lHrUy58xuEt1eJD0pTddW5w==", - Network accessline 3218
"resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.21.0.tgz", - Network accessline 3250
"node_modules/@yao-pkg/pkg-fetch": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.6.4.tgz", - Network accessline 3251
"version": "3.6.4", "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.6.4.tgz", "integrity": "sha512-2JXvS9HbMudLlzEjSaJ7bLNnF/WlTv7iaTAJp2Tk8pBsgwCyL9p4rIN8cztHlyZF7qVzr1EaBjd7DQooFk0azQ==", - Network accessline 3252
"resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.6.4.tgz", - Network accessline 3268
"node_modules/@yao-pkg/pkg-fetch/node_modules/b4a": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - Network accessline 3269
"version": "1.8.1", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - Network accessline 3270
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - Network accessline 3283
"node_modules/@yao-pkg/pkg-fetch/node_modules/tar-fs": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", - Network accessline 3284
"version": "3.1.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", - Network accessline 3285
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", - Network accessline 3298
"node_modules/@yao-pkg/pkg-fetch/node_modules/tar-stream": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", - Network accessline 3299
"version": "3.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", - Network accessline 3300
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", - Network accessline 3311
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/aix-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - Network accessline 3312
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - Network accessline 3313
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - Network accessline 3328
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/android-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - Network accessline 3329
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - Network accessline 3330
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - Network accessline 3345
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/android-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - Network accessline 3346
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - Network accessline 3347
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - Network accessline 3362
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/android-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - Network accessline 3363
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - Network accessline 3364
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - Network accessline 3379
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/darwin-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - Network accessline 3380
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - Network accessline 3381
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - Network accessline 3396
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/darwin-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - Network accessline 3397
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - Network accessline 3398
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - Network accessline 3413
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/freebsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - Network accessline 3414
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - Network accessline 3415
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - Network accessline 3430
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/freebsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - Network accessline 3431
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - Network accessline 3432
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - Network accessline 3447
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - Network accessline 3448
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - Network accessline 3449
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - Network accessline 3464
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - Network accessline 3465
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - Network accessline 3466
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - Network accessline 3481
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - Network accessline 3482
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - Network accessline 3483
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - Network accessline 3498
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-loong64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - Network accessline 3499
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - Network accessline 3500
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - Network accessline 3515
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-mips64el": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - Network accessline 3516
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - Network accessline 3517
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - Network accessline 3532
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - Network accessline 3533
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - Network accessline 3534
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - Network accessline 3549
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-riscv64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - Network accessline 3550
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - Network accessline 3551
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - Network accessline 3566
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-s390x": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - Network accessline 3567
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - Network accessline 3568
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - Network accessline 3583
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/linux-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - Network accessline 3584
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - Network accessline 3585
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - Network accessline 3600
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/netbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - Network accessline 3601
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - Network accessline 3602
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - Network accessline 3617
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/netbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - Network accessline 3618
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - Network accessline 3619
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - Network accessline 3634
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/openbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - Network accessline 3635
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - Network accessline 3636
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - Network accessline 3651
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/openbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - Network accessline 3652
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - Network accessline 3653
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - Network accessline 3668
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/openharmony-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - Network accessline 3669
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg - Network accessline 3670
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - Network accessline 3685
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/sunos-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - Network accessline 3686
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - Network accessline 3687
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - Network accessline 3702
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/win32-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - Network accessline 3703
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - Network accessline 3704
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - Network accessline 3719
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/win32-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - Network accessline 3720
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - Network accessline 3721
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - Network accessline 3736
"node_modules/@yao-pkg/pkg/node_modules/@esbuild/win32-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - Network accessline 3737
"version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - Network accessline 3738
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - Network accessline 3753
"node_modules/@yao-pkg/pkg/node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - Network accessline 3754
"version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - Network accessline 3755
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - Network accessline 3763
"node_modules/@yao-pkg/pkg/node_modules/esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - Network accessline 3764
"version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - Network accessline 3765
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - Network accessline 3805
"node_modules/@yao-pkg/pkg/node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - Network accessline 3806
"version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - Network accessline 3807
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - Network accessline 3815
"node_modules/@yao-pkg/pkg/node_modules/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - Network accessline 3816
"version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - Network accessline 3817
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - Network accessline 3828
"node_modules/@yao-pkg/pkg/node_modules/tar": { "version": "7.5.20", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", - Network accessline 3829
"version": "7.5.20", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", "integrity": "sha512-9FcyK4PA6+WbzlTM9WhQm6vB5W7cP7dUiPsv1g7YDwEQnQ1CGpK3MGlKk/ITVWMk05kHZuBhmVhiv8LZoy/PFQ==", - Network accessline 3830
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.20.tgz", - Network accessline 3845
"node_modules/@yao-pkg/pkg/node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - Network accessline 3846
"version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - Network accessline 3847
"resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - Network accessline 3855
"node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - Network accessline 3856
"version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - Network accessline 3857
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - Network accessline 3868
"node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - Network accessline 3869
"version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - Network accessline 3870
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - Network accessline 3881
"node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - Network accessline 3882
"version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - Network accessline 3883
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - Network accessline 3890
"node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - Network accessline 3891
"version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - Network accessline 3892
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - Network accessline 3901
"funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" - Network accessline 3902
"type": "github", "url": "https://github.com/sponsors/epoberezkin" } - Network accessline 3903
"url": "https://github.com/sponsors/epoberezkin" - Network accessline 3906
"node_modules/ajv-draft-04": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - Network accessline 3907
"version": "1.0.0", "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - Network accessline 3908
"resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - Network accessline 3921
"node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - Network accessline 3922
"version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - Network accessline 3923
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - Network accessline 3938
"node_modules/ansi-escapes": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - Network accessline 3939
"version": "7.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - Network accessline 3940
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - Network accessline 3948
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 3949
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 3950
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 3953
"node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - Network accessline 3954
"version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - Network accessline 3955
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - Network accessline 3960
}, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" - Network accessline 3961
"funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } - Network accessline 3962
"url": "https://github.com/chalk/ansi-regex?sponsor=1" - Network accessline 3965
"node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - Network accessline 3966
"version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - Network accessline 3967
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - Network accessline 3972
}, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 3973
"funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - Network accessline 3974
"url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 3977
"node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - Network accessline 3978
"version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - Network accessline 3979
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - Network accessline 3984
"node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - Network accessline 3985
"version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - Network accessline 3986
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - Network accessline 3994
"node_modules/auto-bind": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", - Network accessline 3995
"version": "5.0.1", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", - Network accessline 3996
"resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", - Network accessline 4001
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 4002
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 4003
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 4006
"node_modules/bare-events": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", - Network accessline 4007
"version": "2.9.1", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", - Network accessline 4008
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", - Network accessline 4021
"node_modules/bare-fs": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz", - Network accessline 4022
"version": "4.7.4", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz", "integrity": "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==", - Network accessline 4023
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz", - Network accessline 4046
"node_modules/bare-path": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", - Network accessline 4047
"version": "3.1.1", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", - Network accessline 4048
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", - Network accessline 4053
"node_modules/bare-stream": { "version": "2.13.3", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", - Network accessline 4054
"version": "2.13.3", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", - Network accessline 4055
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", - Network accessline 4081
"node_modules/bare-stream/node_modules/b4a": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - Network accessline 4082
"version": "1.8.1", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - Network accessline 4083
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - Network accessline 4096
"node_modules/bare-url": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", - Network accessline 4097
"version": "2.4.5", "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==", - Network accessline 4098
"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", - Network accessline 4106
"node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - Network accessline 4107
"version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - Network accessline 4108
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - Network accessline 4111
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 4112
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 4113
"url": "https://github.com/sponsors/feross" - Network accessline 4115
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 4116
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 4117
"url": "https://www.patreon.com/feross" - Network accessline 4119
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 4120
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 4121
"url": "https://feross.org/support" - Network accessline 4126
"node_modules/better-sqlite3": { "version": "12.11.1", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", - Network accessline 4127
"version": "12.11.1", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", "integrity": "sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==", - Network accessline 4128
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", - Network accessline 4140
"node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - Network accessline 4141
"version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - Network accessline 4142
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - Network accessline 4149
"node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - Network accessline 4150
"version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - Network accessline 4151
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - Network accessline 4158
"node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - Network accessline 4159
"version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - Network accessline 4160
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - Network accessline 4169
"node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - Network accessline 4170
"version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - Network accessline 4171
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - Network accessline 4176
"node_modules/body-parser": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - Network accessline 4177
"version": "2.2.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - Network accessline 4178
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - Network accessline 4195
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 4196
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 4197
"url": "https://opencollective.com/express" - Network accessline 4200
"node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - Network accessline 4201
"version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - Network accessline 4202
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - Network accessline 4206
"node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - Network accessline 4207
"version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - Network accessline 4208
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - Network accessline 4209
"integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "licen - Network accessline 4210
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - Network accessline 4213
"node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - Network accessline 4214
"version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - Network accessline 4215
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - Network accessline 4218
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 4219
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 4220
"url": "https://github.com/sponsors/feross" - Network accessline 4222
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 4223
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 4224
"url": "https://www.patreon.com/feross" - Network accessline 4226
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 4227
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 4228
"url": "https://feross.org/support" - Network accessline 4237
"node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - Network accessline 4238
"version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsf - Network accessline 4239
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - Network accessline 4243
"node_modules/bundle-require": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - Network accessline 4244
"version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - Network accessline 4245
"resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - Network accessline 4259
"node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - Network accessline 4260
"version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - Network accessline 4261
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - Network accessline 4268
"node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - Network accessline 4269
"version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - Network accessline 4270
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - Network accessline 4278
"node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - Network accessline 4279
"version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuM - Network accessline 4280
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - Network accessline 4291
"node_modules/call-bound": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - Network accessline 4292
"version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - Network accessline 4293
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - Network accessline 4302
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4303
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4304
"url": "https://github.com/sponsors/ljharb" - Network accessline 4307
"node_modules/cfonts": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/cfonts/-/cfonts-3.3.1.tgz", - Network accessline 4308
"version": "3.3.1", "resolved": "https://registry.npmjs.org/cfonts/-/cfonts-3.3.1.tgz", "integrity": "sha512-ZGEmN3W9mViWEDjsuPo4nK4h39sfh6YtoneFYp9WLPI/rw8BaSSrfQC6jkrGW3JMvV3ZnExJB/AEqXc/nHYxkw==", - Network accessline 4309
"resolved": "https://registry.npmjs.org/cfonts/-/cfonts-3.3.1.tgz", - Network accessline 4323
"node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - Network accessline 4324
"version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - Network accessline 4325
"resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - Network accessline 4333
"node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - Network accessline 4334
"version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - Network accessline 4335
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - Network accessline 4340
}, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 4341
"funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } - Network accessline 4342
"url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 4345
"node_modules/chardet": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - Network accessline 4346
"version": "2.1.1", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - Network accessline 4347
"resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - Network accessline 4351
"node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - Network accessline 4352
"version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - Network accessline 4353
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - Network accessline 4362
}, "funding": { "url": "https://paulmillr.com/funding/" - Network accessline 4363
"funding": { "url": "https://paulmillr.com/funding/" } - Network accessline 4364
"url": "https://paulmillr.com/funding/" - Network accessline 4367
"node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - Network accessline 4368
"version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - Network accessline 4369
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - Network accessline 4373
"node_modules/chrome-remote-interface": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.33.3.tgz", - Network accessline 4374
"version": "0.33.3", "resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.33.3.tgz", "integrity": "sha512-zNnn0prUL86Teru6UCAZ1yU1XeXljHl3gj7OrfPcarEfU62OUU4IujDPdTDW3dAWwRqN3ZMG/Chhkh2gPL/ - Network accessline 4375
"resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.33.3.tgz", - Network accessline 4387
"node_modules/chrome-remote-interface/node_modules/commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - Network accessline 4388
"version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - Network accessline 4389
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - Network accessline 4394
"node_modules/chrome-remote-interface/node_modules/ws": { "version": "7.5.13", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", - Network accessline 4395
"version": "7.5.13", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", - Network accessline 4396
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", - Network accessline 4416
"node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - Network accessline 4417
"version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - Network accessline 4418
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - Network accessline 4423
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 4424
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 4425
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 4428
"node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - Network accessline 4429
"version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - Network accessline 4430
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - Network accessline 4438
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 4439
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 4440
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 4443
"node_modules/cli-progress": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - Network accessline 4444
"version": "3.12.0", "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - Network accessline 4445
"resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - Network accessline 4455
"node_modules/cli-progress/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - Network accessline 4456
"version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - Network accessline 4457
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - Network accessline 4464
"node_modules/cli-progress/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - Network accessline 4465
"version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - Network accessline 4466
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - Network accessline 4470
"node_modules/cli-progress/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - Network accessline 4471
"version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQ - Network accessline 4472
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - Network accessline 4479
"node_modules/cli-progress/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - Network accessline 4480
"version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - Network accessline 4481
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - Network accessline 4493
"node_modules/cli-progress/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - Network accessline 4494
"version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - Network accessline 4495
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - Network accessline 4505
"node_modules/cli-spinners": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", - Network accessline 4506
"version": "3.4.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", - Network accessline 4507
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", - Network accessline 4512
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 4513
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 4514
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 4517
"node_modules/cli-truncate": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - Network accessline 4518
"version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - Network accessline 4519
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - Network accessline 4528
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 4529
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 4530
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 4533
"node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - Network accessline 4534
"version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - Network accessline 4535
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - Network accessline 4544
}, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" - Network accessline 4545
"funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } - Network accessline 4546
"url": "https://github.com/chalk/slice-ansi?sponsor=1" - Network accessline 4549
"node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - Network accessline 4550
"version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - Network accessline 4551
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - Network accessline 4558
"node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - Network accessline 4559
"version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - Network accessline 4560
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - Network accessline 4570
"node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - Network accessline 4571
"version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - Network accessline 4572
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - Network accessline 4580
"node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - Network accessline 4581
"version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - Network accessline 4582
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - Network accessline 4591
}, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 4592
"funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - Network accessline 4593
"url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 4596
"node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - Network accessline 4597
"version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - Network accessline 4598
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - Network accessline 4603
"node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - Network accessline 4604
"version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQ - Network accessline 4605
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - Network accessline 4613
"node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - Network accessline 4614
"version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - Network accessline 4615
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - Network accessline 4628
"node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - Network accessline 4629
"version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - Network accessline 4630
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - Network accessline 4641
"node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - Network accessline 4642
"version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - Network accessline 4643
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - Network accessline 4654
}, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 4655
"funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } - Network accessline 4656
"url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 4659
"node_modules/code-excerpt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - Network accessline 4660
"version": "4.0.0", "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", - Network accessline 4661
"resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - Network accessline 4671
"node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - Network accessline 4672
"version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - Network accessline 4673
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - Network accessline 4683
"node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - Network accessline 4684
"version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - Network accessline 4685
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - Network accessline 4689
"node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - Network accessline 4690
"version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - Network accessline 4691
"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - Network accessline 4698
"node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - Network accessline 4699
"version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - Network accessline 4700
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - Network accessline 4705
"node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - Network accessline 4706
"version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - Network accessline 4707
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - Network accessline 4715
"node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - Network accessline 4716
"version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", - Network accessline 4717
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - Network accessline 4723
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 4724
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 4725
"url": "https://opencollective.com/express" - Network accessline 4728
"node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - Network accessline 4729
"version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - Network accessline 4730
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - Network accessline 4737
"node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - Network accessline 4738
"version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - Network accessline 4739
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - Network accessline 4744
"node_modules/convert-to-spaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - Network accessline 4745
"version": "2.0.1", "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", - Network accessline 4746
"resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - Network accessline 4753
"node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - Network accessline 4754
"version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - Network accessline 4755
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - Network accessline 4762
"node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - Network accessline 4763
"version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - Network accessline 4764
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - Network accessline 4771
"node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - Network accessline 4772
"version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - Network accessline 4773
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - Network accessline 4778
"node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - Network accessline 4779
"version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - Network accessline 4780
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - Network accessline 4790
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 4791
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 4792
"url": "https://opencollective.com/express" - Network accessline 4795
"node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - Network accessline 4796
"version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - Network accessline 4797
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - Network accessline 4809
"node_modules/css-select": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - Network accessline 4810
"version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - Network accessline 4811
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - Network accessline 4820
}, "funding": { "url": "https://github.com/sponsors/fb55" - Network accessline 4821
"funding": { "url": "https://github.com/sponsors/fb55" } - Network accessline 4822
"url": "https://github.com/sponsors/fb55" - Network accessline 4825
"node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - Network accessline 4826
"version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - Network accessline 4827
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - Network accessline 4832
}, "funding": { "url": "https://github.com/sponsors/fb55" - Network accessline 4833
"funding": { "url": "https://github.com/sponsors/fb55" } - Network accessline 4834
"url": "https://github.com/sponsors/fb55" - Network accessline 4837
"node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - Network accessline 4838
"version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - Network accessline 4839
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - Network accessline 4843
"node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - Network accessline 4844
"version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - Network accessline 4845
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - Network accessline 4850
"node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - Network accessline 4851
"version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - Network accessline 4852
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - Network accessline 4859
"node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 4860
"version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - Network accessline 4861
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 4876
"node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - Network accessline 4877
"version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - Network accessline 4878
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - Network accessline 4886
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 4887
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 4888
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 4891
"node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - Network accessline 4892
"version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - Network accessline 4893
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - Network accessline 4900
"node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - Network accessline 4901
"version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - Network accessline 4902
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - Network accessline 4909
"node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - Network accessline 4910
"version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - Network accessline 4911
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - Network accessline 4921
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4922
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4923
"url": "https://github.com/sponsors/ljharb" - Network accessline 4926
"node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - Network accessline 4927
"version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - Network accessline 4928
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - Network accessline 4938
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4939
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4940
"url": "https://github.com/sponsors/ljharb" - Network accessline 4943
"node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - Network accessline 4944
"version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - Network accessline 4945
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - Network accessline 4955
"node_modules/defuddle": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/defuddle/-/defuddle-0.16.0.tgz", - Network accessline 4956
"version": "0.16.0", "resolved": "https://registry.npmjs.org/defuddle/-/defuddle-0.16.0.tgz", "integrity": "sha512-8Y87EivlIqzxFsULUQLnch29oPeBxMk3yvX2W+8HeZdgxHXeoQINTZD24jfRCQE7n5ui08WWHVipr9xh5MI2TQ==", - Network accessline 4957
"resolved": "https://registry.npmjs.org/defuddle/-/defuddle-0.16.0.tgz", - Network accessline 4973
"node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - Network accessline 4974
"version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - Network accessline 4975
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - Network accessline 4982
"node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - Network accessline 4983
"version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - Network accessline 4984
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - Network accessline 4991
"node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - Network accessline 4992
"version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - Network accessline 4993
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - Network accessline 4997
"node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - Network accessline 4998
"version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - Network accessline 4999
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - Network accessline 5006
}, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - Network accessline 5007
"funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } - Network accessline 5008
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - Network accessline 5011
"node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - Network accessline 5012
"version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - Network accessline 5013
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - Network accessline 5016
{ "type": "github", "url": "https://github.com/sponsors/fb55" - Network accessline 5017
"type": "github", "url": "https://github.com/sponsors/fb55" } - Network accessline 5018
"url": "https://github.com/sponsors/fb55" - Network accessline 5023
"node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - Network accessline 5024
"version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - Network accessline 5025
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - Network accessline 5033
}, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" - Network accessline 5034
"funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } - Network accessline 5035
"url": "https://github.com/fb55/domhandler?sponsor=1" - Network accessline 5038
"node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - Network accessline 5039
"version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - Network accessline 5040
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - Network accessline 5047
}, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" - Network accessline 5048
"funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } - Network accessline 5049
"url": "https://github.com/fb55/domutils?sponsor=1" - Network accessline 5052
"node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - Network accessline 5053
"version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - Network accessline 5054
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - Network accessline 5066
"node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - Network accessline 5067
"version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - Network accessline 5068
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - Network accessline 5076
"node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - Network accessline 5077
"version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - Network accessline 5078
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - Network accessline 5092
"node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - Network accessline 5093
"version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - Network accessline 5094
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - Network accessline 5099
"node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - Network accessline 5100
"version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - Network accessline 5101
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - Network accessline 5109
"node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - Network accessline 5110
"version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - Network accessline 5111
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - Network accessline 5118
"node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - Network accessline 5119
"version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - Network accessline 5120
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - Network accessline 5124
"node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - Network accessline 5125
"version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - Network accessline 5126
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - Network accessline 5130
"node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - Network accessline 5131
"version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - Network accessline 5132
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - Network accessline 5139
"node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - Network accessline 5140
"version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - Network accessline 5141
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - Network accessline 5148
"node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - Network accessline 5149
"version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - Network accessline 5150
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - Network accessline 5155
}, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 5156
"funding": { "url": "https://github.com/fb55/entities?sponsor=1" } - Network accessline 5157
"url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 5160
"node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - Network accessline 5161
"version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - Network accessline 5162
"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - Network accessline 5167
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 5168
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 5169
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 5172
"node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - Network accessline 5173
"version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - Network accessline 5174
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - Network accessline 5181
"node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - Network accessline 5182
"version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - Network accessline 5183
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - Network accessline 5190
"node_modules/es-module-lexer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - Network accessline 5191
"version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - Network accessline 5192
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - Network accessline 5197
"node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - Network accessline 5198
"version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - Network accessline 5199
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - Network accessline 5209
"node_modules/es-toolkit": { "version": "1.46.1", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - Network accessline 5210
"version": "1.46.1", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", - Network accessline 5211
"resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", - Network accessline 5219
"node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - Network accessline 5220
"version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - Network accessline 5221
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - Network accessline 5225
"node_modules/esbuild": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - Network accessline 5226
"version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", - Network accessline 5227
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - Network accessline 5267
"node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 5268
"version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - Network accessline 5269
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 5277
"node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - Network accessline 5278
"version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - Network accessline 5279
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - Network accessline 5283
"node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - Network accessline 5284
"version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - Network accessline 5285
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - Network accessline 5292
"node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - Network accessline 5293
"version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - Network accessline 5294
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - Network accessline 5302
"node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - Network accessline 5303
"version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - Network accessline 5304
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - Network accessline 5311
"node_modules/events-universal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - Network accessline 5312
"version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - Network accessline 5313
"resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - Network accessline 5321
"node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - Network accessline 5322
"version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - Network accessline 5323
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - Network accessline 5333
"node_modules/eventsource-parser": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", - Network accessline 5334
"version": "3.0.8", "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", - Network accessline 5335
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz", - Network accessline 5342
"node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - Network accessline 5343
"version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - Network accessline 5344
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - Network accessline 5351
"node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - Network accessline 5352
"version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - Network accessline 5353
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - Network accessline 5361
"node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - Network accessline 5362
"version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - Network accessline 5363
"resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - Network accessline 5399
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 5400
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 5401
"url": "https://opencollective.com/express" - Network accessline 5404
"node_modules/express-rate-limit": { "version": "8.5.2", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - Network accessline 5405
"version": "8.5.2", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", - Network accessline 5406
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - Network accessline 5414
}, "funding": { "url": "https://github.com/sponsors/express-rate-limit" - Network accessline 5415
"funding": { "url": "https://github.com/sponsors/express-rate-limit" }, - Network accessline 5416
"url": "https://github.com/sponsors/express-rate-limit" - Network accessline 5422
"node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - Network accessline 5423
"version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - Network accessline 5424
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - Network accessline 5428
"node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - Network accessline 5429
"version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - Network accessline 5430
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - Network accessline 5434
"node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - Network accessline 5435
"version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - Network accessline 5436
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - Network accessline 5441
"node_modules/fast-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - Network accessline 5442
"version": "3.1.2", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - Network accessline 5443
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - Network accessline 5446
{ "type": "github", "url": "https://github.com/sponsors/fastify" - Network accessline 5447
"type": "github", "url": "https://github.com/sponsors/fastify" }, - Network accessline 5448
"url": "https://github.com/sponsors/fastify" - Network accessline 5450
{ "type": "opencollective", "url": "https://opencollective.com/fastify" - Network accessline 5451
"type": "opencollective", "url": "https://opencollective.com/fastify" } - Network accessline 5452
"url": "https://opencollective.com/fastify" - Network accessline 5457
"node_modules/fastembed": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fastembed/-/fastembed-3.0.0.tgz", - Network accessline 5458
"version": "3.0.0", "resolved": "https://registry.npmjs.org/fastembed/-/fastembed-3.0.0.tgz", "integrity": "sha512-Rq5OO2sjLDSoKSpbYiLmTDCEE5XDiVqAMc7loGbAnStmDvu+G4Y+vcU/Sm0cU0dqB0D1sbHiw4UJPA9M19nVJQ==", - Network accessline 5459
"resolved": "https://registry.npmjs.org/fastembed/-/fastembed-3.0.0.tgz", - Network accessline 5469
"node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 5470
"version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - Network accessline 5471
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 5487
"node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - Network accessline 5488
"version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - Network accessline 5489
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - Network accessline 5492
{ "type": "github", "url": "https://github.com/sponsors/jimmywarting" - Network accessline 5493
"type": "github", "url": "https://github.com/sponsors/jimmywarting" }, - Network accessline 5494
"url": "https://github.com/sponsors/jimmywarting" - Network accessline 5496
{ "type": "paypal", "url": "https://paypal.me/jimmywarting" - Network accessline 5497
"type": "paypal", "url": "https://paypal.me/jimmywarting" } - Network accessline 5498
"url": "https://paypal.me/jimmywarting" - Network accessline 5510
"node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - Network accessline 5511
"version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - Network accessline 5512
"resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - Network accessline 5520
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 5521
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 5522
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 5525
"node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - Network accessline 5526
"version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - Network accessline 5527
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - Network accessline 5531
"node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - Network accessline 5532
"version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - Network accessline 5533
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - Network accessline 5547
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 5548
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 5549
"url": "https://opencollective.com/express" - Network accessline 5552
"node_modules/fix-dts-default-cjs-exports": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - Network accessline 5553
"version": "1.0.1", "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVr - Network accessline 5554
"resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - Network accessline 5564
"node_modules/flatbuffers": { "version": "25.9.23", "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", - Network accessline 5565
"version": "25.9.23", "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", - Network accessline 5566
"resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", - Network accessline 5570
"node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - Network accessline 5571
"version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - Network accessline 5572
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - Network accessline 5582
"node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - Network accessline 5583
"version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - Network accessline 5584
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - Network accessline 5591
"node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - Network accessline 5592
"version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - Network accessline 5593
"resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - Network accessline 5600
"node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - Network accessline 5601
"version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - Network accessline 5602
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - Network accessline 5606
"node_modules/fs-extra": { "version": "11.3.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", - Network accessline 5607
"version": "11.3.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", - Network accessline 5608
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", - Network accessline 5621
"node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 5622
"version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - Network accessline 5623
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 5635
"node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - Network accessline 5636
"version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - Network accessline 5637
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - Network accessline 5639
"license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5640
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5641
"url": "https://github.com/sponsors/ljharb" - Network accessline 5644
"node_modules/gaxios": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", - Network accessline 5645
"version": "7.1.4", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==", - Network accessline 5646
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz", - Network accessline 5658
"node_modules/gcp-metadata": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - Network accessline 5659
"version": "8.1.2", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - Network accessline 5660
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - Network accessline 5672
"node_modules/gearhash-jit": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/gearhash-jit/-/gearhash-jit-1.0.2.tgz", - Network accessline 5673
"version": "1.0.2", "resolved": "https://registry.npmjs.org/gearhash-jit/-/gearhash-jit-1.0.2.tgz", "integrity": "sha512-UhzJL4KXSdqAKepy/tZwmi2Rcy0YMmtiC4DQS4SURCuIWdh8ECZtnXK2ePRMLigfB61hRKdLK/Vgg2bSw73izQ==", - Network accessline 5674
"resolved": "https://registry.npmjs.org/gearhash-jit/-/gearhash-jit-1.0.2.tgz", - Network accessline 5678
"node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - Network accessline 5679
"version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - Network accessline 5680
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - Network accessline 5688
"node_modules/get-east-asian-width": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - Network accessline 5689
"version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - Network accessline 5690
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - Network accessline 5695
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 5696
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 5697
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 5700
"node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - Network accessline 5701
"version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - Network accessline 5702
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - Network accessline 5719
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5720
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5721
"url": "https://github.com/sponsors/ljharb" - Network accessline 5724
"node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - Network accessline 5725
"version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - Network accessline 5726
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - Network accessline 5737
"node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - Network accessline 5738
"version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - Network accessline 5739
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - Network accessline 5743
"node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - Network accessline 5744
"version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - Network accessline 5745
"resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - Network accessline 5760
"node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - Network accessline 5761
"version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - Network accessline 5762
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - Network accessline 5771
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5772
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5773
"url": "https://github.com/sponsors/ljharb" - Network accessline 5776
"node_modules/google-auth-library": { "version": "10.6.2", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", - Network accessline 5777
"version": "10.6.2", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==", - Network accessline 5778
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz", - Network accessline 5793
"node_modules/google-logging-utils": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - Network accessline 5794
"version": "1.1.3", "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - Network accessline 5795
"resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - Network accessline 5802
"node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - Network accessline 5803
"version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - Network accessline 5804
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - Network accessline 5809
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5810
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5811
"url": "https://github.com/sponsors/ljharb" - Network accessline 5814
"node_modules/gpt-tokenizer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-3.4.0.tgz", - Network accessline 5815
"version": "3.4.0", "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-3.4.0.tgz", "integrity": "sha512-wxFLnhIXTDjYebd9A9pGl3e31ZpSypbpIJSOswbgop5jLte/AsZVDvjlbEuVFlsqZixVKqbcoNmRlFDf6pz/UQ==", - Network accessline 5816
"resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-3.4.0.tgz", - Network accessline 5820
"node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - Network accessline 5821
"version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - Network accessline 5822
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - Network accessline 5827
"node_modules/gradient-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", - Network accessline 5828
"version": "2.0.2", "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", "integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==", - Network accessline 5829
"resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", - Network accessline 5840
"node_modules/gradient-string/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - Network accessline 5841
"version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - Network accessline 5842
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - Network accessline 5850
}, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 5851
"funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - Network accessline 5852
"url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 5855
"node_modules/gradient-string/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - Network accessline 5856
"version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - Network accessline 5857
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - Network accessline 5866
}, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 5867
"funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } - Network accessline 5868
"url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 5871
"node_modules/gradient-string/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - Network accessline 5872
"version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - Network accessline 5873
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - Network accessline 5883
"node_modules/groq-sdk": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-1.2.0.tgz", - Network accessline 5884
"version": "1.2.0", "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-1.2.0.tgz", "integrity": "sha512-pMhSYXWcjiqvbOeKdv2zjci1BYjGdp04a40hnmQmJpKJyB6oa+gRndAqE128gwR0NLgYO+Wt1fIF46KNHcplsw==", - Network accessline 5885
"resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-1.2.0.tgz", - Network accessline 5892
"node_modules/guid-typescript": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - Network accessline 5893
"version": "1.0.9", "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - Network accessline 5894
"resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - Network accessline 5898
"node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - Network accessline 5899
"version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - Network accessline 5900
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - Network accessline 5907
"node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - Network accessline 5908
"version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJd - Network accessline 5909
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - Network accessline 5914
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5915
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5916
"url": "https://github.com/sponsors/ljharb" - Network accessline 5919
"node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - Network accessline 5920
"version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - Network accessline 5921
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - Network accessline 5926
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5927
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5928
"url": "https://github.com/sponsors/ljharb" - Network accessline 5931
"node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - Network accessline 5932
"version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - Network accessline 5933
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - Network accessline 5943
"node_modules/hono": { "version": "4.12.30", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz", - Network accessline 5944
"version": "4.12.30", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz", "integrity": "sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==", - Network accessline 5945
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.30.tgz", - Network accessline 5952
"node_modules/html-escaper": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - Network accessline 5953
"version": "3.0.3", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - Network accessline 5954
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - Network accessline 5958
"node_modules/htmlparser2": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - Network accessline 5959
"version": "10.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - Network accessline 5960
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - Network accessline 5961
"integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", - Network accessline 5962
"funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { - Network accessline 5963
"https://github.com/fb55/htmlparser2?sponsor=1", - Network accessline 5964
{ "type": "github", "url": "https://github.com/sponsors/fb55" - Network accessline 5965
"type": "github", "url": "https://github.com/sponsors/fb55" } - Network accessline 5966
"url": "https://github.com/sponsors/fb55" - Network accessline 5977
"node_modules/htmlparser2/node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - Network accessline 5978
"version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - Network accessline 5979
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - Network accessline 5984
}, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 5985
"funding": { "url": "https://github.com/fb55/entities?sponsor=1" } - Network accessline 5986
"url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 5989
"node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - Network accessline 5990
"version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - Network accessline 5991
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - Network accessline 6004
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 6005
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 6006
"url": "https://opencollective.com/express" - Network accessline 6009
"node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - Network accessline 6010
"version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - Network accessline 6011
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - Network accessline 6022
"node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - Network accessline 6023
"version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - Network accessline 6024
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - Network accessline 6033
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 6034
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 6035
"url": "https://opencollective.com/express" - Network accessline 6038
"node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - Network accessline 6039
"version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - Network accessline 6040
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - Network accessline 6043
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 6044
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 6045
"url": "https://github.com/sponsors/feross" - Network accessline 6047
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 6048
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 6049
"url": "https://www.patreon.com/feross" - Network accessline 6051
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 6052
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 6053
"url": "https://feross.org/support" - Network accessline 6058
"node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - Network accessline 6059
"version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - Network accessline 6060
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - Network accessline 6065
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6066
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6067
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6070
"node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - Network accessline 6071
"version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - Network accessline 6072
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - Network accessline 6076
"node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - Network accessline 6077
"version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - Network accessline 6078
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - Network accessline 6082
"node_modules/ink": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ink/-/ink-5.2.1.tgz", - Network accessline 6083
"version": "5.2.1", "resolved": "https://registry.npmjs.org/ink/-/ink-5.2.1.tgz", "integrity": "sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==", - Network accessline 6084
"resolved": "https://registry.npmjs.org/ink/-/ink-5.2.1.tgz", - Network accessline 6130
"node_modules/ink-big-text": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ink-big-text/-/ink-big-text-2.0.0.tgz", - Network accessline 6131
"version": "2.0.0", "resolved": "https://registry.npmjs.org/ink-big-text/-/ink-big-text-2.0.0.tgz", "integrity": "sha512-Juzqv+rIOLGuhMJiE50VtS6dg6olWfzFdL7wsU/EARSL5Eaa5JNXMogMBm9AkjgzO2Y3UwWCOh87jbhSn8aNdw==", - Network accessline 6132
"resolved": "https://registry.npmjs.org/ink-big-text/-/ink-big-text-2.0.0.tgz", - Network accessline 6141
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6142
"funding": { "url": "https://github.com/sponsors/sindresorhus" }, - Network accessline 6143
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6150
"node_modules/ink-gradient": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ink-gradient/-/ink-gradient-3.0.0.tgz", - Network accessline 6151
"version": "3.0.0", "resolved": "https://registry.npmjs.org/ink-gradient/-/ink-gradient-3.0.0.tgz", "integrity": "sha512-OVyPBovBxE1tFcBhSamb+P1puqDP6pG3xFe2W9NiLgwUZd9RbcjBeR7twLbliUT9navrUstEf1ZcPKKvx71BsQ==", - Network accessline 6152
"resolved": "https://registry.npmjs.org/ink-gradient/-/ink-gradient-3.0.0.tgz", - Network accessline 6163
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6164
"funding": { "url": "https://github.com/sponsors/sindresorhus" }, - Network accessline 6165
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6171
"node_modules/ink-testing-library": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ink-testing-library/-/ink-testing-library-4.0.0.tgz", - Network accessline 6172
"version": "4.0.0", "resolved": "https://registry.npmjs.org/ink-testing-library/-/ink-testing-library-4.0.0.tgz", "integrity": "sha512-yF92kj3pmBvk7oKbSq5vEALO//o7Z9Ck/OaLNlkzXNeYdwfpxMQkSowGTFUCS5MSu9bWfSZMewGpp7bFc66D7Q==", - Network accessline 6173
"resolved": "https://registry.npmjs.org/ink-testing-library/-/ink-testing-library-4.0.0.tgz", - Network accessline 6189
"node_modules/ink/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - Network accessline 6190
"version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - Network accessline 6191
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - Network accessline 6195
"node_modules/ink/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - Network accessline 6196
"version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - Network accessline 6197
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - Network accessline 6207
}, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 6208
"funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } - Network accessline 6209
"url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 6212
"node_modules/into-stream": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-9.1.0.tgz", - Network accessline 6213
"version": "9.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-9.1.0.tgz", "integrity": "sha512-DRsRnQrbzdFjaQ1oe4C6/EIUymIOEix1qROEJTF9dbMq+M4Zrm6VaLp6SD/B9IsiEjPZuBSnWWFN+udajugdWA==", - Network accessline 6214
"resolved": "https://registry.npmjs.org/into-stream/-/into-stream-9.1.0.tgz", - Network accessline 6220
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6221
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6222
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6225
"node_modules/ip-address": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - Network accessline 6226
"version": "10.2.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - Network accessline 6227
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - Network accessline 6234
"node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - Network accessline 6235
"version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - Network accessline 6236
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - Network accessline 6243
"node_modules/is-accessor-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.2.tgz", - Network accessline 6244
"version": "1.0.2", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.2.tgz", "integrity": "sha512-AIbwAcazqP3R65dGvqk1V+a+vE5Fg1yu/ZKMOiBWSUIXXiwQkYmXQcVa2O0nh0tSDKDFKxG2mY7dB1Sr4hEP1g= - Network accessline 6245
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.2.tgz", - Network accessline 6255
"node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - Network accessline 6256
"version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - Network accessline 6257
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - Network accessline 6261
"node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - Network accessline 6262
"version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - Network accessline 6263
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - Network accessline 6272
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6273
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6274
"url": "https://github.com/sponsors/ljharb" - Network accessline 6277
"node_modules/is-data-descriptor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", - Network accessline 6278
"version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", - Network accessline 6279
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", - Network accessline 6289
"node_modules/is-descriptor": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.4.tgz", - Network accessline 6290
"version": "1.0.4", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.4.tgz", "integrity": "sha512-bv5z95W0dDtLfKwDfkTNxaRxmISBD3eQBKJeVxv2AQ7MjuUnDNG7cIQqvFtMOUYhsILWHhMayWdoGqNqYYYjww==", - Network accessline 6291
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.4.tgz", - Network accessline 6302
"node_modules/is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - Network accessline 6303
"version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBow - Network accessline 6304
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - Network accessline 6309
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6310
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6311
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6314
"node_modules/is-in-ci": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", - Network accessline 6315
"version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", - Network accessline 6316
"resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", - Network accessline 6324
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6325
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6326
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6329
"node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - Network accessline 6330
"version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - Network accessline 6331
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - Network accessline 6336
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6337
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6338
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6341
"node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - Network accessline 6342
"version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - Network accessline 6343
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - Network accessline 6353
"node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - Network accessline 6354
"version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - Network accessline 6355
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - Network accessline 6359
"node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - Network accessline 6360
"version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - Network accessline 6361
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - Network accessline 6366
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6367
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6368
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6371
"node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - Network accessline 6372
"version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - Network accessline 6373
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - Network accessline 6378
"node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - Network accessline 6379
"version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - Network accessline 6380
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - Network accessline 6384
"node_modules/jose": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - Network accessline 6385
"version": "6.2.3", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", - Network accessline 6386
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - Network accessline 6388
"license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" - Network accessline 6389
"funding": { "url": "https://github.com/sponsors/panva" } - Network accessline 6390
"url": "https://github.com/sponsors/panva" - Network accessline 6393
"node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - Network accessline 6394
"version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - Network accessline 6395
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - Network accessline 6403
"node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - Network accessline 6404
"version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - Network accessline 6405
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - Network accessline 6409
"node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - Network accessline 6410
"version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - Network accessline 6411
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - Network accessline 6422
"node_modules/json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - Network accessline 6423
"version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - Network accessline 6424
"resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - Network accessline 6431
"node_modules/json-schema-to-ts": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - Network accessline 6432
"version": "3.1.1", "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", - Network accessline 6433
"resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - Network accessline 6444
"node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - Network accessline 6445
"version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - Network accessline 6446
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - Network accessline 6450
"node_modules/json-schema-typed": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - Network accessline 6451
"version": "8.0.2", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - Network accessline 6452
"resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - Network accessline 6456
"node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - Network accessline 6457
"version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - Network accessline 6458
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - Network accessline 6462
"node_modules/jsonfile": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - Network accessline 6463
"version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - Network accessline 6464
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - Network accessline 6475
"node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - Network accessline 6476
"version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - Network accessline 6477
"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - Network accessline 6486
"node_modules/jws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - Network accessline 6487
"version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - Network accessline 6488
"resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - Network accessline 6496
"node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - Network accessline 6497
"version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - Network accessline 6498
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - Network accessline 6508
"node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - Network accessline 6509
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - Network accessline 6510
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - Network accessline 6520
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6521
"type": "opencollective", "url": "https://opencollective.com/parcel" }, - Network accessline 6522
"url": "https://opencollective.com/parcel" - Network accessline 6538
"node_modules/lightningcss-android-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - Network accessline 6539
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgH - Network accessline 6540
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - Network accessline 6554
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6555
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6556
"url": "https://opencollective.com/parcel" - Network accessline 6559
"node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - Network accessline 6560
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc - Network accessline 6561
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - Network accessline 6575
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6576
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6577
"url": "https://opencollective.com/parcel" - Network accessline 6580
"node_modules/lightningcss-darwin-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - Network accessline 6581
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73 - Network accessline 6582
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - Network accessline 6596
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6597
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6598
"url": "https://opencollective.com/parcel" - Network accessline 6601
"node_modules/lightningcss-freebsd-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - Network accessline 6602
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK - Network accessline 6603
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - Network accessline 6617
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6618
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6619
"url": "https://opencollective.com/parcel" - Network accessline 6622
"node_modules/lightningcss-linux-arm-gnueabihf": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - Network accessline 6623
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsP - Network accessline 6624
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - Network accessline 6638
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6639
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6640
"url": "https://opencollective.com/parcel" - Network accessline 6643
"node_modules/lightningcss-linux-arm64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - Network accessline 6644
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbeb - Network accessline 6645
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - Network accessline 6659
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6660
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6661
"url": "https://opencollective.com/parcel" - Network accessline 6664
"node_modules/lightningcss-linux-arm64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - Network accessline 6665
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJ - Network accessline 6666
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - Network accessline 6680
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6681
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6682
"url": "https://opencollective.com/parcel" - Network accessline 6685
"node_modules/lightningcss-linux-x64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - Network accessline 6686
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI - Network accessline 6687
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - Network accessline 6701
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6702
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6703
"url": "https://opencollective.com/parcel" - Network accessline 6706
"node_modules/lightningcss-linux-x64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - Network accessline 6707
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j - Network accessline 6708
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - Network accessline 6722
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6723
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6724
"url": "https://opencollective.com/parcel" - Network accessline 6727
"node_modules/lightningcss-win32-arm64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - Network accessline 6728
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx - Network accessline 6729
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - Network accessline 6743
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6744
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6745
"url": "https://opencollective.com/parcel" - Network accessline 6748
"node_modules/lightningcss-win32-x64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - Network accessline 6749
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnj - Network accessline 6750
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - Network accessline 6764
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 6765
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 6766
"url": "https://opencollective.com/parcel" - Network accessline 6769
"node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 6770
"version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - Network accessline 6771
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 6777
}, "funding": { "url": "https://github.com/sponsors/antonk52" - Network accessline 6778
"funding": { "url": "https://github.com/sponsors/antonk52" } - Network accessline 6779
"url": "https://github.com/sponsors/antonk52" - Network accessline 6782
"node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - Network accessline 6783
"version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - Network accessline 6784
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - Network accessline 6789
"node_modules/linkedom": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.18.12.tgz", - Network accessline 6790
"version": "0.18.12", "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.18.12.tgz", "integrity": "sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==", - Network accessline 6791
"resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.18.12.tgz", - Network accessline 6813
"node_modules/load-tsconfig": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - Network accessline 6814
"version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - Network accessline 6815
"resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - Network accessline 6823
"node_modules/log-symbols": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - Network accessline 6824
"version": "7.0.1", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - Network accessline 6825
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - Network accessline 6834
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6835
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6836
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6839
"node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - Network accessline 6840
"version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - Network accessline 6841
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - Network accessline 6845
"node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - Network accessline 6846
"version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - Network accessline 6847
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - Network accessline 6857
"node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 6858
"version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - Network accessline 6859
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 6867
"node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - Network accessline 6868
"version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - Network accessline 6869
"resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - Network accessline 6879
"node_modules/matcher/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - Network accessline 6880
"version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - Network accessline 6881
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - Network accessline 6886
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6887
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6888
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6891
"node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - Network accessline 6892
"version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - Network accessline 6893
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - Network accessline 6900
"node_modules/mathml-to-latex": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/mathml-to-latex/-/mathml-to-latex-1.5.0.tgz", - Network accessline 6901
"version": "1.5.0", "resolved": "https://registry.npmjs.org/mathml-to-latex/-/mathml-to-latex-1.5.0.tgz", "integrity": "sha512-rrWn0eEvcEcdMM4xfHcSGIy+i01DX9byOdXTLWg+w1iJ6O6ohP5UXY1dVzNUZLhzfl3EGcRekWLhY7JT5Omaew==", - Network accessline 6902
"resolved": "https://registry.npmjs.org/mathml-to-latex/-/mathml-to-latex-1.5.0.tgz", - Network accessline 6910
"node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - Network accessline 6911
"version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - Network accessline 6912
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - Network accessline 6919
"node_modules/merge-descriptors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - Network accessline 6920
"version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - Network accessline 6921
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - Network accessline 6926
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6927
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6928
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6931
"node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - Network accessline 6932
"version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - Network accessline 6933
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - Network accessline 6940
"node_modules/mime-types": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - Network accessline 6941
"version": "3.0.2", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - Network accessline 6942
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - Network accessline 6951
"funding": { "type": "opencollective", "url": "https://opencollective.com/express" - Network accessline 6952
"type": "opencollective", "url": "https://opencollective.com/express" } - Network accessline 6953
"url": "https://opencollective.com/express" - Network accessline 6956
"node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - Network accessline 6957
"version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - Network accessline 6958
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - Network accessline 6965
"node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - Network accessline 6966
"version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - Network accessline 6967
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - Network accessline 6972
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6973
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6974
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6977
"node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - Network accessline 6978
"version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - Network accessline 6979
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - Network accessline 6984
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6985
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6986
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6989
"node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - Network accessline 6990
"version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - Network accessline 6991
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - Network accessline 6993
"license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6994
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6995
"url": "https://github.com/sponsors/ljharb" - Network accessline 6998
"node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - Network accessline 6999
"version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - Network accessline 7000
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - Network accessline 7004
"node_modules/mlly": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - Network accessline 7005
"version": "1.8.2", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - Network accessline 7006
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - Network accessline 7017
"node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 7018
"version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - Network accessline 7019
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 7023
"node_modules/multistream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - Network accessline 7024
"version": "4.1.0", "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - Network accessline 7025
"resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - Network accessline 7029
{ "type": "github", "url": "https://github.com/sponsors/feross" - Network accessline 7030
"type": "github", "url": "https://github.com/sponsors/feross" }, - Network accessline 7031
"url": "https://github.com/sponsors/feross" - Network accessline 7033
{ "type": "patreon", "url": "https://www.patreon.com/feross" - Network accessline 7034
"type": "patreon", "url": "https://www.patreon.com/feross" }, - Network accessline 7035
"url": "https://www.patreon.com/feross" - Network accessline 7037
{ "type": "consulting", "url": "https://feross.org/support" - Network accessline 7038
"type": "consulting", "url": "https://feross.org/support" } - Network accessline 7039
"url": "https://feross.org/support" - Network accessline 7048
"node_modules/mute-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - Network accessline 7049
"version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - Network accessline 7050
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - Network accessline 7057
"node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - Network accessline 7058
"version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - Network accessline 7059
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - Network accessline 7069
"node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - Network accessline 7070
"version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", - Network accessline 7071
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - Network accessline 7075
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 7076
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 7077
"url": "https://github.com/sponsors/ai" - Network accessline 7088
"node_modules/napi-build-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - Network accessline 7089
"version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - Network accessline 7090
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - Network accessline 7094
"node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - Network accessline 7095
"version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - Network accessline 7096
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - Network accessline 7103
"node_modules/node-abi": { "version": "3.92.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - Network accessline 7104
"version": "3.92.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", - Network accessline 7105
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - Network accessline 7115
"node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - Network accessline 7116
"version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - Network accessline 7117
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - Network accessline 7121
{ "type": "github", "url": "https://github.com/sponsors/jimmywarting" - Network accessline 7122
"type": "github", "url": "https://github.com/sponsors/jimmywarting" }, - Network accessline 7123
"url": "https://github.com/sponsors/jimmywarting" - Network accessline 7125
{ "type": "github", "url": "https://paypal.me/jimmywarting" - Network accessline 7126
"type": "github", "url": "https://paypal.me/jimmywarting" } - Network accessline 7127
"url": "https://paypal.me/jimmywarting" - Network accessline 7135
"node_modules/node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - Network accessline 7136
"version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - Network accessline 7137
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - Network accessline 7148
"funding": { "type": "opencollective", "url": "https://opencollective.com/node-fetch" - Network accessline 7149
"type": "opencollective", "url": "https://opencollective.com/node-fetch" } - Network accessline 7150
"url": "https://opencollective.com/node-fetch" - Network accessline 7153
"node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - Network accessline 7154
"version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - Network accessline 7155
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - Network accessline 7160
"node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - Network accessline 7161
"version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - Network accessline 7162
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - Network accessline 7167
}, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" - Network accessline 7168
"funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } - Network accessline 7169
"url": "https://github.com/fb55/nth-check?sponsor=1" - Network accessline 7172
"node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - Network accessline 7173
"version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - Network accessline 7174
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - Network accessline 7181
"node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - Network accessline 7182
"version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - Network accessline 7183
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - Network accessline 7188
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7189
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7190
"url": "https://github.com/sponsors/ljharb" - Network accessline 7193
"node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - Network accessline 7194
"version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - Network accessline 7195
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - Network accessline 7202
"node_modules/obug": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - Network accessline 7203
"version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - Network accessline 7204
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - Network accessline 7206
"dev": true, "funding": [ "https://github.com/sponsors/sxzz", - Network accessline 7207
"funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" - Network accessline 7208
"https://github.com/sponsors/sxzz", - Network accessline 7209
"https://opencollective.com/debug" - Network accessline 7213
"node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - Network accessline 7214
"version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - Network accessline 7215
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - Network accessline 7225
"node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - Network accessline 7226
"version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - Network accessline 7227
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - Network accessline 7234
"node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - Network accessline 7235
"version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - Network accessline 7236
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - Network accessline 7244
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 7245
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 7246
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 7249
"node_modules/onnxruntime-common": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", - Network accessline 7250
"version": "1.21.0", "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", - Network accessline 7251
"resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", - Network accessline 7255
"node_modules/onnxruntime-node": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", - Network accessline 7256
"version": "1.21.0", "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", - Network accessline 7257
"resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", - Network accessline 7272
"node_modules/onnxruntime-node/node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - Network accessline 7273
"version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - Network accessline 7274
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - Network accessline 7281
"node_modules/onnxruntime-node/node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - Network accessline 7282
"version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - Network accessline 7283
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - Network accessline 7290
"node_modules/onnxruntime-node/node_modules/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - Network accessline 7291
"version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - Network accessline 7292
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - Network accessline 7302
"node_modules/onnxruntime-node/node_modules/tar": { "version": "7.5.16", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - Network accessline 7303
"version": "7.5.16", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==", - Network accessline 7304
"resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", - Network accessline 7318
"node_modules/onnxruntime-node/node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - Network accessline 7319
"version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - Network accessline 7320
"resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - Network accessline 7327
"node_modules/onnxruntime-web": { "version": "1.22.0-dev.20250409-89f8206ba4", "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", - Network accessline 7328
"version": "1.22.0-dev.20250409-89f8206ba4", "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC - Network accessline 7329
"resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", - Network accessline 7341
"node_modules/onnxruntime-web/node_modules/onnxruntime-common": { "version": "1.22.0-dev.20250409-89f8206ba4", "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", - Network accessline 7342
"version": "1.22.0-dev.20250409-89f8206ba4", "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLue - Network accessline 7343
"resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", - Network accessline 7347
"node_modules/openai": { "version": "6.38.0", "resolved": "https://registry.npmjs.org/openai/-/openai-6.38.0.tgz", - Network accessline 7348
"version": "6.38.0", "resolved": "https://registry.npmjs.org/openai/-/openai-6.38.0.tgz", "integrity": "sha512-AoMplt2UalrpgUDMh3L09QWjNRlgJPipclQvA6sYAaeF6nHNBMgmikAZGmcYLn8on4d9sQY9Q8bOLfrBS7Lc8g==", - Network accessline 7349
"resolved": "https://registry.npmjs.org/openai/-/openai-6.38.0.tgz", - Network accessline 7368
"node_modules/ora": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.0.tgz", - Network accessline 7369
"version": "9.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.0.tgz", "integrity": "sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==", - Network accessline 7370
"resolved": "https://registry.npmjs.org/ora/-/ora-9.4.0.tgz", - Network accessline 7385
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 7386
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 7387
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 7390
"node_modules/ora/node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - Network accessline 7391
"version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - Network accessline 7392
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - Network accessline 7400
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 7401
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 7402
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 7405
"node_modules/ora/node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - Network accessline 7407
"resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
package.json
- Executable scriptline 1
Executable file - Network accessline 69
"license": "AGPL-3.0-only", "author": "Towhid Khan", "homepage": "https://wigolo.app", - Network accessline 70
"author": "Towhid Khan", "homepage": "https://wigolo.app", "repository": { - Network accessline 71
"homepage": "https://wigolo.app", - Network accessline 72
"repository": { "type": "git", "url": "https://github.com/KnockOutEZ/wigolo" - Network accessline 73
"type": "git", "url": "https://github.com/KnockOutEZ/wigolo" }, - Network accessline 74
"url": "https://github.com/KnockOutEZ/wigolo" - Network accessline 75
}, "bugs": { "url": "https://github.com/KnockOutEZ/wigolo/issues" - Network accessline 76
"bugs": { "url": "https://github.com/KnockOutEZ/wigolo/issues" }, - Network accessline 77
"url": "https://github.com/KnockOutEZ/wigolo/issues"
packages/wigolo-crewai/README.md
- Network accessline 3
CrewAI tools for [wigolo](https://github.com/KnockOutEZ/wigolo) — local-first web intelligence for your crews. Give agents web search, page fetch, multi-step - Network accessline 26
[Credential-related source omitted] - Network accessline 27
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted]
packages/wigolo-crewai/pyproject.toml
- Network accessline 40
[project.urls] Homepage = "https://github.com/KnockOutEZ/wigolo" - Network accessline 41
Homepage = "https://github.com/KnockOutEZ/wigolo" - Network accessline 42
Repository = "https://github.com/KnockOutEZ/wigolo/tree/main/packages/wigolo-crewai" - Network accessline 43
Issues = "https://github.com/KnockOutEZ/wigolo/issues"
packages/wigolo-crewai/tests/__init__.py
- Executable scriptline 1
Executable file
packages/wigolo-crewai/tests/conftest.py
- Executable scriptline 1
Executable file - Network accessline 32
client.search.return_value = { "results": [ {"title": "Test", "url": "https://example.com", "relevance_score": 0.9} - Network accessline 33
"results": [ {"title": "Test", "url": "https://example.com", "relevance_score": 0.9} ], - Network accessline 34
{"title": "Test", "url": "https://example.com", "relevance_score": 0.9} - Network accessline 39
} client.fetch.return_value = { "url": "https://example.com", - Network accessline 40
client.fetch.return_value = { "url": "https://example.com", "title": "Example", - Network accessline 41
"url": "https://example.com", - Network accessline 48
} client.crawl.return_value = { "pages": [{"url": "https://example.com/a", "title": "A"}], - Network accessline 49
client.crawl.return_value = { "pages": [{"url": "https://example.com/a", "title": "A"}], "count": 1, - Network accessline 50
"pages": [{"url": "https://example.com/a", "title": "A"}], - Network accessline 52
} client.extract.return_value = { "url": "https://example.com", - Network accessline 53
client.extract.return_value = { "url": "https://example.com", "tables": [{"rows": [["x", "y"]]}], - Network accessline 54
"url": "https://example.com",
packages/wigolo-crewai/tests/test_core.py
- Executable scriptline 1
Executable file - Network accessline 32
parsed = json.loads(out) assert parsed["query"] == "test" assert parsed["results"][0]["url"] == "https://example.com" - Network accessline 34
assert parsed["results"][0]["url"] == "https://example.com" - Network accessline 45
def test_run_fetch_maps_args(mock_client): out = _core.run_fetch( mock_client, "https://example.com", render_js=True, section="Install" - Network accessline 46
out = _core.run_fetch( mock_client, "https://example.com", render_js=True, section="Install" ) - Network accessline 47
mock_client, "https://example.com", render_js=True, section="Install" ) _, kwargs = mock_client.fetch.call_args - Network accessline 48
) _, kwargs = mock_client.fetch.call_args assert kwargs["url"] == "https://example.com" - Network accessline 49
_, kwargs = mock_client.fetch.call_args assert kwargs["url"] == "https://example.com" assert kwargs["render_js"] is True - Network accessline 50
assert kwargs["url"] == "https://example.com" - Network accessline 67
def test_run_crawl_maps_args(mock_client): out = _core.run_crawl( mock_client, "https://docs.site", strategy="sitemap", max_pages=50 - Network accessline 68
out = _core.run_crawl( mock_client, "https://docs.site", strategy="sitemap", max_pages=50 ) - Network accessline 69
mock_client, "https://docs.site", strategy="sitemap", max_pages=50 - Network accessline 70
) _, kwargs = mock_client.crawl.call_args assert kwargs["url"] == "https://docs.site" - Network accessline 71
_, kwargs = mock_client.crawl.call_args assert kwargs["url"] == "https://docs.site" assert kwargs["strategy"] == "sitemap" - Network accessline 72
assert kwargs["url"] == "https://docs.site" - Network accessline 78
def test_run_extract_maps_args(mock_client): out = _core.run_extract( mock_client, "https://example.com", mode="tables" - Network accessline 79
out = _core.run_extract( mock_client, "https://example.com", mode="tables" ) - Network accessline 80
mock_client, "https://example.com", mode="tables" - Network accessline 81
) _, kwargs = mock_client.extract.call_args assert kwargs["url"] == "https://example.com" - Network accessline 82
_, kwargs = mock_client.extract.call_args assert kwargs["url"] == "https://example.com" assert kwargs["mode"] == "tables" - Network accessline 83
assert kwargs["url"] == "https://example.com" - Network accessline 93
[ (_core.run_search, "search", ("q",)), (_core.run_fetch, "fetch", ("https://x",)), - Network accessline 94
(_core.run_search, "search", ("q",)), (_core.run_fetch, "fetch", ("https://x",)), (_core.run_research, "research", ("q",)), - Network accessline 95
(_core.run_fetch, "fetch", ("https://x",)), - Network accessline 96
(_core.run_research, "research", ("q",)), (_core.run_crawl, "crawl", ("https://x",)), (_core.run_extract, "extract", ("https://x",)), - Network accessline 97
(_core.run_crawl, "crawl", ("https://x",)), - Network accessline 98
(_core.run_extract, "extract", ("https://x",)), - Network accessline 121
[Credential-related source omitted] - Network accessline 122
[Credential-related source omitted] - Network accessline 123
[Credential-related source omitted] - Network accessline 124
"base_url": "http://127.0.0.1:9999",
packages/wigolo-crewai/tests/test_tools.py
- Executable scriptline 1
Executable file - Network accessline 53
def test_fetch_tool_delegates_to_core(mock_client): tool = tools.WigoloFetchTool(client=mock_client) tool._run(url="https://example.com", render_js=True) - Network accessline 54
tool = tools.WigoloFetchTool(client=mock_client) tool._run(url="https://example.com", render_js=True) _, kwargs = mock_client.fetch.call_args - Network accessline 55
tool._run(url="https://example.com", render_js=True) _, kwargs = mock_client.fetch.call_args assert kwargs["url"] == "https://example.com" - Network accessline 56
_, kwargs = mock_client.fetch.call_args assert kwargs["url"] == "https://example.com" assert kwargs["render_js"] is True - Network accessline 57
assert kwargs["url"] == "https://example.com"
packages/wigolo-crewai/wigolo_crewai/__init__.py
- Executable scriptline 1
Executable file
packages/wigolo-crewai/wigolo_crewai/_core.py
packages/wigolo-crewai/wigolo_crewai/tools.py
- Executable scriptline 1
Executable file
packages/wigolo-crewai/wigolo_crewai/types.py
- Executable scriptline 1
Executable file
packages/wigolo-langchain/README.md
- Network accessline 3
LangChain integration for [wigolo](https://github.com/KnockOutEZ/wigolo) — a local-first web search MCP server for AI coding agents.
packages/wigolo-langchain/pyproject.toml
- Network accessline 37
[project.urls] Homepage = "https://github.com/KnockOutEZ/wigolo" - Network accessline 38
Homepage = "https://github.com/KnockOutEZ/wigolo" - Network accessline 39
Repository = "https://github.com/KnockOutEZ/wigolo/tree/main/packages/wigolo-langchain" - Network accessline 40
Issues = "https://github.com/KnockOutEZ/wigolo/issues"
packages/wigolo-langchain/tests/__init__.py
- Executable scriptline 1
Executable file
packages/wigolo-langchain/tests/conftest.py
- Executable scriptline 1
Executable file - Network accessline 51
{ "title": "Test Result", "url": "https://example.com", - Network accessline 52
"title": "Test Result", "url": "https://example.com", "snippet": "A test snippet", - Network accessline 53
"url": "https://example.com", - Network accessline 77
"text": json.dumps( { "url": "https://example.com", - Network accessline 78
{ "url": "https://example.com", "title": "Example Page", - Network accessline 79
"url": "https://example.com", - Network accessline 81
"markdown": "# Example\nPage content here.", "metadata": {"description": "An example page"}, "links": ["https://example.com/page2"], - Network accessline 82
"metadata": {"description": "An example page"}, "links": ["https://example.com/page2"], "images": [], - Network accessline 83
"links": ["https://example.com/page2"],
packages/wigolo-langchain/tests/test_client.py
- Executable scriptline 1
Executable file - Network accessline 114
client = WigoloMcpClient() await client.connect() result = await client.call_tool("fetch", {"url": "https://example.com"}) - Network accessline 115
await client.connect() result = await client.call_tool("fetch", {"url": "https://example.com"}) assert result["title"] == "Example Page" - Network accessline 116
result = await client.call_tool("fetch", {"url": "https://example.com"})
packages/wigolo-langchain/tests/test_retrievers.py
- Executable scriptline 1
Executable file - Network accessline 15
def _make_search_result( title: str = "Test", url: str = "https://example.com", - Network accessline 16
title: str = "Test", url: str = "https://example.com", snippet: str = "A snippet", - Network accessline 17
url: str = "https://example.com", - Network accessline 101
async def test_document_metadata_includes_url_title_score(self): result = _make_search_result( title="My Title", url="https://example.com/page", relevance_score=0.85 - Network accessline 102
result = _make_search_result( title="My Title", url="https://example.com/page", relevance_score=0.85 ) - Network accessline 103
title="My Title", url="https://example.com/page", relevance_score=0.85 - Network accessline 111
assert docs[0].metadata["title"] == "My Title" assert docs[0].metadata["url"] == "https://example.com/page" - Network accessline 112
assert docs[0].metadata["url"] == "https://example.com/page" - Network accessline 160
async def test_multiple_results_all_converted(self): results = [ _make_search_result(title=f"Result {i}", url=f"https://example.com/{i}") - Network accessline 161
results = [ _make_search_result(title=f"Result {i}", url=f"https://example.com/{i}") for i in range(5) - Network accessline 162
_make_search_result(title=f"Result {i}", url=f"https://example.com/{i}")
packages/wigolo-langchain/tests/test_tools.py
- Executable scriptline 1
Executable file - Network accessline 18
{ "title": f"Result {i}", "url": f"https://example.com/{i}", - Network accessline 19
"title": f"Result {i}", "url": f"https://example.com/{i}", "snippet": f"Snippet {i}", - Network accessline 20
"url": f"https://example.com/{i}", - Network accessline 33
def _make_fetch_output(url: str = "https://example.com") -> dict: - Network accessline 37
"markdown": "# Example\nFull page content.", "metadata": {"description": "An example"}, "links": ["https://example.com/other"], - Network accessline 38
"metadata": {"description": "An example"}, "links": ["https://example.com/other"], "images": [], - Network accessline 39
"links": ["https://example.com/other"], - Network accessline 158
tool = WigoloFetchTool(client=mock_client) result = await tool.ainvoke({"url": "https://example.com"}) - Network accessline 159
result = await tool.ainvoke({"url": "https://example.com"}) - Network accessline 170
tool = WigoloFetchTool(client=mock_client) await tool.ainvoke({"url": "https://example.com", "section": "API"}) - Network accessline 171
await tool.ainvoke({"url": "https://example.com", "section": "API"}) - Network accessline 182
tool = WigoloFetchTool(client=mock_client) await tool.ainvoke({"url": "https://example.com", "render_js": "always"}) - Network accessline 183
await tool.ainvoke({"url": "https://example.com", "render_js": "always"}) - Network accessline 193
tool = WigoloFetchTool(client=mock_client) result = await tool.ainvoke({"url": "https://example.com"}) - Network accessline 194
result = await tool.ainvoke({"url": "https://example.com"}) - Network accessline 202
mock_client = AsyncMock(spec=WigoloMcpClient) mock_client.call_tool = AsyncMock( return_value={"error": "404 Not Found", "url": "https://example.com", "title": "", "markdown": "", "metadata": {}, "links": [], "images": [ - Network accessline 203
mock_client.call_tool = AsyncMock( return_value={"error": "404 Not Found", "url": "https://example.com", "title": "", "markdown": "", "metadata": {}, "links": [], "images": [], "cached": False} ) - Network accessline 204
return_value={"error": "404 Not Found", "url": "https://example.com", "title": "", "markdown": "", "metadata": {}, "links": [], "images": [], "cached": False} - Network accessline 207
tool = WigoloFetchTool(client=mock_client) result = await tool.ainvoke({"url": "https://example.com"}) - Network accessline 208
result = await tool.ainvoke({"url": "https://example.com"}) - Network accessline 218
tool = WigoloFetchTool(client=mock_client) await tool.ainvoke({"url": "https://internal.com", "use_auth": True}) - Network accessline 219
await tool.ainvoke({"url": "https://internal.com", "use_auth": True})
packages/wigolo-langchain/wigolo_langchain/__init__.py
- Executable scriptline 1
Executable file
packages/wigolo-langchain/wigolo_langchain/client.py
- Executable scriptline 1
Executable file
packages/wigolo-langchain/wigolo_langchain/retrievers.py
- Executable scriptline 1
Executable file
packages/wigolo-langchain/wigolo_langchain/tools.py
- Executable scriptline 1
Executable file
packages/wigolo-langchain/wigolo_langchain/types.py
- Executable scriptline 1
Executable file
packages/wigolo-llamaindex/README.md
- Network accessline 3
LlamaIndex reader for [wigolo](https://github.com/KnockOutEZ/wigolo) — a local-first web search MCP server for AI coding agents. - Network accessline 26
reader = WigoloWebReader(client=client) docs = await reader.aload_data(urls=[ "https://docs.python.org/3/library/asyncio.html", - Network accessline 27
docs = await reader.aload_data(urls=[ "https://docs.python.org/3/library/asyncio.html", "https://docs.python.org/3/library/typing.html", - Network accessline 28
"https://docs.python.org/3/library/asyncio.html", - Network accessline 29
"https://docs.python.org/3/library/typing.html", - Network accessline 58
reader = WigoloWebReader(client=client) docs = await reader.aload_data(urls=[ "https://react.dev/learn", - Network accessline 59
docs = await reader.aload_data(urls=[ "https://react.dev/learn", "https://react.dev/reference/react", - Network accessline 60
"https://react.dev/learn", - Network accessline 61
"https://react.dev/reference/react", - Network accessline 70
reader = WigoloWebReader(client=client, section="API Reference") docs = await reader.aload_data(urls=["https://docs.example.com/api"]) - Network accessline 71
docs = await reader.aload_data(urls=["https://docs.example.com/api"])
packages/wigolo-llamaindex/pyproject.toml
- Network accessline 37
[project.urls] Homepage = "https://github.com/KnockOutEZ/wigolo" - Network accessline 38
Homepage = "https://github.com/KnockOutEZ/wigolo" - Network accessline 39
Repository = "https://github.com/KnockOutEZ/wigolo/tree/main/packages/wigolo-llamaindex" - Network accessline 40
Issues = "https://github.com/KnockOutEZ/wigolo/issues"
packages/wigolo-llamaindex/tests/__init__.py
- Executable scriptline 1
Executable file
packages/wigolo-llamaindex/tests/conftest.py
- Executable scriptline 1
Executable file - Network accessline 29
"text": json.dumps( { "url": "https://example.com", - Network accessline 30
{ "url": "https://example.com", "title": "Example Page", - Network accessline 31
"url": "https://example.com", - Network accessline 33
"markdown": "# Example\nThis is example content with useful information.", "metadata": {"description": "An example page", "author": "Test Author"}, "links": ["https://example.com/page2"], - Network accessline 34
"metadata": {"description": "An example page", "author": "Test Author"}, "links": ["https://example.com/page2"], "images": ["https://example.com/img.png"], - Network accessline 35
"links": ["https://example.com/page2"], - Network accessline 36
"images": ["https://example.com/img.png"], - Network accessline 56
{ "title": "Search Result 1", "url": "https://example.com/result1", - Network accessline 57
"title": "Search Result 1", "url": "https://example.com/result1", "snippet": "First result snippet", - Network accessline 58
"url": "https://example.com/result1", - Network accessline 63
{ "title": "Search Result 2", "url": "https://example.com/result2", - Network accessline 64
"title": "Search Result 2", "url": "https://example.com/result2", "snippet": "Second result snippet", - Network accessline 65
"url": "https://example.com/result2", - Network accessline 89
"text": json.dumps( { "url": "https://bad.example.com", - Network accessline 90
{ "url": "https://bad.example.com", "title": "", - Network accessline 91
"url": "https://bad.example.com",
packages/wigolo-llamaindex/tests/test_client.py
- Executable scriptline 1
Executable file - Network accessline 101
client = WigoloMcpClient() await client.connect() result = await client.call_tool("fetch", {"url": "https://example.com"}) - Network accessline 102
await client.connect() result = await client.call_tool("fetch", {"url": "https://example.com"}) assert result["title"] == "Example Page" - Network accessline 103
result = await client.call_tool("fetch", {"url": "https://example.com"}) - Network accessline 120
client = WigoloMcpClient() with pytest.raises(WigoloClientError, match="not connected"): await client.call_tool("fetch", {"url": "https://example.com"}) - Network accessline 122
await client.call_tool("fetch", {"url": "https://example.com"}) - Network accessline 132
client = WigoloMcpClient() await client.connect() await client.call_tool("fetch", {"url": "https://a.com"}) - Network accessline 133
await client.connect() await client.call_tool("fetch", {"url": "https://a.com"}) await client.call_tool("fetch", {"url": "https://b.com"}) - Network accessline 134
await client.call_tool("fetch", {"url": "https://a.com"}) - Network accessline 135
await client.call_tool("fetch", {"url": "https://b.com"})
packages/wigolo-llamaindex/tests/test_reader.py
- Executable scriptline 1
Executable file - Network accessline 16
def _make_fetch_result( url: str = "https://example.com", - Network accessline 17
url: str = "https://example.com", - Network accessline 25
"markdown": markdown, "metadata": {"description": "A page", "author": "Author"}, "links": ["https://example.com/other"], - Network accessline 26
"metadata": {"description": "A page", "author": "Author"}, "links": ["https://example.com/other"], "images": [], - Network accessline 27
"links": ["https://example.com/other"], - Network accessline 37
{ "title": f"Result {i}", "url": f"https://example.com/r{i}", - Network accessline 38
"title": f"Result {i}", "url": f"https://example.com/r{i}", "snippet": f"Snippet for result {i}", - Network accessline 39
"url": f"https://example.com/r{i}", - Network accessline 76
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 77
docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 89
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 90
docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 96
mock_client = AsyncMock(spec=WigoloMcpClient) mock_client.call_tool = AsyncMock( return_value=_make_fetch_result(url="https://test.com", title="Test Page") - Network accessline 97
mock_client.call_tool = AsyncMock( return_value=_make_fetch_result(url="https://test.com", title="Test Page") ) - Network accessline 98
return_value=_make_fetch_result(url="https://test.com", title="Test Page") - Network accessline 101
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=["https://test.com"]) - Network accessline 102
docs = await reader.aload_data(urls=["https://test.com"]) - Network accessline 104
assert docs[0].metadata["url"] == "https://test.com" - Network accessline 110
mock_client = AsyncMock(spec=WigoloMcpClient) results = [ _make_fetch_result(url=f"https://example.com/{i}", title=f"Page {i}") - Network accessline 111
results = [ _make_fetch_result(url=f"https://example.com/{i}", title=f"Page {i}") for i in range(3) - Network accessline 112
_make_fetch_result(url=f"https://example.com/{i}", title=f"Page {i}") - Network accessline 117
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=[f"https://example.com/{i}" for i in range(3)]) - Network accessline 118
docs = await reader.aload_data(urls=[f"https://example.com/{i}" for i in range(3)]) - Network accessline 126
mock_client = AsyncMock(spec=WigoloMcpClient) mock_client.call_tool = AsyncMock(side_effect=[ _make_fetch_result(url="https://good.com", markdown="Good content"), - Network accessline 127
mock_client.call_tool = AsyncMock(side_effect=[ _make_fetch_result(url="https://good.com", markdown="Good content"), _make_fetch_result(url="https://bad.com", markdown="", error="Connection refused"), - Network accessline 128
_make_fetch_result(url="https://good.com", markdown="Good content"), - Network accessline 129
_make_fetch_result(url="https://bad.com", markdown="", error="Connection refused"), - Network accessline 130
_make_fetch_result(url="https://also-good.com", markdown="More content"), - Network accessline 133
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=[ "https://good.com", "https://bad.com", "https://also-good.com" - Network accessline 134
docs = await reader.aload_data(urls=[ "https://good.com", "https://bad.com", "https://also-good.com" ]) - Network accessline 135
"https://good.com", "https://bad.com", "https://also-good.com" - Network accessline 138
assert len(docs) == 2 assert docs[0].metadata["url"] == "https://good.com" - Network accessline 139
assert docs[0].metadata["url"] == "https://good.com" - Network accessline 140
assert docs[1].metadata["url"] == "https://also-good.com" - Network accessline 149
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=["https://empty.com"]) - Network accessline 150
docs = await reader.aload_data(urls=["https://empty.com"]) - Network accessline 159
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 160
docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 178
reader = WigoloWebReader(client=mock_client, section="API Reference") await reader.aload_data(urls=["https://docs.example.com"]) - Network accessline 179
await reader.aload_data(urls=["https://docs.example.com"]) - Network accessline 189
reader = WigoloWebReader(client=mock_client, render_js="always") await reader.aload_data(urls=["https://spa.example.com"]) - Network accessline 190
await reader.aload_data(urls=["https://spa.example.com"]) - Network accessline 202
reader = WigoloWebReader(client=mock_client) docs = await reader.aload_data(urls=["https://example.com"]) - Network accessline 203
docs = await reader.aload_data(urls=["https://example.com"])
packages/wigolo-llamaindex/wigolo_llamaindex/__init__.py
- Executable scriptline 1
Executable file
packages/wigolo-llamaindex/wigolo_llamaindex/client.py
- Executable scriptline 1
Executable file
packages/wigolo-llamaindex/wigolo_llamaindex/reader.py
- Executable scriptline 1
Executable file
packages/wigolo-llamaindex/wigolo_llamaindex/types.py
- Executable scriptline 1
Executable file
packages/wigolo-vercel-ai-sdk/README.md
- Network accessline 3
Vercel AI SDK tools for [wigolo](https://github.com/KnockOutEZ/wigolo) — a local-first web search MCP server for AI coding agents.
packages/wigolo-vercel-ai-sdk/package-lock.json
- Network accessline 174
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 175
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 176
"url": "https://opencollective.com/vitest" - Network accessline 187
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 188
"funding": { "url": "https://opencollective.com/vitest" }, - Network accessline 189
"url": "https://opencollective.com/vitest" - Network accessline 210
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 211
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 212
"url": "https://opencollective.com/vitest" - Network accessline 223
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 224
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 225
"url": "https://opencollective.com/vitest" - Network accessline 236
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 237
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 238
"url": "https://opencollective.com/vitest" - Network accessline 247
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 248
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 249
"url": "https://opencollective.com/vitest" - Network accessline 260
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 261
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 262
"url": "https://opencollective.com/vitest" - Network accessline 327
}, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 328
"funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } - Network accessline 329
"url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 502
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 503
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 504
"url": "https://github.com/sponsors/ai" - Network accessline 539
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 540
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 541
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 548
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 549
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 550
"url": "https://opencollective.com/postcss/" - Network accessline 552
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 553
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, - Network accessline 554
"url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 556
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 557
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 558
"url": "https://github.com/sponsors/ai" - Network accessline 657
}, "funding": { "url": "https://github.com/sponsors/antfu" - Network accessline 658
"funding": { "url": "https://github.com/sponsors/antfu" } - Network accessline 659
"url": "https://github.com/sponsors/antfu" - Network accessline 680
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 681
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 682
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 705
}, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 706
"funding": { "url": "https://github.com/sponsors/SuperchupuDev" } - Network accessline 707
"url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 776
}, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" - Network accessline 777
"funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, - Network accessline 778
"url": "https://github.com/vitejs/vite?sponsor=1" - Network accessline 848
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 849
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 850
"url": "https://opencollective.com/vitest" - Network accessline 887
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 888
"funding": { "url": "https://opencollective.com/vitest" }, - Network accessline 889
"url": "https://opencollective.com/vitest" - Network accessline 942
"license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" - Network accessline 943
"funding": { "url": "https://github.com/sponsors/colinhacks" } - Network accessline 944
"url": "https://github.com/sponsors/colinhacks"
packages/wigolo-vercel-ai-sdk/package.json
- Executable scriptline 1
Executable file - Network accessline 34
"repository": { "type": "git", "url": "https://github.com/KnockOutEZ/wigolo", - Network accessline 35
"type": "git", "url": "https://github.com/KnockOutEZ/wigolo", "directory": "packages/wigolo-vercel-ai-sdk" - Network accessline 36
"url": "https://github.com/KnockOutEZ/wigolo",
packages/wigolo-vercel-ai-sdk/src/client.ts
- Executable scriptline 1
Executable file
packages/wigolo-vercel-ai-sdk/src/index.ts
- Executable scriptline 1
Executable file
packages/wigolo-vercel-ai-sdk/src/tools.ts
- Executable scriptline 1
Executable file
packages/wigolo-vercel-ai-sdk/src/types.ts
- Executable scriptline 1
Executable file
packages/wigolo-vercel-ai-sdk/tests/client.test.ts
- Executable scriptline 1
Executable file - Network accessline 25
{ title: 'Test Result', url: 'https://example.com', - Network accessline 26
title: 'Test Result', url: 'https://example.com', snippet: 'A test snippet', - Network accessline 27
url: 'https://example.com', - Network accessline 47
type: 'text', text: JSON.stringify({ url: 'https://example.com', - Network accessline 48
text: JSON.stringify({ url: 'https://example.com', title: 'Example Page', - Network accessline 49
url: 'https://example.com', - Network accessline 270
const result = await client.callTool('fetch', { url: 'https://example.com' });
packages/wigolo-vercel-ai-sdk/tests/tools.test.ts
- Executable scriptline 1
Executable file - Network accessline 34
it('execute calls client.callTool with search', async () => { const mockResponse = { results: [{ title: 'Test', url: 'https://example.com', snippet: 'snip', relevance_score: 0.9 }], - Network accessline 35
const mockResponse = { results: [{ title: 'Test', url: 'https://example.com', snippet: 'snip', relevance_score: 0.9 }], query: 'test', - Network accessline 36
results: [{ title: 'Test', url: 'https://example.com', snippet: 'snip', relevance_score: 0.9 }], - Network accessline 68
it('execute calls client.callTool with fetch', async () => { const mockResponse = { url: 'https://example.com', - Network accessline 69
const mockResponse = { url: 'https://example.com', title: 'Example', - Network accessline 70
url: 'https://example.com', - Network accessline 81
const result = await tool.execute!({ url: 'https://example.com' }, { toolCallId: '1', messages: [], abortSignal: new AbortController().signal }); expect(client.callTool).toHaveBeenCalledWith('fetch', expect.objectContaining({ url: 'http - Network accessline 82
expect(client.callTool).toHaveBeenCalledWith('fetch', expect.objectContaining({ url: 'https://example.com' })); - Network accessline 90
await tool.execute!({ url: 'https://example.com', section: 'API' }, { toolCallId: '1', messages: [], abortSignal: new AbortController().signal }); expect(client.callTool).toHaveBeenCalledWith('fetch', expect.objectContaining({ section: - Network accessline 98
const tool = createWebFetchTool(client); const result = await tool.execute!({ url: 'https://example.com' }, { toolCallId: '1', messages: [], abortSignal: new AbortController().signal }); - Network accessline 99
const result = await tool.execute!({ url: 'https://example.com' }, { toolCallId: '1', messages: [], abortSignal: new AbortController().signal }); - Network accessline 115
await tool.execute!({ url: 'https://example.com', strategy: 'sitemap', max_pages: 10 }, { toolCallId: '1', messages: [], abortSignal: new AbortController().signal }); - Network accessline 116
expect(client.callTool).toHaveBeenCalledWith('crawl', expect.objectContaining({ url: 'https://example.com', strategy: 'sitemap', - Network accessline 117
url: 'https://example.com', - Network accessline 135
await tool.execute!({ url: 'https://example.com', max_results: 5 }, { toolCallId: '1', messages: [], abortSignal: new AbortController().signal }); - Network accessline 136
expect(client.callTool).toHaveBeenCalledWith('find_similar', expect.objectContaining({ url: 'https://example.com' }));
packages/wigolo-vercel-ai-sdk/vitest.config.ts
- Executable scriptline 1
Executable file
packaging/RELEASE-RUNBOOK.md
- Network accessline 40
1. Set `url` to the published tarball: `https://registry.npmjs.org/wigolo/-/wigolo-<version>.tgz` 2. Fetch the real digest and replace the `PLACEHOLDER_REFRESHED_AT_RELEASE` - Network accessline 41
`https://registry.npmjs.org/wigolo/-/wigolo-<version>.tgz` 2. Fetch the real digest and replace the `PLACEHOLDER_REFRESHED_AT_RELEASE` sha256: - Network accessline 42
2. Fetch the real digest and replace the `PLACEHOLDER_REFRESHED_AT_RELEASE` sha256: `curl -sL <tarball-url> | shasum -a 256` - Network accessline 43
sha256: `curl -sL <tarball-url> | shasum -a 256` 3. `depends_on "node@22"` stays pinned — do not float it (see the formula - Network accessline 44
`curl -sL <tarball-url> | shasum -a 256`
packaging/binary/bundle.mjs
- Executable scriptline 1
#!/usr/bin/env node
packaging/binary/pack.sh
packaging/binary/pkg.config.json
- Access to secretsline 24
[Credential-related source omitted]
packaging/binary/react-devtools-core-stub.mjs
- Executable scriptline 1
Executable file
packaging/compose.serve.yml
- Network accessline 10
# The named volume persists the local cache, on-device models, the browser # engine binary, and encrypted keys across restarts. Point MCP clients at # http://localhost:3333/mcp (StreamableHTTP) or /sse. - Network accessline 11
# engine binary, and encrypted keys across restarts. Point MCP clients at # http://localhost:3333/mcp (StreamableHTTP) or /sse. # - Network accessline 12
# http://localhost:3333/mcp (StreamableHTTP) or /sse. - Access to secretsline 36
[Credential-related source omitted] - Network accessline 50
# The daemon serves /health over HTTP; the stdio default command does not, # which is why no healthcheck is baked into the image itself. test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3333/health').then(r=>process.exit(r.o - Network accessline 51
# which is why no healthcheck is baked into the image itself. test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3333/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] interval: 30s - Network accessline 52
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3333/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
packaging/homebrew/wigolo.rb
- Executable scriptline 1
Executable file - Network accessline 12
class Wigolo < Formula desc "Local-first web intelligence for AI agents: search, fetch, crawl, extract" homepage "https://wigolo.com" - Network accessline 13
desc "Local-first web intelligence for AI agents: search, fetch, crawl, extract" homepage "https://wigolo.com" url "https://registry.npmjs.org/wigolo/-/wigolo-0.1.43-beta.2.tgz" - Network accessline 14
homepage "https://wigolo.com" - Network accessline 15
url "https://registry.npmjs.org/wigolo/-/wigolo-0.1.43-beta.2.tgz" - Network accessline 22
# versions on `brew livecheck`. # livecheck do # url "https://registry.npmjs.org/wigolo/latest" - Network accessline 23
# livecheck do # url "https://registry.npmjs.org/wigolo/latest" # regex(/"version":\s*"([^"]+)"/i) - Network accessline 24
# url "https://registry.npmjs.org/wigolo/latest"
packaging/install.sh
- Executable scriptline 1
#!/bin/sh - Network accessline 3
# # Usage: # curl -fsSL https://wigolo.dev/install.sh | sh - Network accessline 4
# Usage: # curl -fsSL https://wigolo.dev/install.sh | sh # sh install.sh --uninstall - Dangerous shell operationline 5
# curl -fsSL https://wigolo.dev/install.sh | sh - Network accessline 5
# curl -fsSL https://wigolo.dev/install.sh | sh - Network accessline 31
NODE_VERSION="v22.23.1" NODE_DIST_BASE="https://nodejs.org/dist" - Network accessline 32
NODE_DIST_BASE="https://nodejs.org/dist" - Network accessline 38
BIN_RELEASE_BASE="https://github.com/KnockOutEZ/wigolo/releases/latest/download" - Dangerous shell operationline 62
rm -rf "$TMP_DIR" - Network accessline 67
# --------------------------------------------------------------------------- # Download abstraction — curl or wget, HTTPS_PROXY honored automatically by - Network accessline 68
# Download abstraction — curl or wget, HTTPS_PROXY honored automatically by - Network accessline 71
DL_TOOL="" detect_downloader() { if command -v curl >/dev/null 2>&1; then - Network accessline 72
detect_downloader() { if command -v curl >/dev/null 2>&1; then DL_TOOL="curl" - Network accessline 73
if command -v curl >/dev/null 2>&1; then - Network accessline 74
DL_TOOL="curl" elif command -v wget >/dev/null 2>&1; then DL_TOOL="wget" - Network accessline 75
elif command -v wget >/dev/null 2>&1; then - Network accessline 76
DL_TOOL="wget" else die "neither curl nor wget found. Install one, or use the npm channel: - Network accessline 77
else die "neither curl nor wget found. Install one, or use the npm channel: npm install -g $PKG_NAME" - Network accessline 78
die "neither curl nor wget found. Install one, or use the npm channel: - Network accessline 85
url="$1" dest="$2" if [ "$DL_TOOL" = "curl" ]; then - Network accessline 86
dest="$2" if [ "$DL_TOOL" = "curl" ]; then curl -fSL --retry 3 -o "$dest" "$url" || die "download failed: $url" - Network accessline 87
if [ "$DL_TOOL" = "curl" ]; then - Network accessline 88
curl -fSL --retry 3 -o "$dest" "$url" || die "download failed: $url" - Network accessline 89
else wget -q -O "$dest" "$url" || die "download failed: $url" fi - Network accessline 90
wget -q -O "$dest" "$url" || die "download failed: $url" - Network accessline 207
node_pkg="node-$NODE_VERSION-$OS-$ARCH" tarball="$node_pkg.tar.gz" tar_url="$NODE_DIST_BASE/$NODE_VERSION/$tarball" - Network accessline 208
tarball="$node_pkg.tar.gz" tar_url="$NODE_DIST_BASE/$NODE_VERSION/$tarball" sums_url="$NODE_DIST_BASE/$NODE_VERSION/SHASUMS256.txt" - Network accessline 209
tar_url="$NODE_DIST_BASE/$NODE_VERSION/$tarball" - Network accessline 210
sums_url="$NODE_DIST_BASE/$NODE_VERSION/SHASUMS256.txt" - Network accessline 223
step "Downloading the bundled runtime ($node_pkg)" download "$tar_url" "$TMP_DIR/$tarball" - Network accessline 224
download "$tar_url" "$TMP_DIR/$tarball" - Network accessline 226
step "Verifying runtime checksum (fail-closed)" download "$sums_url" "$TMP_DIR/SHASUMS256.txt" - Network accessline 227
download "$sums_url" "$TMP_DIR/SHASUMS256.txt" - Dangerous shell operationline 234
rm -rf "$RUNTIME_DIR" - Network accessline 275
bin_name="wigolo-$OS-$ARCH" bin_url="$BIN_RELEASE_BASE/$bin_name" - Network accessline 276
bin_url="$BIN_RELEASE_BASE/$bin_name" - Network accessline 277
sums_url="$BIN_RELEASE_BASE/checksums.txt" - Network accessline 280
if [ "$DL_TOOL" = "curl" ]; then - Network accessline 281
curl -fsSL --retry 2 -o "$TMP_DIR/checksums.txt" "$sums_url" 2>/dev/null || return 1 - Network accessline 282
else wget -q -O "$TMP_DIR/checksums.txt" "$sums_url" 2>/dev/null || return 1 fi - Network accessline 283
wget -q -O "$TMP_DIR/checksums.txt" "$sums_url" 2>/dev/null || return 1 - Network accessline 288
step "Downloading prebuilt binary ($bin_name)" download "$bin_url" "$TMP_DIR/$bin_name" || return 1 - Network accessline 289
download "$bin_url" "$TMP_DIR/$bin_name" || return 1 - Dangerous shell operationline 325
rm -rf "$BIN_DIR" "$TOOL_DIR" "$RUNTIME_DIR" - Dangerous shell operationline 329
info "To wipe everything including data: rm -rf $PREFIX"
packaging/verification/docker.md
- Dangerous shell operationline 26
- `src/cli/warmup.ts` — `detectDepsStrategy` catches the sudo spawn ENOENT - Dangerous shell operationline 52
| `warmup:arm64:default` | PASS | lazy browser download + baked-libs launch as `node`, sudo absent | - Dangerous shell operationline 74
### First-run UX — lazy browser download as USER node, sudo absent (trimmed) - Dangerous shell operationline 103
`spawn_error=ENOENT` confirms sudo is truly absent and that a spawn surfaces - Network accessline 109
### JS-render fetch (organic, reuses warmed binary) - Network accessline 112
multi-browser pool initialized {"types":["chromium"],"strategy":"round-robin"} { "url": "https://react.dev", - Network accessline 113
{ "url": "https://react.dev", "title": "React", - Network accessline 114
"url": "https://react.dev",
packaging/verification/npm.md
- Dangerous shell operationline 35
`rm -rf` every temp dir.
packaging/verification/sh.md
- Dangerous shell operationline 1
# Channel verification — curl|sh installer (S-P1-SH) - Dangerous shell operationline 57
- **npm/source layout:** full cleanup is a single `rm -rf <dataDir>`. - Dangerous shell operationline 59
(`install.sh --uninstall`, or `rm -rf <bin> <tool> <runtime>` — keeps - Dangerous shell operationline 60
cache/models/keys) from "wipe everything" (`rm -rf <dataDir>`, which ALSO - Access to secretsline 69
[Credential-related source omitted]
scripts/gen-legacy-skill-hashes.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/release-sponsor-notes.ts
scripts/run-sdk-py-tests.mjs
- Executable scriptline 1
Executable file
scripts/star-chart.mjs
- Executable scriptline 1
#!/usr/bin/env node - Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Network accessline 42
async function loadPreviousSeries() { const url = `https://raw.githubusercontent.com/${REPO}/star-chart/star-data.json`; - Network accessline 43
const url = `https://raw.githubusercontent.com/${REPO}/star-chart/star-data.json`; try { const res = await fetch(url, { headers: { 'User-Agent': 'wigolo-star-chart' } }); - Network accessline 44
try { const res = await fetch(url, { headers: { 'User-Agent': 'wigolo-star-chart' } }); if (!res.ok) return []; - Network accessline 45
const res = await fetch(url, { headers: { 'User-Agent': 'wigolo-star-chart' } }); - Network accessline 65
res = { ok: false, status: 403, statusText: 'Forbidden (TEST_FORCE_403)', text: async () => 'forced 403 for testing', headers: new Map() }; } else { res = await fetch(`https://api.github.com/repos/${REPO}/stargazers?per_page=100&p - Network accessline 66
} else { res = await fetch(`https://api.github.com/repos/${REPO}/stargazers?per_page=100&page=${page}`, { headers: { Accept: 'application/vnd.github.star+json', ...AUTH_HEADERS }, - Network accessline 67
res = await fetch(`https://api.github.com/repos/${REPO}/stargazers?per_page=100&page=${page}`, { - Network accessline 92
async function fetchStarCount() { const res = await fetch(`https://api.github.com/repos/${REPO}`, { - Network accessline 93
const res = await fetch(`https://api.github.com/repos/${REPO}`, { - Network accessline 190
return `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}" font-family="${FONT}">
scripts/verify-channel-binary.sh
- Executable scriptline 1
#!/usr/bin/env bash - Dangerous shell operationline 50
rm -rf "$D" - Dangerous shell operationline 62
rm -rf "$D" - Dangerous shell operationline 74
rm -rf "$D" - Network accessline 78
D="$(freshdir)" FETCH_ERR="$D/fetch.err" WIGOLO_DATA_DIR="$D" "$BIN" fetch https://example.com >/dev/null 2>"$FETCH_ERR" || bad "(d) fetch failed" - Network accessline 80
WIGOLO_DATA_DIR="$D" "$BIN" fetch https://example.com >/dev/null 2>"$FETCH_ERR" || bad "(d) fetch failed" - Dangerous shell operationline 105
rm -rf "$D" - Dangerous shell operationline 120
rm -rf "$D" - Dangerous shell operationline 141
rm -rf "$D" - Dangerous shell operationline 156
rm -rf "$D" - Dangerous shell operationline 169
rm -f "$Q" - Dangerous shell operationline 180
rm -rf "$D"
scripts/verify-channel-brew.sh
scripts/verify-channel-docker.sh
- Executable scriptline 1
#!/usr/bin/env bash - Network accessline 11
# graceful sudo-probe handling all work. A real JS-render fetch # captures the organic first-run UX. # arm64 full : `doctor` + a fetch (browser preinstalled, no download). - Network accessline 12
# captures the organic first-run UX. # arm64 full : `doctor` + a fetch (browser preinstalled, no download). # amd64 default : boot-level `doctor` only, under emulation (caveat documented). - Network accessline 13
# arm64 full : `doctor` + a fetch (browser preinstalled, no download). - Network accessline 26
# Usage: scripts/verify-channel-docker.sh # Env: IMAGE_BASE (default: wigolo-verify) — local image name prefix. # RENDER_URL (default: https://react.dev) — JS-heavy page for the fetch. - Network accessline 28
# RENDER_URL (default: https://react.dev) — JS-heavy page for the fetch. - Network accessline 32
IMAGE_BASE="${IMAGE_BASE:-wigolo-verify}" RENDER_URL="${RENDER_URL:-https://react.dev}" - Network accessline 33
RENDER_URL="${RENDER_URL:-https://react.dev}" - Dangerous shell operationline 81
docker volume rm "$DATA_VOL" >/dev/null 2>&1 || true - Dangerous shell operationline 118
# of lazy binary download + baked-libs launch smoke-test + sudo handling. - Dangerous shell operationline 144
rm -f "$WARM_LOG" - Dangerous shell operationline 153
# (a) sudo really is absent and a raw spawn surfaces ENOENT; - Dangerous shell operationline 161
docker run --rm --user node --entrypoint node "$DEFAULT_IMG" \ -e 'const{spawnSync}=require("child_process");const r=spawnSync("sudo",["-n","true"],{timeout:5000});console.log("sudo_status="+r.status+" spawn_error="+(r.error?r.error.cod - Dangerous shell operationline 162
-e 'const{spawnSync}=require("child_process");const r=spawnSync("sudo",["-n","true"],{timeout:5000});console.log("sudo_status="+r.status+" spawn_error="+(r.error?r.error.code:"none"));process.exit(0)' \ - Dangerous shell operationline 166
echo "--- sudo probe output ---" - Dangerous shell operationline 168
# (a) raw spawn shows ENOENT (sudo truly absent) and the probing process - Dangerous shell operationline 178
rm -f "$SUDO_LOG" - Network accessline 187
section "arm64 default: JS-render fetch (organic, reuses warmed binary)" - Network accessline 190
set +e docker run --rm -v "${DATA_VOL}:/data" "$DEFAULT_IMG" \ fetch "$RENDER_URL" --mode=markdown --json >"$FETCH_LOG" 2>&1 - Network accessline 191
docker run --rm -v "${DATA_VOL}:/data" "$DEFAULT_IMG" fetch "$RENDER_URL" --mode=markdown --json >"$FETCH_LOG" 2>&1 - Network accessline 192
fetch "$RENDER_URL" --mode=markdown --json >"$FETCH_LOG" 2>&1 - Dangerous shell operationline 204
rm -f "$FETCH_LOG" - Network accessline 209
# --------------------------------------------------------------------------- # 4. arm64 full: doctor + fetch (browser preinstalled, no download expected) - Network accessline 210
# 4. arm64 full: doctor + fetch (browser preinstalled, no download expected) - Network accessline 223
section "arm64 full: JS-render fetch (browser preinstalled)" - Network accessline 225
FETCH_LOG="$(mktemp)" set +e docker run --rm "$FULL_IMG" fetch "$RENDER_URL" --mode=markdown --json >"$FETCH_LOG" 2>&1 - Network accessline 226
set +e docker run --rm "$FULL_IMG" fetch "$RENDER_URL" --mode=markdown --json >"$FETCH_LOG" 2>&1 FETCH_CODE=$? - Network accessline 227
docker run --rm "$FULL_IMG" fetch "$RENDER_URL" --mode=markdown --json >"$FETCH_LOG" 2>&1 - Dangerous shell operationline 239
rm -f "$FETCH_LOG"
scripts/verify-channel-npm.sh
scripts/verify-channel-rest.sh
- Executable scriptline 1
#!/bin/sh - Dangerous shell operationline 56
[ -n "$DATA_DIR" ] && rm -rf "$DATA_DIR" || true - Dangerous shell operationline 57
[ -n "$DATA_DIR_AUTH" ] && rm -rf "$DATA_DIR_AUTH" || true - Dangerous shell operationline 58
[ -n "$LOG" ] && rm -f "$LOG" || true - Dangerous shell operationline 59
[ -n "$LOG_AUTH" ] && rm -f "$LOG_AUTH" || true - Network accessline 71
i=0 while [ "$i" -lt 60 ]; do if curl -fsS "$base/health" >/dev/null 2>&1; then - Network accessline 72
while [ "$i" -lt 60 ]; do if curl -fsS "$base/health" >/dev/null 2>&1; then return 0 - Network accessline 73
if curl -fsS "$base/health" >/dev/null 2>&1; then - Network accessline 82
# Assert an HTTP status. $1=label $2=expected $3..=curl args - Network accessline 85
# `|| true`: a curl transport failure (e.g. timeout, exit 28) must fall through - Network accessline 87
got=$(curl -s --max-time "$MAX_TIME" -o /dev/null -w '%{http_code}' "$@" || true) - Network accessline 100
# POST a tool route, expect HTTP 200 with a top-level field present in the body. # Used for routes that return promptly with local / offline-safe inputs. # $1=tool $2=field $3=json-body [$4…=extra curl args] - Network accessline 102
# $1=tool $2=field $3=json-body [$4…=extra curl args] - Network accessline 106
# `|| true`: a curl transport failure falls through to our checks, not `set -e`. - Network accessline 107
code=$(curl -s --max-time "$MAX_TIME" -o "$out" -w '%{http_code}' \ - Dangerous shell operationline 113
rm -f "$out" - Dangerous shell operationline 124
rm -f "$out" - Dangerous shell operationline 127
rm -f "$out" - Network accessline 130
# POST a network-heavy tool route (research / agent) that depends on live search # recall. Accepts THREE documented outcomes: a 200 with the expected field; a # 504 route_timeout envelope; or the request outrunning MAX_TIME (curl exit 28). - Network accessline 131
# recall. Accepts THREE documented outcomes: a 200 with the expected field; a # 504 route_timeout envelope; or the request outrunning MAX_TIME (curl exit 28). # All three prove the route is wired + honestly bounded — the one thing that - Network accessline 132
# 504 route_timeout envelope; or the request outrunning MAX_TIME (curl exit 28). - Network accessline 137
tool="$1"; field="$2"; bodyjson="$3" out=$(mktemp) code=$(curl -s --max-time "$MAX_TIME" -o "$out" -w '%{http_code}' \ - Network accessline 138
out=$(mktemp) code=$(curl -s --max-time "$MAX_TIME" -o "$out" -w '%{http_code}' \ -X POST "$BASE/v1/$tool" \ - Network accessline 139
code=$(curl -s --max-time "$MAX_TIME" -o "$out" -w '%{http_code}' \ - Network accessline 143
# Empty / "000" code => curl got no HTTP response: the request outran the - Network accessline 149
if [ -z "$code" ] || [ "$code" = "000" ]; then log " NOTE: no HTTP response (curl code '${code:-empty}') — search backend slow / unavailable in this environment" - Network accessline 150
log " NOTE: no HTTP response (curl code '${code:-empty}') — search backend slow / unavailable in this environment" - Dangerous shell operationline 152
rm -f "$out"; return 0 - Dangerous shell operationline 161
rm -f "$out"; return 0 - Dangerous shell operationline 164
rm -f "$out"; fail "$tool 200 body missing expected field \"$field\"" - Dangerous shell operationline 169
rm -f "$out"; return 0 - Dangerous shell operationline 172
rm -f "$out"; fail "$tool 504 body is not a route_timeout envelope" - Dangerous shell operationline 175
rm -f "$out" - Network accessline 186
PORT=$(free_port) BASE="http://$HOST:$PORT" - Network accessline 187
BASE="http://$HOST:$PORT" - Network accessline 188
DATA_DIR=$(mktemp -d) LOG=$(mktemp) log "starting serve (open loopback) on $BASE" - Network accessline 190
log "starting serve (open loopback) on $BASE" - Access to secretsline 192
[Credential-related source omitted] - Network accessline 194
node dist/index.js serve --host "$HOST" --port "$PORT" >"$LOG" 2>&1 & SERVER_PID=$! if ! wait_health "$BASE"; then - Network accessline 195
SERVER_PID=$! if ! wait_health "$BASE"; then log "server log:"; cat "$LOG" >&2 - Network accessline 196
if ! wait_health "$BASE"; then - Network accessline 197
log "server log:"; cat "$LOG" >&2 fail "server did not become healthy on $BASE" fi - Network accessline 198
fail "server did not become healthy on $BASE" - Network accessline 202
if curl -fsS "$BASE/health" | grep -q '"status":"healthy"'; then - Network accessline 209
TOOLS_JSON=$(curl -fsS "$BASE/v1/tools") - Network accessline 218
OA=$(mktemp) curl -fsS "$BASE/openapi.json" >"$OA" - Network accessline 219
curl -fsS "$BASE/openapi.json" >"$OA" - Dangerous shell operationline 230
rm -f "$OA"; fail "/openapi.json did not validate (3.1 + 10 tool paths)" - Dangerous shell operationline 232
rm -f "$OA" - Network accessline 239
assert_tool_field search results '{"query":"verify","search_depth":"ultra-fast"}' assert_tool_field fetch url '{"url":"https://example.com","render_js":"never"}' - Network accessline 240
assert_tool_field fetch url '{"url":"https://example.com","render_js":"never"}' - Network accessline 241
assert_tool_field crawl urls '{"url":"https://example.com","strategy":"map","max_pages":2}' - Network accessline 242
assert_tool_field cache stats '{"stats":true}' assert_tool_field extract data '{"url":"https://example.com","mode":"metadata"}' assert_tool_field find_similar results '{"concept":"local first search","include_web": - Network accessline 243
assert_tool_field extract data '{"url":"https://example.com","mode":"metadata"}' assert_tool_field find_similar results '{"concept":"local first search","include_web":false}' assert_tool_field diff summary '{"old":{ - Network accessline 250
assert_status "GET on POST route -> 405" 405 -X GET "$BASE/v1/fetch" - Network accessline 251
assert_status "unknown route -> 404" 404 -X POST "$BASE/v1/no_such_tool" -d '{}' - Network accessline 252
assert_status "malformed JSON -> 400" 400 -X POST "$BASE/v1/search" -H 'Content-Type: application/json' --data-binary '{bad' - Network accessline 253
assert_status "schema-invalid -> 400" 400 -X POST "$BASE/v1/search" -H 'Content-Type: application/json' -d '{}' - Network accessline 254
assert_status "clamp over-cap -> 400" 400 -X POST "$BASE/v1/crawl" -H 'Content-Type: application/json' -d '{"url":"https://example.com","max_pages":9999}' - Network accessline 257
assert_status "shim flag off -> 404" 404 -X POST "$BASE/compat/firecrawl/v1/scrape" -H 'Content-Type: application/json' -d '{"url":"https://example.com"}' - Network accessline 263
assert_tool_field_degradable research brief '{"question":"what is local-first software","depth":"quick"}' assert_tool_field_degradable agent steps '{"prompt":"summarize example.com","urls":["https://example.com"],"max_pages":1,"max_time_m - Network accessline 264
assert_tool_field_degradable agent steps '{"prompt":"summarize example.com","urls":["https://example.com"],"max_pages":1,"max_time_ms":30000}' - Network accessline 270
PORT_AUTH=$(free_port) BASE_AUTH="http://$HOST:$PORT_AUTH" - Network accessline 271
BASE_AUTH="http://$HOST:$PORT_AUTH" - Network accessline 272
DATA_DIR_AUTH=$(mktemp -d) LOG_AUTH=$(mktemp) log "starting serve (token mode + shim on) on $BASE_AUTH" - Network accessline 273
LOG_AUTH=$(mktemp) log "starting serve (token mode + shim on) on $BASE_AUTH" WIGOLO_DATA_DIR="$DATA_DIR_AUTH" \ - Network accessline 274
log "starting serve (token mode + shim on) on $BASE_AUTH" - Network accessline 278
node dist/index.js serve --host "$HOST" --port "$PORT_AUTH" >"$LOG_AUTH" 2>&1 & SERVER_AUTH_PID=$! if ! wait_health "$BASE_AUTH"; then - Network accessline 279
SERVER_AUTH_PID=$! if ! wait_health "$BASE_AUTH"; then log "server log:"; cat "$LOG_AUTH" >&2 - Network accessline 280
if ! wait_health "$BASE_AUTH"; then - Network accessline 281
log "server log:"; cat "$LOG_AUTH" >&2 fail "token-mode server did not become healthy on $BASE_AUTH" fi - Network accessline 282
fail "token-mode server did not become healthy on $BASE_AUTH" - Network accessline 286
assert_status "token mode, no bearer -> 401" 401 -X POST "$BASE_AUTH/v1/cache" -H 'Content-Type: application/json' -d '{"stats":true}' - Network accessline 287
[Credential-related source omitted] - Network accessline 288
[Credential-related source omitted] - Network accessline 289
assert_status "token mode, /openapi.json no bearer -> 401" 401 "$BASE_AUTH/openapi.json" - Network accessline 292
SC=$(mktemp) code=$(curl -s -o "$SC" -w '%{http_code}' \ - Network accessline 293
code=$(curl -s -o "$SC" -w '%{http_code}' \ - Network accessline 294
-X POST "$BASE_AUTH/compat/firecrawl/v1/scrape" \ - Network accessline 295
[Credential-related source omitted] - Network accessline 296
[Credential-related source omitted] - Network accessline 297
-d '{"url":"https://example.com"}') - Dangerous shell operationline 306
rm -f "$SC"; fail "shim scrape did not return {success:true} with markdown (HTTP $code)" - Dangerous shell operationline 308
rm -f "$SC"
scripts/verify-channel-sh.sh
scripts/verify-sdks.sh
- Executable scriptline 1
#!/bin/sh
sdks/python/LICENSE
- Network accessline 13
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 14
along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 23
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Network accessline 664
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 665
along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 678
if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <https://www.gnu.org/licenses/>. - Network accessline 680
<https://www.gnu.org/licenses/>.
sdks/python/README.md
- Network accessline 7
A thin, dependency-free Python client for the [wigolo](https://github.com/KnockOutEZ/wigolo) - Network accessline 30
with Client(base_url="http://127.0.0.1:3333") as client: - Network accessline 35
page = client.fetch(url="https://example.com") - Network accessline 51
async def main(): async with AsyncClient(base_url="http://127.0.0.1:3333") as client: - Network accessline 52
async with AsyncClient(base_url="http://127.0.0.1:3333") as client: - Network accessline 108
| Option | Argument | Env var | Default | |------------|------------|---------------------|-------------------------| | Base URL | `base_url` | `WIGOLO_BASE_URL` | `http://127.0.0.1:3333` | - Network accessline 109
|------------|------------|---------------------|-------------------------| | Base URL | `base_url` | `WIGOLO_BASE_URL` | `http://127.0.0.1:3333` | | Bearer token | `token` | `WIGOLO_API_TOKEN` | none | - Network accessline 110
| Base URL | `base_url` | `WIGOLO_BASE_URL` | `http://127.0.0.1:3333` |
sdks/python/conftest.py
- Executable scriptline 1
Executable file
sdks/python/pyproject.toml
sdks/python/src/wigolo/__init__.py
- Executable scriptline 1
Executable file
sdks/python/src/wigolo/_aio.py
sdks/python/src/wigolo/_client.py
- Executable scriptline 1
Executable file - Network accessline 25
_DEFAULT_BASE_URL = "http://127.0.0.1:3333" - Access to secretsline 46
[Credential-related source omitted] - Network accessline 52
Args: base_url: Server base URL. Falls back to ``WIGOLO_BASE_URL`` then ``http://127.0.0.1:3333``. Ignored in local mode. - Network accessline 53
[Credential-related source omitted] - Network accessline 54
``http://127.0.0.1:3333``. Ignored in local mode. - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Network accessline 119
self._urlopen = ( _NO_PROXY_OPENER.open if _is_loopback(self._base_url) else urllib.request.urlopen - Network accessline 120
_NO_PROXY_OPENER.open if _is_loopback(self._base_url) else urllib.request.urlopen - Network accessline 162
if body is not None: data = json.dumps(body).encode("utf-8") req = urllib.request.Request( - Network accessline 163
data = json.dumps(body).encode("utf-8") req = urllib.request.Request( url, data=data, method=method, headers=self._headers() - Network accessline 164
req = urllib.request.Request( - Network accessline 371
def fetch(
sdks/python/src/wigolo/_errors.py
- Executable scriptline 1
Executable file
sdks/python/src/wigolo/_local.py
- Executable scriptline 1
Executable file - Network accessline 55
req = urllib.request.Request(f"{base_url}/health", method="GET") - Network accessline 68
[Credential-related source omitted] - Network accessline 69
headers["Authorization"] = f"Bearer {token}" req = urllib.request.Request(f"{base_url}/v1/tools", method="GET", headers=headers) try: - Network accessline 70
req = urllib.request.Request(f"{base_url}/v1/tools", method="GET", headers=headers) - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 259
[Credential-related source omitted] - Network accessline 321
In local mode ``base_url_override`` (from ``WIGOLO_BASE_URL`` or an explicit ``base_url`` arg) is IGNORED — the daemon lives at ``http://127.0.0.1:{port}``. - Network accessline 322
explicit ``base_url`` arg) is IGNORED — the daemon lives at ``http://127.0.0.1:{port}``. """ - Network accessline 323
``http://127.0.0.1:{port}``. - Access to secretsline 328
[Credential-related source omitted] - Network accessline 332
else _DEFAULT_LOCAL_PORT ) base_url = f"http://127.0.0.1:{resolved_port}" - Network accessline 334
base_url = f"http://127.0.0.1:{resolved_port}"
sdks/python/src/wigolo/_manifest.py
- Executable scriptline 1
Executable file
sdks/python/tests/_fake_serve.py
- Executable scriptline 1
Executable file - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted]
sdks/python/tests/conftest.py
- Executable scriptline 1
Executable file - Network accessline 31
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 73
def _health_code(base_url: str, timeout: float = 1.0) -> Optional[int]: try: with urllib.request.urlopen(f"{base_url}/health", timeout=timeout) as resp: - Network accessline 74
try: with urllib.request.urlopen(f"{base_url}/health", timeout=timeout) as resp: return resp.getcode() - Network accessline 75
with urllib.request.urlopen(f"{base_url}/health", timeout=timeout) as resp: - Network accessline 95
[Credential-related source omitted] - Network accessline 97
self.base_url = f"http://127.0.0.1:{port}" - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted]
sdks/python/tests/test_integration.py
- Executable scriptline 1
Executable file - Network accessline 136
def test_fetch(any_client): res = any_client.call("fetch", url="https://example.com") - Network accessline 137
res = any_client.call("fetch", url="https://example.com") - Network accessline 142
def test_crawl_map(any_client): res = any_client.call( "crawl", url="https://example.com", strategy="map", max_pages=3 - Network accessline 143
res = any_client.call( "crawl", url="https://example.com", strategy="map", max_pages=3 ) - Network accessline 144
"crawl", url="https://example.com", strategy="map", max_pages=3 - Network accessline 177
"agent", prompt="summarize", urls=["https://example.com"], - Network accessline 178
prompt="summarize", urls=["https://example.com"], max_pages=1, - Network accessline 179
urls=["https://example.com"],
sdks/python/tests/test_integration_local.py
- Executable scriptline 1
Executable file - Network accessline 27
def _free_port() -> int: s = socket.socket() - Network accessline 28
s = socket.socket() - Network accessline 35
def _health_code(base_url: str, timeout: float = 1.0): try: with urllib.request.urlopen(f"{base_url}/health", timeout=timeout) as r: - Network accessline 36
try: with urllib.request.urlopen(f"{base_url}/health", timeout=timeout) as r: return r.getcode() - Network accessline 37
with urllib.request.urlopen(f"{base_url}/health", timeout=timeout) as r: - Network accessline 70
try: assert c._daemon is not None and c._daemon.owned is True assert c._base_url == f"http://127.0.0.1:{port}" - Network accessline 72
assert c._base_url == f"http://127.0.0.1:{port}" - Network accessline 84
time.sleep(0.5) assert _health_code(f"http://127.0.0.1:{port}") is None - Network accessline 85
assert _health_code(f"http://127.0.0.1:{port}") is None - Access to secretsline 94
[Credential-related source omitted] - Network accessline 145
def _fetch(): try: c.fetch(url=f"http://127.0.0.1:{slow_port}/", timeout=30) - Network accessline 146
try: c.fetch(url=f"http://127.0.0.1:{slow_port}/", timeout=30) except Exception: - Network accessline 147
c.fetch(url=f"http://127.0.0.1:{slow_port}/", timeout=30) - Network accessline 164
assert elapsed < 12.0, f"close() took {elapsed:.1f}s — escalation failed" time.sleep(0.5) assert _health_code(f"http://127.0.0.1:{port}") is None - Network accessline 165
time.sleep(0.5) assert _health_code(f"http://127.0.0.1:{port}") is None finally: - Network accessline 166
assert _health_code(f"http://127.0.0.1:{port}") is None
sdks/python/tests/test_package_build.py
- Executable scriptline 1
Executable file
sdks/python/tests/test_runtime_drift.py
- Executable scriptline 1
Executable file - Network accessline 36
handle = spawn_serve(shared_data_dir) try: with urllib.request.urlopen(f"{handle.base_url}/openapi.json", timeout=10) as r: - Network accessline 37
try: with urllib.request.urlopen(f"{handle.base_url}/openapi.json", timeout=10) as r: spec = json.loads(r.read().decode()) - Network accessline 38
with urllib.request.urlopen(f"{handle.base_url}/openapi.json", timeout=10) as r:
sdks/python/tests/test_unit_async.py
- Executable scriptline 1
Executable file - Network accessline 43
t.start() try: yield f"http://127.0.0.1:{port}", started - Network accessline 44
try: yield f"http://127.0.0.1:{port}", started finally: - Network accessline 45
yield f"http://127.0.0.1:{port}", started - Network accessline 82
c = AsyncClient(base_url="http://127.0.0.1:1")
sdks/python/tests/test_unit_env_and_surface.py
- Executable scriptline 1
Executable file - Network accessline 51
def test_base_url_explicit_beats_env(monkeypatch): monkeypatch.setenv("WIGOLO_BASE_URL", "http://from-env:9999") - Network accessline 52
monkeypatch.setenv("WIGOLO_BASE_URL", "http://from-env:9999") - Network accessline 53
c = Client(base_url="http://explicit:1234") - Network accessline 54
assert c._base_url == "http://explicit:1234" - Network accessline 57
def test_base_url_env_used_when_no_arg(monkeypatch): monkeypatch.setenv("WIGOLO_BASE_URL", "http://from-env:9999") - Network accessline 58
monkeypatch.setenv("WIGOLO_BASE_URL", "http://from-env:9999") - Network accessline 60
assert c._base_url == "http://from-env:9999" - Network accessline 63
def test_base_url_default_when_nothing(): c = Client() assert c._base_url == "http://127.0.0.1:3333" - Network accessline 65
assert c._base_url == "http://127.0.0.1:3333" - Network accessline 95
class D: base_url = "http://127.0.0.1:3333" - Network accessline 96
base_url = "http://127.0.0.1:3333" - Network accessline 113
c = Client(local=False, base_url="http://x:1") - Network accessline 118
def fake_ensure(**kwargs): class D: base_url = "http://127.0.0.1:5555" - Network accessline 120
base_url = "http://127.0.0.1:5555" - Network accessline 127
monkeypatch.setattr("wigolo._local.ensure_local_daemon", fake_ensure) c = Client(local=True, base_url="http://ignored:1") - Network accessline 128
c = Client(local=True, base_url="http://ignored:1") - Network accessline 129
assert c._base_url == "http://127.0.0.1:5555"
sdks/python/tests/test_unit_local.py
- Executable scriptline 1
Executable file - Network accessline 20
def _free_port() -> int: s = socket.socket() - Network accessline 21
s = socket.socket() - Network accessline 59
try: assert d.owned is True assert d.base_url == f"http://127.0.0.1:{port}" - Network accessline 61
assert d.base_url == f"http://127.0.0.1:{port}" - Network accessline 63
with urllib.request.urlopen(f"{d.base_url}/health", timeout=2) as r: - Network accessline 68
time.sleep(0.5) with pytest.raises(Exception): urllib.request.urlopen(f"http://127.0.0.1:{port}/health", timeout=1) - Network accessline 70
urllib.request.urlopen(f"http://127.0.0.1:{port}/health", timeout=1) - Network accessline 82
second.close() time.sleep(0.3) with urllib.request.urlopen(f"{pre.base_url}/health", timeout=2) as r: - Network accessline 83
time.sleep(0.3) with urllib.request.urlopen(f"{pre.base_url}/health", timeout=2) as r: assert r.getcode() == 200 - Network accessline 84
with urllib.request.urlopen(f"{pre.base_url}/health", timeout=2) as r: - Network accessline 140
c = Client(local=True, port=port, command=_fake_cmd()) try: assert c._base_url == f"http://127.0.0.1:{port}" - Network accessline 141
try: assert c._base_url == f"http://127.0.0.1:{port}" assert c._daemon is not None and c._daemon.owned is True - Network accessline 142
assert c._base_url == f"http://127.0.0.1:{port}"
sdks/python/tests/test_unit_transport.py
- Executable scriptline 1
Executable file - Network accessline 76
t = threading.Thread(target=httpd.serve_forever, daemon=True) t.start() base_url = f"http://127.0.0.1:{port}" - Network accessline 77
t.start() base_url = f"http://127.0.0.1:{port}" try: - Network accessline 78
base_url = f"http://127.0.0.1:{port}" - Network accessline 166
c = Client(base_url="http://127.0.0.1:1") - Network accessline 271
c = Client(base_url=base_url) state.body = {"urls": ["a", "b"], "total_found": 2, "crawled": 0} res = c.crawl(url="https://example.com", strategy="map") - Network accessline 272
state.body = {"urls": ["a", "b"], "total_found": 2, "crawled": 0} res = c.crawl(url="https://example.com", strategy="map") assert "urls" in res and "pages" not in res - Network accessline 273
res = c.crawl(url="https://example.com", strategy="map") - Network accessline 281
base_url, state = server monkeypatch.setenv("http_proxy", "http://127.0.0.1:9") # dead proxy - Network accessline 282
monkeypatch.setenv("http_proxy", "http://127.0.0.1:9") # dead proxy - Network accessline 283
monkeypatch.setenv("https_proxy", "http://127.0.0.1:9")
sdks/typescript/LICENSE
- Network accessline 13
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 14
along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 23
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Network accessline 664
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 665
along with this program. If not, see <https://www.gnu.org/licenses/>. - Network accessline 678
if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <https://www.gnu.org/licenses/>. - Network accessline 680
<https://www.gnu.org/licenses/>.
sdks/typescript/README.md
- Network accessline 27
const client = new WigoloClient({ // baseUrl defaults to http://127.0.0.1:3333 (or WIGOLO_BASE_URL) - Network accessline 28
// baseUrl defaults to http://127.0.0.1:3333 (or WIGOLO_BASE_URL) - Network accessline 44
const { client, owned, close } = await createLocalClient(); try { const page = await client.fetch({ url: 'https://example.com' }); - Network accessline 45
try { const page = await client.fetch({ url: 'https://example.com' }); console.error(page.title); - Network accessline 46
const page = await client.fetch({ url: 'https://example.com' }); - Access to secretsline 54
[Credential-related source omitted] - Network accessline 93
new WigoloClient({ baseUrl, // > WIGOLO_BASE_URL > http://127.0.0.1:3333 - Network accessline 94
baseUrl, // > WIGOLO_BASE_URL > http://127.0.0.1:3333 - Network accessline 95
[Credential-related source omitted] - Network accessline 96
timeoutMs, // default per-request deadline; overrides the per-tool default fetch, // injectable fetch (tests / custom transports) }); - Network accessline 97
fetch, // injectable fetch (tests / custom transports)
sdks/typescript/package-lock.json
- Network accessline 19
"node_modules/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - Network accessline 20
"version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - Network accessline 21
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - Network accessline 31
"node_modules/@emnapi/runtime": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - Network accessline 32
"version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - Network accessline 33
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - Network accessline 42
"node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - Network accessline 43
"version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - Network accessline 44
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - Network accessline 53
"node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 54
"version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - Network accessline 55
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 60
"node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - Network accessline 61
"version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - Network accessline 62
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - Network accessline 70
"funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 71
"type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, - Network accessline 72
"url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 79
"node_modules/@oxc-project/types": { "version": "0.139.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - Network accessline 80
"version": "0.139.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", - Network accessline 81
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - Network accessline 84
"license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" - Network accessline 85
"funding": { "url": "https://github.com/sponsors/Boshen" } - Network accessline 86
"url": "https://github.com/sponsors/Boshen" - Network accessline 89
"node_modules/@rolldown/binding-android-arm64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - Network accessline 90
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1 - Network accessline 91
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - Network accessline 106
"node_modules/@rolldown/binding-darwin-arm64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - Network accessline 107
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K1 - Network accessline 108
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - Network accessline 123
"node_modules/@rolldown/binding-darwin-x64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - Network accessline 124
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6 - Network accessline 125
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - Network accessline 140
"node_modules/@rolldown/binding-freebsd-x64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - Network accessline 141
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF - Network accessline 142
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - Network accessline 157
"node_modules/@rolldown/binding-linux-arm-gnueabihf": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - Network accessline 158
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm - Network accessline 159
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - Network accessline 174
"node_modules/@rolldown/binding-linux-arm64-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - Network accessline 175
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZ - Network accessline 176
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - Network accessline 191
"node_modules/@rolldown/binding-linux-arm64-musl": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - Network accessline 192
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN - Network accessline 193
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - Network accessline 208
"node_modules/@rolldown/binding-linux-ppc64-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - Network accessline 209
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztM - Network accessline 210
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - Network accessline 225
"node_modules/@rolldown/binding-linux-s390x-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - Network accessline 226
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/m - Network accessline 227
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - Network accessline 242
"node_modules/@rolldown/binding-linux-x64-gnu": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - Network accessline 243
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9g - Network accessline 244
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - Network accessline 259
"node_modules/@rolldown/binding-linux-x64-musl": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - Network accessline 260
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+ - Network accessline 261
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - Network accessline 276
"node_modules/@rolldown/binding-openharmony-arm64": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - Network accessline 277
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqng - Network accessline 278
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - Network accessline 293
"node_modules/@rolldown/binding-wasm32-wasi": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - Network accessline 294
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvlt - Network accessline 295
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - Network accessline 312
"node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - Network accessline 313
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMED - Network accessline 314
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - Network accessline 329
"node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - Network accessline 330
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXI - Network accessline 331
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - Network accessline 346
"node_modules/@rolldown/pluginutils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - Network accessline 347
"version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - Network accessline 348
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - Network accessline 353
"node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - Network accessline 354
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - Network accessline 355
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - Network accessline 360
"node_modules/@tybys/wasm-util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - Network accessline 361
"version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - Network accessline 362
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - Network accessline 371
"node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - Network accessline 372
"version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - Network accessline 373
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - Network accessline 382
"node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - Network accessline 383
"version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - Network accessline 384
"resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - Network accessline 389
"node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - Network accessline 390
"version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - Network accessline 391
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - Network accessline 396
"node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - Network accessline 397
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", "integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==", - Network accessline 398
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - Network accessline 409
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 410
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 411
"url": "https://opencollective.com/vitest" - Network accessline 414
"node_modules/@vitest/mocker": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - Network accessline 415
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - Network accessline 416
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - Network accessline 424
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 425
"funding": { "url": "https://opencollective.com/vitest" }, - Network accessline 426
"url": "https://opencollective.com/vitest" - Network accessline 441
"node_modules/@vitest/pretty-format": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - Network accessline 442
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==", - Network accessline 443
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - Network accessline 449
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 450
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 451
"url": "https://opencollective.com/vitest" - Network accessline 454
"node_modules/@vitest/runner": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - Network accessline 455
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", "integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==", - Network accessline 456
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - Network accessline 463
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 464
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 465
"url": "https://opencollective.com/vitest" - Network accessline 468
"node_modules/@vitest/snapshot": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - Network accessline 469
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", "integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==", - Network accessline 470
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - Network accessline 479
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 480
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 481
"url": "https://opencollective.com/vitest" - Network accessline 484
"node_modules/@vitest/spy": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - Network accessline 485
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==", - Network accessline 486
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - Network accessline 489
"license": "MIT", "funding": { "url": "https://opencollective.com/vitest" - Network accessline 490
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 491
"url": "https://opencollective.com/vitest" - Network accessline 494
"node_modules/@vitest/utils": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - Network accessline 495
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==", - Network accessline 496
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - Network accessline 504
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 505
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 506
"url": "https://opencollective.com/vitest" - Network accessline 509
"node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - Network accessline 510
"version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - Network accessline 511
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - Network accessline 519
"node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - Network accessline 520
"version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - Network accessline 521
"resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - Network accessline 529
"node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - Network accessline 530
"version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - Network accessline 531
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - Network accessline 536
"node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - Network accessline 537
"version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - Network accessline 538
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - Network accessline 546
"node_modules/es-module-lexer": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", - Network accessline 547
"version": "2.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", - Network accessline 548
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", - Network accessline 553
"node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - Network accessline 554
"version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - Network accessline 555
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - Network accessline 563
"node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - Network accessline 564
"version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", - Network accessline 565
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - Network accessline 573
"node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 574
"version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - Network accessline 575
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 591
"node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 592
"version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - Network accessline 593
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 606
"node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - Network accessline 607
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - Network accessline 608
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - Network accessline 618
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 619
"type": "opencollective", "url": "https://opencollective.com/parcel" }, - Network accessline 620
"url": "https://opencollective.com/parcel" - Network accessline 636
"node_modules/lightningcss-android-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - Network accessline 637
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgH - Network accessline 638
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - Network accessline 652
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 653
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 654
"url": "https://opencollective.com/parcel" - Network accessline 657
"node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - Network accessline 658
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc - Network accessline 659
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - Network accessline 673
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 674
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 675
"url": "https://opencollective.com/parcel" - Network accessline 678
"node_modules/lightningcss-darwin-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - Network accessline 679
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73 - Network accessline 680
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - Network accessline 694
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 695
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 696
"url": "https://opencollective.com/parcel" - Network accessline 699
"node_modules/lightningcss-freebsd-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - Network accessline 700
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK - Network accessline 701
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - Network accessline 715
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 716
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 717
"url": "https://opencollective.com/parcel" - Network accessline 720
"node_modules/lightningcss-linux-arm-gnueabihf": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - Network accessline 721
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsP - Network accessline 722
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - Network accessline 736
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 737
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 738
"url": "https://opencollective.com/parcel" - Network accessline 741
"node_modules/lightningcss-linux-arm64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - Network accessline 742
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbeb - Network accessline 743
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - Network accessline 757
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 758
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 759
"url": "https://opencollective.com/parcel" - Network accessline 762
"node_modules/lightningcss-linux-arm64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - Network accessline 763
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJ - Network accessline 764
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - Network accessline 778
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 779
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 780
"url": "https://opencollective.com/parcel" - Network accessline 783
"node_modules/lightningcss-linux-x64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - Network accessline 784
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI - Network accessline 785
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - Network accessline 799
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 800
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 801
"url": "https://opencollective.com/parcel" - Network accessline 804
"node_modules/lightningcss-linux-x64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - Network accessline 805
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j - Network accessline 806
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - Network accessline 820
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 821
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 822
"url": "https://opencollective.com/parcel" - Network accessline 825
"node_modules/lightningcss-win32-arm64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - Network accessline 826
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx - Network accessline 827
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - Network accessline 841
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 842
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 843
"url": "https://opencollective.com/parcel" - Network accessline 846
"node_modules/lightningcss-win32-x64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - Network accessline 847
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnj - Network accessline 848
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - Network accessline 862
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 863
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 864
"url": "https://opencollective.com/parcel" - Network accessline 867
"node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 868
"version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - Network accessline 869
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 877
"node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - Network accessline 878
"version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", - Network accessline 879
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - Network accessline 883
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 884
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 885
"url": "https://github.com/sponsors/ai" - Network accessline 896
"node_modules/obug": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", - Network accessline 897
"version": "2.1.4", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", - Network accessline 898
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", - Network accessline 900
"dev": true, "funding": [ "https://github.com/sponsors/sxzz", - Network accessline 901
"funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" - Network accessline 902
"https://github.com/sponsors/sxzz", - Network accessline 903
"https://opencollective.com/debug" - Network accessline 910
"node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - Network accessline 911
"version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - Network accessline 912
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - Network accessline 917
"node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 918
"version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - Network accessline 919
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 924
"node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - Network accessline 925
"version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - Network accessline 926
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - Network accessline 932
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 933
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 934
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 937
"node_modules/postcss": { "version": "8.5.19", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", - Network accessline 938
"version": "8.5.19", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", - Network accessline 939
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", - Network accessline 943
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 944
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 945
"url": "https://opencollective.com/postcss/" - Network accessline 947
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 948
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, - Network accessline 949
"url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 951
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 952
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 953
"url": "https://github.com/sponsors/ai" - Network accessline 966
"node_modules/rolldown": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - Network accessline 967
"version": "1.1.5", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", - Network accessline 968
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - Network accessline 1000
"node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - Network accessline 1001
"version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - Network accessline 1002
"resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - Network accessline 1007
"node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - Network accessline 1008
"version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - Network accessline 1009
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - Network accessline 1017
"node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - Network accessline 1018
"version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - Network accessline 1019
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - Network accessline 1024
"node_modules/std-env": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", - Network accessline 1025
"version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", - Network accessline 1026
"resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", - Network accessline 1031
"node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - Network accessline 1032
"version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - Network accessline 1033
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - Network accessline 1038
"node_modules/tinyexec": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - Network accessline 1039
"version": "1.2.4", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", - Network accessline 1040
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - Network accessline 1048
"node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - Network accessline 1049
"version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - Network accessline 1050
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - Network accessline 1060
}, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 1061
"funding": { "url": "https://github.com/sponsors/SuperchupuDev" } - Network accessline 1062
"url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 1065
"node_modules/tinyrainbow": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - Network accessline 1066
"version": "3.1.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - Network accessline 1067
"resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - Network accessline 1075
"node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - Network accessline 1076
"version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - Network accessline 1077
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - Network accessline 1083
"node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - Network accessline 1084
"version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - Network accessline 1085
"resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - Network accessline 1097
"node_modules/vite": { "version": "8.1.5", "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", - Network accessline 1098
"version": "8.1.5", "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", - Network accessline 1099
"resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", - Network accessline 1115
}, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" - Network accessline 1116
"funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, - Network accessline 1117
"url": "https://github.com/vitejs/vite?sponsor=1" - Network accessline 1175
"node_modules/vitest": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz", - Network accessline 1176
"version": "4.1.6", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz", "integrity": "sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==", - Network accessline 1177
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.6.tgz", - Network accessline 1208
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 1209
"funding": { "url": "https://opencollective.com/vitest" }, - Network accessline 1210
"url": "https://opencollective.com/vitest" - Network accessline 1265
"node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - Network accessline 1266
"version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - Network accessline 1267
"resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
sdks/typescript/package.json
- Executable scriptline 1
Executable file - Network accessline 7
"repository": { "type": "git", "url": "https://github.com/KnockOutEZ/wigolo", - Network accessline 8
"type": "git", "url": "https://github.com/KnockOutEZ/wigolo", "directory": "sdks/typescript" - Network accessline 9
"url": "https://github.com/KnockOutEZ/wigolo",
sdks/typescript/src/client.ts
- Executable scriptline 1
Executable file - Network accessline 55
/** Base URL of the daemon. Default resolution: option > WIGOLO_BASE_URL > http://127.0.0.1:3333. */ - Network accessline 65
const DEFAULT_BASE_URL = 'http://127.0.0.1:3333'; - Network accessline 130
throw new Error( 'No fetch implementation available. Pass { fetch } to the WigoloClient options, ' + 'or run on a runtime with a global fetch (Node >=18).', - Network accessline 131
'No fetch implementation available. Pass { fetch } to the WigoloClient options, ' + 'or run on a runtime with a global fetch (Node >=18).', ); - Network accessline 132
'or run on a runtime with a global fetch (Node >=18).',
sdks/typescript/src/errors.ts
- Executable scriptline 1
Executable file
sdks/typescript/src/index.ts
- Executable scriptline 1
Executable file
sdks/typescript/src/local.ts
- Executable scriptline 1
Executable file - Network accessline 152
[Credential-related source omitted] - Network accessline 153
try { const res = await fetch(`${base}/health`, { method: 'GET', - Network accessline 154
const res = await fetch(`${base}/health`, { - Network accessline 170
let res: Response; try { res = await fetch(`${base}/v1/tools`, { - Network accessline 171
try { res = await fetch(`${base}/v1/tools`, { method: 'GET', - Network accessline 172
res = await fetch(`${base}/v1/tools`, { - Network accessline 273
export async function createLocalClient(opts: CreateLocalClientOptions = {}): Promise<LocalClient> { const port = resolvePort(opts); const base = `http://${LOOPBACK_HOST}:${port}`; - Network accessline 274
[Credential-related source omitted] - Network accessline 275
const base = `http://${LOOPBACK_HOST}:${port}`;
sdks/typescript/src/manifest.ts
- Executable scriptline 1
Executable file
sdks/typescript/src/node-shims.d.ts
- Executable scriptline 1
Executable file
sdks/typescript/src/types.ts
- Executable scriptline 1
Executable file
sdks/typescript/tests/client.unit.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
it('joins base and manifest path, tolerating a trailing slash', async () => { const { fetch, calls } = stubFetch({ body: '{}' }); const client = new WigoloClient({ baseUrl: 'http://host:9/', fetch }); - Network accessline 32
const { fetch, calls } = stubFetch({ body: '{}' }); const client = new WigoloClient({ baseUrl: 'http://host:9/', fetch }); await client.fetch({ url: 'https://example.com' }); - Network accessline 33
const client = new WigoloClient({ baseUrl: 'http://host:9/', fetch }); - Network accessline 34
await client.fetch({ url: 'https://example.com' }); - Network accessline 35
expect(calls[0].url).toBe('http://host:9/v1/fetch'); - Network accessline 40
const { fetch, calls } = stubFetch({ body: '{}' }); const client = new WigoloClient({ fetch }); await client.crawl({ url: 'https://a.example', strategy: 'map', max_pages: 3 }); - Network accessline 41
const client = new WigoloClient({ fetch }); await client.crawl({ url: 'https://a.example', strategy: 'map', max_pages: 3 }); expect(JSON.parse(calls[0].body ?? '{}')).toEqual({ - Network accessline 42
await client.crawl({ url: 'https://a.example', strategy: 'map', max_pages: 3 }); - Network accessline 43
expect(JSON.parse(calls[0].body ?? '{}')).toEqual({ url: 'https://a.example', strategy: 'map', - Network accessline 44
url: 'https://a.example', - Network accessline 87
const { fetch } = stubFetch({ status: 502, ok: false, body: '<html>gateway</html>' }); const client = new WigoloClient({ fetch }); const err = (await client.fetch({ url: 'x' }).catch((e: unknown) => e)) as WigoloApiError; - Network accessline 88
const client = new WigoloClient({ fetch }); const err = (await client.fetch({ url: 'x' }).catch((e: unknown) => e)) as WigoloApiError; expect(err).toBeInstanceOf(WigoloApiError); - Network accessline 89
const err = (await client.fetch({ url: 'x' }).catch((e: unknown) => e)) as WigoloApiError; - Network accessline 168
expect(() => new WigoloClient({ fetch: stubFetch({}).fetch })).not.toThrow(); const client = new WigoloClient({ fetch: stubFetch({}).fetch }); expect(client.baseUrl).toBe('http://127.0.0.1:3333'); - Network accessline 169
const client = new WigoloClient({ fetch: stubFetch({}).fetch }); expect(client.baseUrl).toBe('http://127.0.0.1:3333'); expect(client.token).toBeUndefined(); - Network accessline 170
expect(client.baseUrl).toBe('http://127.0.0.1:3333'); - Network accessline 178
describe('env resolution precedence', () => { it('reads WIGOLO_BASE_URL / WIGOLO_API_TOKEN when options are absent', () => { process.env.WIGOLO_BASE_URL = 'http://env-host:1234'; - Network accessline 179
[Credential-related source omitted] - Network accessline 180
[Credential-related source omitted] - Network accessline 181
[Credential-related source omitted] - Access to secretsline 181
[Credential-related source omitted] - Network accessline 182
const client = new WigoloClient({ fetch: stubFetch({}).fetch }); expect(client.baseUrl).toBe('http://env-host:1234'); expect(client.token).toBe('env-token'); - Network accessline 183
expect(client.baseUrl).toBe('http://env-host:1234'); - Network accessline 187
it('ignores env entirely when the option is explicit', () => { process.env.WIGOLO_BASE_URL = 'http://env-host:1234'; - Network accessline 188
process.env.WIGOLO_BASE_URL = 'http://env-host:1234'; - Network accessline 189
[Credential-related source omitted] - Access to secretsline 189
[Credential-related source omitted] - Network accessline 190
[Credential-related source omitted] - Network accessline 191
[Credential-related source omitted] - Network accessline 193
fetch: stubFetch({}).fetch, }); expect(client.baseUrl).toBe('http://explicit:9'); - Network accessline 194
}); expect(client.baseUrl).toBe('http://explicit:9'); expect(client.token).toBe('explicit-token'); - Network accessline 195
expect(client.baseUrl).toBe('http://explicit:9'); - Network accessline 203
expect(client.baseUrl).toBe('http://127.0.0.1:3333');
sdks/typescript/tests/drift.type-test.ts
- Executable scriptline 1
Executable file
sdks/typescript/tests/embedded.test.ts
- Executable scriptline 1
Executable file - Network accessline 52
await new Promise((r) => setTimeout(r, 300)); await expect( fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) }), - Network accessline 53
await expect( fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) }), ).rejects.toBeTruthy(); - Network accessline 54
fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) }), - Network accessline 71
const res = await fetch(`${serve.baseUrl}/health`, { signal: AbortSignal.timeout(2000) }); - Network accessline 78
// A loopback target that never responds keeps a fetch() in-flight so the - Network accessline 94
const inflight = local.client .fetch({ url: `http://127.0.0.1:${slowPort}/`, render_js: false }, { timeoutMs: 300_000 }) - Network accessline 95
.fetch({ url: `http://127.0.0.1:${slowPort}/`, render_js: false }, { timeoutMs: 300_000 }) - Network accessline 107
await new Promise((r) => setTimeout(r, 300)); await expect( fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) }), - Network accessline 108
await expect( fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) }), ).rejects.toBeTruthy(); - Network accessline 109
fetch(`http://127.0.0.1:${port}/health`, { signal: AbortSignal.timeout(1000) }),
sdks/typescript/tests/helpers.ts
- Executable scriptline 1
Executable file
sdks/typescript/tests/integration.test.ts
- Executable scriptline 1
Executable file - Network accessline 52
it('fetch', async () => { const res = await client.fetch({ url: 'https://example.com' }); - Network accessline 53
const res = await client.fetch({ url: 'https://example.com' }); - Network accessline 58
it('crawl map strategy returns urls and no pages', async () => { const res = await client.crawl({ url: 'https://example.com', - Network accessline 59
const res = await client.crawl({ url: 'https://example.com', strategy: 'map', - Network accessline 60
url: 'https://example.com', - Network accessline 100
const res = await client.agent({ prompt: 'summarize', urls: ['https://example.com'], - Network accessline 101
prompt: 'summarize', urls: ['https://example.com'], max_pages: 1, - Network accessline 102
urls: ['https://example.com'],
sdks/typescript/tests/local.unit.test.ts
- Executable scriptline 1
Executable file - Network accessline 67
const res = await fetch(`http://127.0.0.1:${port}/health`); - Network accessline 119
closers.push(() => local.close()); expect(local.owned).toBe(true); const res = await fetch(`http://127.0.0.1:${port}/health`); - Network accessline 120
expect(local.owned).toBe(true); const res = await fetch(`http://127.0.0.1:${port}/health`); expect(res.status).toBe(200); - Network accessline 121
const res = await fetch(`http://127.0.0.1:${port}/health`); - Network accessline 125
await new Promise((r) => setTimeout(r, 300)); await expect(fetch(`http://127.0.0.1:${port}/health`)).rejects.toBeTruthy(); - Network accessline 126
await expect(fetch(`http://127.0.0.1:${port}/health`)).rejects.toBeTruthy(); - Network accessline 166
closers.push(() => local.close()); expect(local.owned).toBe(true); const res = await fetch(`http://127.0.0.1:${port}/health`); - Network accessline 167
expect(local.owned).toBe(true); const res = await fetch(`http://127.0.0.1:${port}/health`); expect(res.status).toBe(200); - Network accessline 168
const res = await fetch(`http://127.0.0.1:${port}/health`); - Network accessline 170
await local.close(); await new Promise((r) => setTimeout(r, 300)); await expect(fetch(`http://127.0.0.1:${port}/health`)).rejects.toBeTruthy(); - Network accessline 171
await new Promise((r) => setTimeout(r, 300)); await expect(fetch(`http://127.0.0.1:${port}/health`)).rejects.toBeTruthy(); }); - Network accessline 172
await expect(fetch(`http://127.0.0.1:${port}/health`)).rejects.toBeTruthy(); - Access to secretsline 197
[Credential-related source omitted]
sdks/typescript/tests/runtime-drift.test.ts
- Executable scriptline 1
Executable file - Network accessline 37
const port = await freePort(); serve = await spawnServe({ port, dataDir }); const res = await fetch(`${serve.baseUrl}/openapi.json`); - Network accessline 38
serve = await spawnServe({ port, dataDir }); const res = await fetch(`${serve.baseUrl}/openapi.json`); expect(res.status).toBe(200); - Network accessline 39
const res = await fetch(`${serve.baseUrl}/openapi.json`);
sdks/typescript/tests/serve-harness.ts
- Executable scriptline 1
Executable file - Access to secretsline 103
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Network accessline 117
const baseUrl = `http://127.0.0.1:${opts.port}`; - Network accessline 126
} try { const res = await fetch(`${baseUrl}/health`, { - Network accessline 127
try { const res = await fetch(`${baseUrl}/health`, { headers, - Network accessline 128
const res = await fetch(`${baseUrl}/health`, {
sdks/typescript/vitest.config.ts
- Executable scriptline 1
Executable file
site/.gitignore
- Network accessline 1
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
site/README.md
- Network accessline 3
Next.js static site for [wigolo](https://github.com/KnockOutEZ/wigolo), deployed to GitHub Pages (custom domain `wigolo.app`, DNS on Cloudflare) by `.github/workflows/site.yml` on pushes to `main` that touch `site/`, `docs/` or `examples/`. - Network accessline 14
|---|---| | `NEXT_PUBLIC_BASE_PATH` | Optional path prefix for hosting under a sub-path; unset in production (the site serves from the domain root) | | `NEXT_PUBLIC_SITE_URL` | Canonical URL for metadata/OG (`https://wigolo.app`) | - Network accessline 15
| `NEXT_PUBLIC_BASE_PATH` | Optional path prefix for hosting under a sub-path; unset in production (the site serves from the domain root) | | `NEXT_PUBLIC_SITE_URL` | Canonical URL for metadata/OG (`https://wigolo.app`) | | `NEXT_PUBLIC_WEB - Network accessline 16
| `NEXT_PUBLIC_SITE_URL` | Canonical URL for metadata/OG (`https://wigolo.app`) | - Network accessline 44
[Umami](https://umami.is): cookieless, no personal data, no consent banner. Loads only when `NEXT_PUBLIC_UMAMI_ID` is set (the Pages workflow reads the `UMAMI_WEBSITE_ID` repo variable), counts only on `wigolo.app`, and honours Do Not Track
site/eslint.config.mjs
- Executable scriptline 1
Executable file
site/next.config.mjs
- Executable scriptline 1
Executable file
site/package-lock.json
- Network accessline 35
"node_modules/@alloc/quick-lru": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", - Network accessline 36
"version": "5.3.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", "integrity": "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==", - Network accessline 37
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", - Network accessline 43
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 44
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 45
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 48
"node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - Network accessline 49
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - Network accessline 50
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - Network accessline 63
"node_modules/@babel/compat-data": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - Network accessline 64
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - Network accessline 65
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - Network accessline 73
"node_modules/@babel/core": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - Network accessline 74
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - Network accessline 75
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - Network accessline 99
"funding": { "type": "opencollective", "url": "https://opencollective.com/babel" - Network accessline 100
"type": "opencollective", "url": "https://opencollective.com/babel" } - Network accessline 101
"url": "https://opencollective.com/babel" - Network accessline 104
"node_modules/@babel/generator": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - Network accessline 105
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - Network accessline 106
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - Network accessline 121
"node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - Network accessline 122
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj - Network accessline 123
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - Network accessline 138
"node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - Network accessline 139
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - Network accessline 140
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - Network accessline 148
"node_modules/@babel/helper-module-imports": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - Network accessline 149
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7l - Network accessline 150
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - Network accessline 162
"node_modules/@babel/helper-module-transforms": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - Network accessline 163
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotv - Network accessline 164
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - Network accessline 180
"node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - Network accessline 181
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErI - Network accessline 182
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - Network accessline 190
"node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - Network accessline 191
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+s - Network accessline 192
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - Network accessline 200
"node_modules/@babel/helper-validator-option": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - Network accessline 201
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmS - Network accessline 202
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - Network accessline 210
"node_modules/@babel/helpers": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - Network accessline 211
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - Network accessline 212
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - Network accessline 224
"node_modules/@babel/parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - Network accessline 225
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - Network accessline 226
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - Network accessline 240
"node_modules/@babel/template": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - Network accessline 241
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - Network accessline 242
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - Network accessline 255
"node_modules/@babel/traverse": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - Network accessline 256
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - Network accessline 257
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - Network accessline 274
"node_modules/@babel/types": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - Network accessline 275
"version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - Network accessline 276
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - Network accessline 288
"node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - Network accessline 289
"version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - Network accessline 290
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - Network accessline 300
"node_modules/@emnapi/runtime": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - Network accessline 301
"version": "1.11.2", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", - Network accessline 302
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - Network accessline 310
"node_modules/@emnapi/wasi-threads": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - Network accessline 311
"version": "1.2.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - Network accessline 312
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - Network accessline 321
"node_modules/@esbuild/aix-ppc64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - Network accessline 322
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", - Network accessline 323
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - Network accessline 337
"node_modules/@esbuild/android-arm": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - Network accessline 338
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", - Network accessline 339
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - Network accessline 353
"node_modules/@esbuild/android-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - Network accessline 354
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", - Network accessline 355
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - Network accessline 369
"node_modules/@esbuild/android-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - Network accessline 370
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", - Network accessline 371
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - Network accessline 385
"node_modules/@esbuild/darwin-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - Network accessline 386
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", - Network accessline 387
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - Network accessline 401
"node_modules/@esbuild/darwin-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - Network accessline 402
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - Network accessline 403
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - Network accessline 417
"node_modules/@esbuild/freebsd-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - Network accessline 418
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", - Network accessline 419
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - Network accessline 433
"node_modules/@esbuild/freebsd-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - Network accessline 434
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", - Network accessline 435
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - Network accessline 449
"node_modules/@esbuild/linux-arm": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - Network accessline 450
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - Network accessline 451
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - Network accessline 465
"node_modules/@esbuild/linux-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - Network accessline 466
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", - Network accessline 467
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - Network accessline 481
"node_modules/@esbuild/linux-ia32": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - Network accessline 482
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", - Network accessline 483
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - Network accessline 497
"node_modules/@esbuild/linux-loong64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - Network accessline 498
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", - Network accessline 499
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - Network accessline 513
"node_modules/@esbuild/linux-mips64el": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - Network accessline 514
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", - Network accessline 515
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - Network accessline 529
"node_modules/@esbuild/linux-ppc64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - Network accessline 530
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", - Network accessline 531
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - Network accessline 545
"node_modules/@esbuild/linux-riscv64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - Network accessline 546
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", - Network accessline 547
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - Network accessline 561
"node_modules/@esbuild/linux-s390x": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - Network accessline 562
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - Network accessline 563
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - Network accessline 577
"node_modules/@esbuild/linux-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - Network accessline 578
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", - Network accessline 579
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - Network accessline 593
"node_modules/@esbuild/netbsd-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - Network accessline 594
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", - Network accessline 595
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - Network accessline 609
"node_modules/@esbuild/netbsd-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - Network accessline 610
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", - Network accessline 611
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - Network accessline 625
"node_modules/@esbuild/openbsd-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - Network accessline 626
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", - Network accessline 627
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - Network accessline 641
"node_modules/@esbuild/openbsd-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - Network accessline 642
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", - Network accessline 643
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - Network accessline 657
"node_modules/@esbuild/openharmony-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - Network accessline 658
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q - Network accessline 659
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - Network accessline 673
"node_modules/@esbuild/sunos-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - Network accessline 674
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", - Network accessline 675
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - Network accessline 689
"node_modules/@esbuild/win32-arm64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - Network accessline 690
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", - Network accessline 691
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - Network accessline 705
"node_modules/@esbuild/win32-ia32": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - Network accessline 706
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", - Network accessline 707
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - Network accessline 721
"node_modules/@esbuild/win32-x64": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - Network accessline 722
"version": "0.28.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", - Network accessline 723
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - Network accessline 737
"node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - Network accessline 738
"version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==" - Network accessline 739
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - Network accessline 748
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 749
"funding": { "url": "https://opencollective.com/eslint" }, - Network accessline 750
"url": "https://opencollective.com/eslint" - Network accessline 756
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - Network accessline 757
"version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - Network accessline 758
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - Network accessline 764
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 765
"funding": { "url": "https://opencollective.com/eslint" } - Network accessline 766
"url": "https://opencollective.com/eslint" - Network accessline 769
"node_modules/@eslint-community/regexpp": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - Network accessline 770
"version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - Network accessline 771
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - Network accessline 779
"node_modules/@eslint/config-array": { "version": "0.21.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - Network accessline 780
"version": "0.21.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - Network accessline 781
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - Network accessline 794
"node_modules/@eslint/config-helpers": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - Network accessline 795
"version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - Network accessline 796
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - Network accessline 807
"node_modules/@eslint/core": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - Network accessline 808
"version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - Network accessline 809
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - Network accessline 820
"node_modules/@eslint/eslintrc": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - Network accessline 821
"version": "3.3.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - Network accessline 822
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - Network accessline 839
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 840
"funding": { "url": "https://opencollective.com/eslint" } - Network accessline 841
"url": "https://opencollective.com/eslint" - Network accessline 844
"node_modules/@eslint/js": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - Network accessline 845
"version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - Network accessline 846
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - Network accessline 852
}, "funding": { "url": "https://eslint.org/donate" - Network accessline 853
"funding": { "url": "https://eslint.org/donate" } - Network accessline 854
"url": "https://eslint.org/donate" - Network accessline 857
"node_modules/@eslint/object-schema": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - Network accessline 858
"version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - Network accessline 859
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - Network accessline 867
"node_modules/@eslint/plugin-kit": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - Network accessline 868
"version": "0.4.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - Network accessline 869
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - Network accessline 881
"node_modules/@floating-ui/core": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", - Network accessline 882
"version": "1.8.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", - Network accessline 883
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", - Network accessline 890
"node_modules/@floating-ui/dom": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", - Network accessline 891
"version": "1.8.0", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", - Network accessline 892
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", - Network accessline 900
"node_modules/@floating-ui/react-dom": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", - Network accessline 901
"version": "2.1.9", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", - Network accessline 902
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", - Network accessline 913
"node_modules/@floating-ui/utils": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", - Network accessline 914
"version": "0.2.12", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", - Network accessline 915
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", - Network accessline 919
"node_modules/@fuma-translate/react": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@fuma-translate/react/-/react-1.0.2.tgz", - Network accessline 920
"version": "1.0.2", "resolved": "https://registry.npmjs.org/@fuma-translate/react/-/react-1.0.2.tgz", "integrity": "sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==", - Network accessline 921
"resolved": "https://registry.npmjs.org/@fuma-translate/react/-/react-1.0.2.tgz", - Network accessline 935
"node_modules/@fumadocs/tailwind": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.1.2.tgz", - Network accessline 936
"version": "0.1.2", "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.1.2.tgz", "integrity": "sha512-VppeXgIRXjZMgpf2qijj1hcfxyeYl1s0ok8k6N3jyjiX64M7sDwnt2zGPd6dbfDybgbBvDw6C6J1e42gB5NzsA==", - Network accessline 937
"resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.1.2.tgz", - Network accessline 949
"node_modules/@fumari/image-size": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@fumari/image-size/-/image-size-0.1.1.tgz", - Network accessline 950
"version": "0.1.1", "resolved": "https://registry.npmjs.org/@fumari/image-size/-/image-size-0.1.1.tgz", "integrity": "sha512-iaiV2wyzJ4mW358NX4CX3yGit+WjKYzpaQ+rldK9BjL/5jFpeV6ruWnZVq7MEyMn3Gd0DLi8g/79NZAAQaGscw==", - Network accessline 951
"resolved": "https://registry.npmjs.org/@fumari/image-size/-/image-size-0.1.1.tgz", - Network accessline 955
"node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - Network accessline 956
"version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - Network accessline 957
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - Network accessline 968
"node_modules/@humanfs/node": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - Network accessline 969
"version": "0.16.8", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - Network accessline 970
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - Network accessline 983
"node_modules/@humanfs/types": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - Network accessline 984
"version": "0.15.0", "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - Network accessline 985
"resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - Network accessline 993
"node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - Network accessline 994
"version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA - Network accessline 995
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - Network accessline 1002
"funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" - Network accessline 1003
"type": "github", "url": "https://github.com/sponsors/nzakas" } - Network accessline 1004
"url": "https://github.com/sponsors/nzakas" - Network accessline 1007
"node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - Network accessline 1008
"version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - Network accessline 1009
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - Network accessline 1016
"funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" - Network accessline 1017
"type": "github", "url": "https://github.com/sponsors/nzakas" } - Network accessline 1018
"url": "https://github.com/sponsors/nzakas" - Network accessline 1021
"node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - Network accessline 1022
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - Network accessline 1023
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - Network accessline 1031
"node_modules/@img/sharp-darwin-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - Network accessline 1032
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w== - Network accessline 1033
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - Network accessline 1045
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1046
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1047
"url": "https://opencollective.com/libvips" - Network accessline 1053
"node_modules/@img/sharp-darwin-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - Network accessline 1054
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - Network accessline 1055
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - Network accessline 1067
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1068
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1069
"url": "https://opencollective.com/libvips" - Network accessline 1075
"node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - Network accessline 1076
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCv - Network accessline 1077
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - Network accessline 1086
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1087
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1088
"url": "https://opencollective.com/libvips" - Network accessline 1091
"node_modules/@img/sharp-libvips-darwin-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - Network accessline 1092
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdj - Network accessline 1093
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - Network accessline 1102
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1103
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1104
"url": "https://opencollective.com/libvips" - Network accessline 1107
"node_modules/@img/sharp-libvips-linux-arm": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - Network accessline 1108
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11 - Network accessline 1109
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - Network accessline 1118
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1119
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1120
"url": "https://opencollective.com/libvips" - Network accessline 1123
"node_modules/@img/sharp-libvips-linux-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - Network accessline 1124
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28 - Network accessline 1125
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - Network accessline 1134
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1135
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1136
"url": "https://opencollective.com/libvips" - Network accessline 1139
"node_modules/@img/sharp-libvips-linux-ppc64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - Network accessline 1140
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQ - Network accessline 1141
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - Network accessline 1150
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1151
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1152
"url": "https://opencollective.com/libvips" - Network accessline 1155
"node_modules/@img/sharp-libvips-linux-riscv64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - Network accessline 1156
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNb - Network accessline 1157
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - Network accessline 1166
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1167
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1168
"url": "https://opencollective.com/libvips" - Network accessline 1171
"node_modules/@img/sharp-libvips-linux-s390x": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - Network accessline 1172
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdw - Network accessline 1173
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - Network accessline 1182
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1183
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1184
"url": "https://opencollective.com/libvips" - Network accessline 1187
"node_modules/@img/sharp-libvips-linux-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - Network accessline 1188
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfA - Network accessline 1189
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - Network accessline 1198
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1199
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1200
"url": "https://opencollective.com/libvips" - Network accessline 1203
"node_modules/@img/sharp-libvips-linuxmusl-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - Network accessline 1204
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0p - Network accessline 1205
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - Network accessline 1214
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1215
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1216
"url": "https://opencollective.com/libvips" - Network accessline 1219
"node_modules/@img/sharp-libvips-linuxmusl-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - Network accessline 1220
"version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCyl - Network accessline 1221
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - Network accessline 1230
], "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1231
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1232
"url": "https://opencollective.com/libvips" - Network accessline 1235
"node_modules/@img/sharp-linux-arm": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - Network accessline 1236
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - Network accessline 1237
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - Network accessline 1249
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1250
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1251
"url": "https://opencollective.com/libvips" - Network accessline 1257
"node_modules/@img/sharp-linux-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - Network accessline 1258
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - Network accessline 1259
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - Network accessline 1271
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1272
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1273
"url": "https://opencollective.com/libvips" - Network accessline 1279
"node_modules/@img/sharp-linux-ppc64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - Network accessline 1280
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - Network accessline 1281
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - Network accessline 1293
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1294
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1295
"url": "https://opencollective.com/libvips" - Network accessline 1301
"node_modules/@img/sharp-linux-riscv64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - Network accessline 1302
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw - Network accessline 1303
"resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - Network accessline 1315
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1316
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1317
"url": "https://opencollective.com/libvips" - Network accessline 1323
"node_modules/@img/sharp-linux-s390x": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - Network accessline 1324
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - Network accessline 1325
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - Network accessline 1337
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1338
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1339
"url": "https://opencollective.com/libvips" - Network accessline 1345
"node_modules/@img/sharp-linux-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - Network accessline 1346
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - Network accessline 1347
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - Network accessline 1359
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1360
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1361
"url": "https://opencollective.com/libvips" - Network accessline 1367
"node_modules/@img/sharp-linuxmusl-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - Network accessline 1368
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id - Network accessline 1369
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - Network accessline 1381
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1382
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1383
"url": "https://opencollective.com/libvips" - Network accessline 1389
"node_modules/@img/sharp-linuxmusl-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - Network accessline 1390
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q - Network accessline 1391
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - Network accessline 1403
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1404
"funding": { "url": "https://opencollective.com/libvips" }, - Network accessline 1405
"url": "https://opencollective.com/libvips" - Network accessline 1411
"node_modules/@img/sharp-wasm32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - Network accessline 1412
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - Network accessline 1413
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - Network accessline 1425
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1426
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1427
"url": "https://opencollective.com/libvips" - Network accessline 1430
"node_modules/@img/sharp-win32-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - Network accessline 1431
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - Network accessline 1432
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - Network accessline 1444
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1445
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1446
"url": "https://opencollective.com/libvips" - Network accessline 1449
"node_modules/@img/sharp-win32-ia32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - Network accessline 1450
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - Network accessline 1451
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - Network accessline 1463
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1464
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1465
"url": "https://opencollective.com/libvips" - Network accessline 1468
"node_modules/@img/sharp-win32-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - Network accessline 1469
"version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - Network accessline 1470
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - Network accessline 1482
}, "funding": { "url": "https://opencollective.com/libvips" - Network accessline 1483
"funding": { "url": "https://opencollective.com/libvips" } - Network accessline 1484
"url": "https://opencollective.com/libvips" - Network accessline 1487
"node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 1488
"version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - Network accessline 1489
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 1498
"node_modules/@jridgewell/remapping": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - Network accessline 1499
"version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - Network accessline 1500
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - Network accessline 1509
"node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 1510
"version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - Network accessline 1511
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 1519
"node_modules/@jridgewell/sourcemap-codec": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - Network accessline 1520
"version": "1.6.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==" - Network accessline 1521
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - Network accessline 1525
"node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 1526
"version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - Network accessline 1527
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 1536
"node_modules/@mdx-js/mdx": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - Network accessline 1537
"version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", - Network accessline 1538
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", - Network accessline 1568
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 1569
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 1570
"url": "https://opencollective.com/unified" - Network accessline 1573
"node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - Network accessline 1574
"version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - Network accessline 1575
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - Network accessline 1583
"funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 1584
"type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, - Network accessline 1585
"url": "https://github.com/sponsors/Brooooooklyn" - Network accessline 1592
"node_modules/@next/env": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz", - Network accessline 1593
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz", "integrity": "sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==", - Network accessline 1594
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz", - Network accessline 1598
"node_modules/@next/eslint-plugin-next": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.10.tgz", - Network accessline 1599
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.10.tgz", "integrity": "sha512-Gs8D2m21VnJeFo9qvYIIqJH94frWerWYu41BprU1pLtRVF7PCQNLiFZZ3fG+iPuj3K83Cwv/rt+msLOy8Qgu3 - Network accessline 1600
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.10.tgz", - Network accessline 1608
"node_modules/@next/swc-darwin-arm64": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz", - Network accessline 1609
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz", "integrity": "sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==" - Network accessline 1610
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz", - Network accessline 1624
"node_modules/@next/swc-darwin-x64": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz", - Network accessline 1625
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz", "integrity": "sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==", - Network accessline 1626
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz", - Network accessline 1640
"node_modules/@next/swc-linux-arm64-gnu": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz", - Network accessline 1641
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz", "integrity": "sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4Piic - Network accessline 1642
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz", - Network accessline 1656
"node_modules/@next/swc-linux-arm64-musl": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz", - Network accessline 1657
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz", "integrity": "sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07p - Network accessline 1658
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz", - Network accessline 1672
"node_modules/@next/swc-linux-x64-gnu": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz", - Network accessline 1673
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz", "integrity": "sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA= - Network accessline 1674
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz", - Network accessline 1688
"node_modules/@next/swc-linux-x64-musl": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz", - Network accessline 1689
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz", "integrity": "sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtack - Network accessline 1690
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz", - Network accessline 1704
"node_modules/@next/swc-win32-arm64-msvc": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz", - Network accessline 1705
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz", "integrity": "sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1j - Network accessline 1706
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz", - Network accessline 1720
"node_modules/@next/swc-win32-x64-msvc": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz", - Network accessline 1721
"version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz", "integrity": "sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/ - Network accessline 1722
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz", - Network accessline 1736
"node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - Network accessline 1737
"version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - Network accessline 1738
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - Network accessline 1750
"node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - Network accessline 1751
"version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - Network accessline 1752
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - Network accessline 1760
"node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - Network accessline 1761
"version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - Network accessline 1762
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - Network accessline 1774
"node_modules/@nolyfill/is-core-module": { "version": "1.0.39", "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - Network accessline 1775
"version": "1.0.39", "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - Network accessline 1776
"resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - Network accessline 1784
"node_modules/@oxc-project/types": { "version": "0.151.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", - Network accessline 1785
"version": "0.151.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", - Network accessline 1786
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", - Network accessline 1789
"license": "MIT", "funding": { "url": "https://github.com/sponsors/oxc-project" - Network accessline 1790
"funding": { "url": "https://github.com/sponsors/oxc-project" } - Network accessline 1791
"url": "https://github.com/sponsors/oxc-project" - Network accessline 1794
"node_modules/@radix-ui/number": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", - Network accessline 1795
"version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", - Network accessline 1796
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", - Network accessline 1800
"node_modules/@radix-ui/primitive": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", - Network accessline 1801
"version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", - Network accessline 1802
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", - Network accessline 1806
"node_modules/@radix-ui/react-accordion": { "version": "1.2.20", "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", - Network accessline 1807
"version": "1.2.20", "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==" - Network accessline 1808
"resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", - Network accessline 1837
"node_modules/@radix-ui/react-arrow": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", - Network accessline 1838
"version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", - Network accessline 1839
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", - Network accessline 1860
"node_modules/@radix-ui/react-collapsible": { "version": "1.1.20", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", - Network accessline 1861
"version": "1.1.20", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8 - Network accessline 1862
"resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", - Network accessline 1890
"node_modules/@radix-ui/react-collection": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", - Network accessline 1891
"version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA= - Network accessline 1892
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", - Network accessline 1916
"node_modules/@radix-ui/react-compose-refs": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", - Network accessline 1917
"version": "1.1.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61k - Network accessline 1918
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", - Network accessline 1931
"node_modules/@radix-ui/react-context": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", - Network accessline 1932
"version": "1.2.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", - Network accessline 1933
"resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", - Network accessline 1946
"node_modules/@radix-ui/react-dialog": { "version": "1.1.23", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", - Network accessline 1947
"version": "1.1.23", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", - Network accessline 1948
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", - Network accessline 1983
"node_modules/@radix-ui/react-direction": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", - Network accessline 1984
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", - Network accessline 1985
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", - Network accessline 1998
"node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", - Network accessline 1999
"version": "1.1.19", "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4 - Network accessline 2000
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", - Network accessline 2025
"node_modules/@radix-ui/react-focus-guards": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", - Network accessline 2026
"version": "1.1.6", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPo - Network accessline 2027
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", - Network accessline 2040
"node_modules/@radix-ui/react-focus-scope": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", - Network accessline 2041
"version": "1.1.16", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFI - Network accessline 2042
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", - Network accessline 2065
"node_modules/@radix-ui/react-id": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", - Network accessline 2066
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", - Network accessline 2067
"resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", - Network accessline 2083
"node_modules/@radix-ui/react-navigation-menu": { "version": "1.2.22", "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", - Network accessline 2084
"version": "1.2.22", "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", "integrity": "sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgB - Network accessline 2085
"resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", - Network accessline 2119
"node_modules/@radix-ui/react-popover": { "version": "1.1.23", "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", - Network accessline 2120
"version": "1.1.23", "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", - Network accessline 2121
"resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", - Network accessline 2156
"node_modules/@radix-ui/react-popper": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", - Network accessline 2157
"version": "1.3.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", - Network accessline 2158
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", - Network accessline 2188
"node_modules/@radix-ui/react-portal": { "version": "1.1.17", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", - Network accessline 2189
"version": "1.1.17", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", - Network accessline 2190
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", - Network accessline 2212
"node_modules/@radix-ui/react-presence": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", - Network accessline 2213
"version": "1.1.10", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", - Network accessline 2214
"resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", - Network accessline 2235
"node_modules/@radix-ui/react-primitive": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", - Network accessline 2236
"version": "2.1.10", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==" - Network accessline 2237
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", - Network accessline 2258
"node_modules/@radix-ui/react-roving-focus": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", - Network accessline 2259
"version": "1.1.19", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98Lu - Network accessline 2260
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", - Network accessline 2291
"node_modules/@radix-ui/react-scroll-area": { "version": "1.2.18", "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", - Network accessline 2292
"version": "1.2.18", "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", "integrity": "sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8n - Network accessline 2293
"resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", - Network accessline 2322
"node_modules/@radix-ui/react-slot": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", - Network accessline 2323
"version": "1.3.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", - Network accessline 2324
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", - Network accessline 2340
"node_modules/@radix-ui/react-tabs": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", - Network accessline 2341
"version": "1.1.21", "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==", - Network accessline 2342
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", - Network accessline 2370
"node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", - Network accessline 2371
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylz - Network accessline 2372
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", - Network accessline 2385
"node_modules/@radix-ui/react-use-controllable-state": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", - Network accessline 2386
"version": "1.2.6", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6 - Network accessline 2387
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", - Network accessline 2405
"node_modules/@radix-ui/react-use-effect-event": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", - Network accessline 2406
"version": "0.0.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYq - Network accessline 2407
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", - Network accessline 2423
"node_modules/@radix-ui/react-use-is-hydrated": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", - Network accessline 2424
"version": "0.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4 - Network accessline 2425
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", - Network accessline 2438
"node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", - Network accessline 2439
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahY - Network accessline 2440
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", - Network accessline 2453
"node_modules/@radix-ui/react-use-previous": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", - Network accessline 2454
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZ - Network accessline 2455
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", - Network accessline 2468
"node_modules/@radix-ui/react-use-rect": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", - Network accessline 2469
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", - Network accessline 2470
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", - Network accessline 2486
"node_modules/@radix-ui/react-use-size": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", - Network accessline 2487
"version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", - Network accessline 2488
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", - Network accessline 2504
"node_modules/@radix-ui/react-visually-hidden": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", - Network accessline 2505
"version": "1.2.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQ - Network accessline 2506
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", - Network accessline 2527
"node_modules/@radix-ui/rect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", - Network accessline 2528
"version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", - Network accessline 2529
"resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", - Network accessline 2533
"node_modules/@rolldown/binding-android-arm-eabi": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.10.tgz", - Network accessline 2534
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.10.tgz", "integrity": "sha512-bp9svZb+QurZeh+8H4BhrZkifEB0YBNvTVzNSJnJQkj4NrRwmQoDUCGP0vSN7PbvLeM7l1t - Network accessline 2535
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.10.tgz", - Network accessline 2549
"node_modules/@rolldown/binding-android-arm64": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.10.tgz", - Network accessline 2550
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.10.tgz", "integrity": "sha512-wm6Dld3RXUAZ/gRWKyUy+4W1B5CB5UeFaOzsSWJWEdxZXHH8rCYiZ5dGe6oJmhsunAPWzL7FZV+Vt - Network accessline 2551
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.10.tgz", - Network accessline 2565
"node_modules/@rolldown/binding-darwin-arm64": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.10.tgz", - Network accessline 2566
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.10.tgz", "integrity": "sha512-UbEfXq/AqGNgRTV3ik+X/iR6mUxu2QdYAadwRxJWquUGnW6gDqdP1FtLtFXRow7RJx0ssRwi80XAPr4 - Network accessline 2567
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.10.tgz", - Network accessline 2581
"node_modules/@rolldown/binding-darwin-x64": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.10.tgz", - Network accessline 2582
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.10.tgz", "integrity": "sha512-7f5h17q5KZVx/ji1vb8OTq31ch1O2I7K8NPIr44GkyWTApXMIsmhWqZfgpOH10xeauqghDAvGlZktasCkcF - Network accessline 2583
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.10.tgz", - Network accessline 2597
"node_modules/@rolldown/binding-freebsd-x64": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.10.tgz", - Network accessline 2598
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.10.tgz", "integrity": "sha512-ynOk/eEYhC6ZB2xCGvKrEOwE58oBy9LnrAqtkrDF9Fz1VTaNdGZTsV0VarJdhPwb+sOJTGjCLwcuyRJZ1 - Network accessline 2599
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.10.tgz", - Network accessline 2613
"node_modules/@rolldown/binding-linux-arm-gnueabihf": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.10.tgz", - Network accessline 2614
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.10.tgz", "integrity": "sha512-ERrAs185meZZhGan7a4l3RiiJK1ArSDlHdST++uvSxe+FDbR4TwUPahT/cbZJvaG6 - Network accessline 2615
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.10.tgz", - Network accessline 2629
"node_modules/@rolldown/binding-linux-arm64-gnu": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.10.tgz", - Network accessline 2630
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.10.tgz", "integrity": "sha512-KN7OHKD0J3jy1UzBwZWPxpwhODf9IARUIJcrH+yLYKOcmegZ8luEUM38lDP1bDVj40yP6PsSz - Network accessline 2631
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.10.tgz", - Network accessline 2648
"node_modules/@rolldown/binding-linux-arm64-musl": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.10.tgz", - Network accessline 2649
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.10.tgz", "integrity": "sha512-8l9wP8O+wa8zD6iw6egSfzVtu7oZVfH3hlUsMM4MwbLMhxleqeoXbZzjddyK3YyNlwLhqzn - Network accessline 2650
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.10.tgz", - Network accessline 2667
"node_modules/@rolldown/binding-linux-ppc64-gnu": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.10.tgz", - Network accessline 2668
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.10.tgz", "integrity": "sha512-SeXNKeQzA5kLhz/J0CH6ZP0/HJ3v1xm/0YbiYpE0kK7emfRC2OIGGIaE14xzkISEGv2aYuUSp - Network accessline 2669
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.10.tgz", - Network accessline 2686
"node_modules/@rolldown/binding-linux-s390x-gnu": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.10.tgz", - Network accessline 2687
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.10.tgz", "integrity": "sha512-mtht0nR+y8/hart4175Ll15w7lY8dg7CtQ+j2FDNTsDRspOWTK/2V3l0aj9sIj7XmvqxT8Yli - Network accessline 2688
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.10.tgz", - Network accessline 2705
"node_modules/@rolldown/binding-linux-x64-gnu": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.10.tgz", - Network accessline 2706
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.10.tgz", "integrity": "sha512-FSM94nGd55NYo48usCyM/nHfUKRnqc9+b0vJNuKV0oCCpIp/OGims7rO1Nv/DkFkt0S/s2rxsJ2kk - Network accessline 2707
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.10.tgz", - Network accessline 2724
"node_modules/@rolldown/binding-linux-x64-musl": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.10.tgz", - Network accessline 2725
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.10.tgz", "integrity": "sha512-C3YxNB16myRLs7o+B+6PnQ6jBsdIS4+AE4Ah8glVGhDpEv9AOvxhZ/1duAb4B0UGczEK/lBbcck - Network accessline 2726
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.10.tgz", - Network accessline 2743
"node_modules/@rolldown/binding-openharmony-arm64": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.10.tgz", - Network accessline 2744
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.10.tgz", "integrity": "sha512-571TlE/F1eeTjjdjYAMMMPs1Mfv3MtX6s3+ZKVU6HiUjZ5Njc6c/qzNy/8K3zALTZnaw3 - Network accessline 2745
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.10.tgz", - Network accessline 2759
"node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.10.tgz", - Network accessline 2760
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.10.tgz", "integrity": "sha512-QXW+ZWaiqs2c7Fi++D/SsW07LTPcUrncxcskJGfGNBoaLik1IU6fJymz4HsqwEO0u5Iq11y - Network accessline 2761
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.10.tgz", - Network accessline 2775
"node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.10.tgz", - Network accessline 2776
"version": "1.2.10", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.10.tgz", "integrity": "sha512-5FQFGgah17YeMtG1Yd5a+rMxQpTksyNXxRtKz06FVTaQw3RKYUJQbUoKk0/5jrXBpDo+7makNP7 - Network accessline 2777
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.10.tgz", - Network accessline 2791
"node_modules/@rolldown/pluginutils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - Network accessline 2792
"version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - Network accessline 2793
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - Network accessline 2798
"node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - Network accessline 2799
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - Network accessline 2800
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - Network accessline 2805
"node_modules/@shikijs/core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", - Network accessline 2806
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", - Network accessline 2807
"resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", - Network accessline 2821
"node_modules/@shikijs/engine-javascript": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", - Network accessline 2822
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ== - Network accessline 2823
"resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", - Network accessline 2835
"node_modules/@shikijs/engine-oniguruma": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", - Network accessline 2836
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", - Network accessline 2837
"resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", - Network accessline 2848
"node_modules/@shikijs/langs": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", - Network accessline 2849
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", - Network accessline 2850
"resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", - Network accessline 2860
"node_modules/@shikijs/primitive": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", - Network accessline 2861
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", - Network accessline 2862
"resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", - Network accessline 2874
"node_modules/@shikijs/themes": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", - Network accessline 2875
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", - Network accessline 2876
"resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", - Network accessline 2886
"node_modules/@shikijs/types": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", - Network accessline 2887
"version": "4.4.3", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", - Network accessline 2888
"resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", - Network accessline 2899
"node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - Network accessline 2900
"version": "10.0.2", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - Network accessline 2901
"resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - Network accessline 2905
"node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - Network accessline 2906
"version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - Network accessline 2907
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - Network accessline 2911
"node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - Network accessline 2912
"version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - Network accessline 2913
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - Network accessline 2920
"node_modules/@tailwindcss/node": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", - Network accessline 2921
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", - Network accessline 2922
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", - Network accessline 2936
"node_modules/@tailwindcss/node/node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - Network accessline 2937
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - Network accessline 2938
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - Network accessline 2948
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 2949
"type": "opencollective", "url": "https://opencollective.com/parcel" }, - Network accessline 2950
"url": "https://opencollective.com/parcel" - Network accessline 2966
"node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - Network accessline 2967
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgH - Network accessline 2968
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - Network accessline 2982
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 2983
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 2984
"url": "https://opencollective.com/parcel" - Network accessline 2987
"node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - Network accessline 2988
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc - Network accessline 2989
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - Network accessline 3003
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3004
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3005
"url": "https://opencollective.com/parcel" - Network accessline 3008
"node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - Network accessline 3009
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73 - Network accessline 3010
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - Network accessline 3024
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3025
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3026
"url": "https://opencollective.com/parcel" - Network accessline 3029
"node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - Network accessline 3030
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK - Network accessline 3031
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - Network accessline 3045
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3046
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3047
"url": "https://opencollective.com/parcel" - Network accessline 3050
"node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - Network accessline 3051
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsP - Network accessline 3052
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - Network accessline 3066
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3067
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3068
"url": "https://opencollective.com/parcel" - Network accessline 3071
"node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - Network accessline 3072
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbeb - Network accessline 3073
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - Network accessline 3090
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3091
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3092
"url": "https://opencollective.com/parcel" - Network accessline 3095
"node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - Network accessline 3096
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJ - Network accessline 3097
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - Network accessline 3114
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3115
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3116
"url": "https://opencollective.com/parcel" - Network accessline 3119
"node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - Network accessline 3120
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI - Network accessline 3121
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - Network accessline 3138
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3139
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3140
"url": "https://opencollective.com/parcel" - Network accessline 3143
"node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - Network accessline 3144
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j - Network accessline 3145
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - Network accessline 3162
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3163
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3164
"url": "https://opencollective.com/parcel" - Network accessline 3167
"node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - Network accessline 3168
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx - Network accessline 3169
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - Network accessline 3183
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3184
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3185
"url": "https://opencollective.com/parcel" - Network accessline 3188
"node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - Network accessline 3189
"version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnj - Network accessline 3190
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - Network accessline 3204
"funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - Network accessline 3205
"type": "opencollective", "url": "https://opencollective.com/parcel" } - Network accessline 3206
"url": "https://opencollective.com/parcel" - Network accessline 3209
"node_modules/@tailwindcss/oxide": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", - Network accessline 3210
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", - Network accessline 3211
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", - Network accessline 3233
"node_modules/@tailwindcss/oxide-android-arm64": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", - Network accessline 3234
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBCl - Network accessline 3235
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", - Network accessline 3250
"node_modules/@tailwindcss/oxide-darwin-arm64": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", - Network accessline 3251
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lf - Network accessline 3252
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", - Network accessline 3267
"node_modules/@tailwindcss/oxide-darwin-x64": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", - Network accessline 3268
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw - Network accessline 3269
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", - Network accessline 3284
"node_modules/@tailwindcss/oxide-freebsd-x64": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", - Network accessline 3285
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4 - Network accessline 3286
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", - Network accessline 3301
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", - Network accessline 3302
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMm - Network accessline 3303
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", - Network accessline 3318
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", - Network accessline 3319
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus - Network accessline 3320
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", - Network accessline 3338
"node_modules/@tailwindcss/oxide-linux-arm64-musl": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", - Network accessline 3339
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL - Network accessline 3340
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", - Network accessline 3358
"node_modules/@tailwindcss/oxide-linux-x64-gnu": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", - Network accessline 3359
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onun - Network accessline 3360
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", - Network accessline 3378
"node_modules/@tailwindcss/oxide-linux-x64-musl": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", - Network accessline 3379
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNC - Network accessline 3380
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", - Network accessline 3398
"node_modules/@tailwindcss/oxide-wasm32-wasi": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", - Network accessline 3399
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlG - Network accessline 3400
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", - Network accessline 3428
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", - Network accessline 3429
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTq - Network accessline 3430
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", - Network accessline 3445
"node_modules/@tailwindcss/oxide-win32-x64-msvc": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", - Network accessline 3446
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvW - Network accessline 3447
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", - Network accessline 3462
"node_modules/@tailwindcss/postcss": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", - Network accessline 3463
"version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", - Network accessline 3464
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", - Network accessline 3476
"node_modules/@tailwindcss/postcss/node_modules/postcss": { "version": "8.5.28", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - Network accessline 3477
"version": "8.5.28", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", - Network accessline 3478
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", - Network accessline 3482
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 3483
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 3484
"url": "https://opencollective.com/postcss/" - Network accessline 3486
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 3487
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, - Network accessline 3488
"url": "https://tidelift.com/funding/github/npm/postcss" - Network accessline 3490
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 3491
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 3492
"url": "https://github.com/sponsors/ai" - Network accessline 3505
"node_modules/@tybys/wasm-util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - Network accessline 3506
"version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - Network accessline 3507
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - Network accessline 3516
"node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - Network accessline 3517
"version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - Network accessline 3518
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - Network accessline 3527
"node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - Network accessline 3528
"version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - Network accessline 3529
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - Network accessline 3536
"node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - Network accessline 3537
"version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - Network accessline 3538
"resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - Network accessline 3543
"node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - Network accessline 3544
"version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - Network accessline 3545
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - Network accessline 3549
"node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - Network accessline 3550
"version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - Network accessline 3551
"resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - Network accessline 3558
"node_modules/@types/hast": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - Network accessline 3559
"version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", - Network accessline 3560
"resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", - Network accessline 3567
"node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - Network accessline 3568
"version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - Network accessline 3569
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - Network accessline 3574
"node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - Network accessline 3575
"version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - Network accessline 3576
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - Network accessline 3581
"node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - Network accessline 3582
"version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - Network accessline 3583
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - Network accessline 3590
"node_modules/@types/mdx": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", - Network accessline 3591
"version": "2.0.14", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", - Network accessline 3592
"resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", - Network accessline 3596
"node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - Network accessline 3597
"version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - Network accessline 3598
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - Network accessline 3602
"node_modules/@types/node": { "version": "20.19.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - Network accessline 3603
"version": "20.19.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", - Network accessline 3604
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - Network accessline 3612
"node_modules/@types/react": { "version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - Network accessline 3613
"version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - Network accessline 3614
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - Network accessline 3622
"node_modules/@types/react-dom": { "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - Network accessline 3623
"version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - Network accessline 3624
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - Network accessline 3632
"node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - Network accessline 3633
"version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - Network accessline 3634
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - Network accessline 3638
"node_modules/@typescript-eslint/eslint-plugin": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz", - Network accessline 3639
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz", "integrity": "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJU - Network accessline 3640
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz", - Network accessline 3657
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3658
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3659
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3667
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - Network accessline 3668
"version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - Network accessline 3669
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - Network accessline 3677
"node_modules/@typescript-eslint/parser": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz", - Network accessline 3678
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz", "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==", - Network accessline 3679
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz", - Network accessline 3693
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3694
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3695
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3702
"node_modules/@typescript-eslint/project-service": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz", - Network accessline 3703
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz", "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1f - Network accessline 3704
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz", - Network accessline 3716
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3717
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3718
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3724
"node_modules/@typescript-eslint/scope-manager": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz", - Network accessline 3725
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz", "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPk - Network accessline 3726
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz", - Network accessline 3737
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3738
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } - Network accessline 3739
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3742
"node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz", - Network accessline 3743
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz", "integrity": "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6du - Network accessline 3744
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz", - Network accessline 3751
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3752
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3753
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3759
"node_modules/@typescript-eslint/type-utils": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz", - Network accessline 3760
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz", "integrity": "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==", - Network accessline 3761
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz", - Network accessline 3775
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3776
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3777
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3784
"node_modules/@typescript-eslint/types": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", - Network accessline 3785
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", "integrity": "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==", - Network accessline 3786
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", - Network accessline 3793
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3794
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } - Network accessline 3795
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3798
"node_modules/@typescript-eslint/typescript-estree": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz", - Network accessline 3799
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz", "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL - Network accessline 3800
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz", - Network accessline 3818
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3819
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3820
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3826
"node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - Network accessline 3827
"version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - Network accessline 3828
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - Network accessline 3836
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - Network accessline 3837
"version": "5.0.7", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", - Network accessline 3838
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - Network accessline 3849
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - Network accessline 3850
"version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - Network accessline 3851
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - Network accessline 3860
}, "funding": { "url": "https://github.com/sponsors/isaacs" - Network accessline 3861
"funding": { "url": "https://github.com/sponsors/isaacs" } - Network accessline 3862
"url": "https://github.com/sponsors/isaacs" - Network accessline 3865
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - Network accessline 3866
"version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - Network accessline 3867
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - Network accessline 3878
"node_modules/@typescript-eslint/utils": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz", - Network accessline 3879
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz", "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", - Network accessline 3880
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz", - Network accessline 3893
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3894
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - Network accessline 3895
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3902
"node_modules/@typescript-eslint/visitor-keys": { "version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz", - Network accessline 3903
"version": "8.62.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz", "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g - Network accessline 3904
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz", - Network accessline 3915
"funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - Network accessline 3916
"type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } - Network accessline 3917
"url": "https://opencollective.com/typescript-eslint" - Network accessline 3920
"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - Network accessline 3921
"version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - Network accessline 3922
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - Network accessline 3928
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 3929
"funding": { "url": "https://opencollective.com/eslint" } - Network accessline 3930
"url": "https://opencollective.com/eslint" - Network accessline 3933
"node_modules/@ungap/structured-clone": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - Network accessline 3934
"version": "1.3.3", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", - Network accessline 3935
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - Network accessline 3939
"node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", - Network accessline 3940
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0 - Network accessline 3941
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", - Network accessline 3953
"node_modules/@unrs/resolver-binding-android-arm64": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", - Network accessline 3954
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoy - Network accessline 3955
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", - Network accessline 3967
"node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", - Network accessline 3968
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w - Network accessline 3969
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", - Network accessline 3981
"node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", - Network accessline 3982
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRX - Network accessline 3983
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", - Network accessline 3995
"node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", - Network accessline 3996
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOB - Network accessline 3997
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", - Network accessline 4009
"node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", - Network accessline 4010
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4 - Network accessline 4011
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", - Network accessline 4023
"node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", - Network accessline 4024
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03 - Network accessline 4025
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", - Network accessline 4037
"node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", - Network accessline 4038
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann - Network accessline 4039
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", - Network accessline 4051
"node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", - Network accessline 4052
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6Gaxrfc - Network accessline 4053
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", - Network accessline 4065
"node_modules/@unrs/resolver-binding-linux-loong64-gnu": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", - Network accessline 4066
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3g - Network accessline 4067
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", - Network accessline 4079
"node_modules/@unrs/resolver-binding-linux-loong64-musl": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", - Network accessline 4080
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGn - Network accessline 4081
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", - Network accessline 4093
"node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", - Network accessline 4094
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH2 - Network accessline 4095
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", - Network accessline 4107
"node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", - Network accessline 4108
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9m - Network accessline 4109
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", - Network accessline 4121
"node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", - Network accessline 4122
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkk - Network accessline 4123
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", - Network accessline 4135
"node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", - Network accessline 4136
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqi - Network accessline 4137
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", - Network accessline 4149
"node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", - Network accessline 4150
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP4 - Network accessline 4151
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", - Network accessline 4163
"node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", - Network accessline 4164
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPc - Network accessline 4165
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", - Network accessline 4177
"node_modules/@unrs/resolver-binding-openharmony-arm64": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", - Network accessline 4178
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV0 - Network accessline 4179
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", - Network accessline 4191
"node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", - Network accessline 4192
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2b - Network accessline 4193
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", - Network accessline 4210
"node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/runtime": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - Network accessline 4211
"version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - Network accessline 4212
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - Network accessline 4221
"node_modules/@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", - Network accessline 4222
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+ - Network accessline 4223
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", - Network accessline 4235
"node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", - Network accessline 4236
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpF - Network accessline 4237
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", - Network accessline 4249
"node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", - Network accessline 4250
"version": "1.12.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUI - Network accessline 4251
"resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", - Network accessline 4263
"node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - Network accessline 4264
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", "integrity": "sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==", - Network accessline 4265
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", - Network accessline 4276
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4277
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 4278
"url": "https://opencollective.com/vitest" - Network accessline 4281
"node_modules/@vitest/mocker": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - Network accessline 4282
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - Network accessline 4283
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - Network accessline 4291
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4292
"funding": { "url": "https://opencollective.com/vitest" }, - Network accessline 4293
"url": "https://opencollective.com/vitest" - Network accessline 4308
"node_modules/@vitest/pretty-format": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - Network accessline 4309
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", "integrity": "sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==", - Network accessline 4310
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.6.tgz", - Network accessline 4316
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4317
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 4318
"url": "https://opencollective.com/vitest" - Network accessline 4321
"node_modules/@vitest/runner": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - Network accessline 4322
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", "integrity": "sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==", - Network accessline 4323
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.6.tgz", - Network accessline 4330
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4331
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 4332
"url": "https://opencollective.com/vitest" - Network accessline 4335
"node_modules/@vitest/snapshot": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - Network accessline 4336
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", "integrity": "sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==", - Network accessline 4337
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.6.tgz", - Network accessline 4346
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4347
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 4348
"url": "https://opencollective.com/vitest" - Network accessline 4351
"node_modules/@vitest/spy": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - Network accessline 4352
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", "integrity": "sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==", - Network accessline 4353
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.6.tgz", - Network accessline 4356
"license": "MIT", "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4357
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 4358
"url": "https://opencollective.com/vitest" - Network accessline 4361
"node_modules/@vitest/utils": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - Network accessline 4362
"version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", "integrity": "sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==", - Network accessline 4363
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.6.tgz", - Network accessline 4371
}, "funding": { "url": "https://opencollective.com/vitest" - Network accessline 4372
"funding": { "url": "https://opencollective.com/vitest" } - Network accessline 4373
"url": "https://opencollective.com/vitest" - Network accessline 4376
"node_modules/@yuku-analyzer/binding-android-arm64": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-android-arm64/-/binding-android-arm64-0.10.2.tgz", - Network accessline 4377
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-android-arm64/-/binding-android-arm64-0.10.2.tgz", "integrity": "sha512-xt4Vy3RTBw1NfszBlf4A0Rr6ZjA/th2Pj9XlWFLQHW9A1qOCtxNCoIWSzn/INtnZLMB4jO2g - Network accessline 4378
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-android-arm64/-/binding-android-arm64-0.10.2.tgz", - Network accessline 4389
"node_modules/@yuku-analyzer/binding-darwin-arm64": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-darwin-arm64/-/binding-darwin-arm64-0.10.2.tgz", - Network accessline 4390
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-darwin-arm64/-/binding-darwin-arm64-0.10.2.tgz", "integrity": "sha512-ftokSqvYXZxfmA/bfIbp8c1BJ8QxNax371kUOQNFyvR5hmtKqQyTqSKtMk+WaixHM3w4tKj/Jd - Network accessline 4391
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-darwin-arm64/-/binding-darwin-arm64-0.10.2.tgz", - Network accessline 4402
"node_modules/@yuku-analyzer/binding-darwin-x64": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-darwin-x64/-/binding-darwin-x64-0.10.2.tgz", - Network accessline 4403
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-darwin-x64/-/binding-darwin-x64-0.10.2.tgz", "integrity": "sha512-yUrmmhmF5R4Xmbfo8gUxJKr3YbvbLcE2JvLhDLzFJkMN29/fGm6K3dZX6YpNecfgBDnQ+VywGp8K9x - Network accessline 4404
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-darwin-x64/-/binding-darwin-x64-0.10.2.tgz", - Network accessline 4415
"node_modules/@yuku-analyzer/binding-freebsd-x64": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-freebsd-x64/-/binding-freebsd-x64-0.10.2.tgz", - Network accessline 4416
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-freebsd-x64/-/binding-freebsd-x64-0.10.2.tgz", "integrity": "sha512-cy9+KvVoK5Xad3Vs5pLwAeZf3JC/1y0XJElgv1q6g7W7g/n52FRjedpYmQiJeMZdnhJiAshq7Vz/ - Network accessline 4417
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-freebsd-x64/-/binding-freebsd-x64-0.10.2.tgz", - Network accessline 4428
"node_modules/@yuku-analyzer/binding-linux-arm-gnu": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.10.2.tgz", - Network accessline 4429
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.10.2.tgz", "integrity": "sha512-AgVZ6VCV2XP4yHCwyv78KLV76gcu2neiEF2+RBTPQN7sqYY+bLvMxphGPmfG+9qk5Uf1PJAh - Network accessline 4430
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.10.2.tgz", - Network accessline 4444
"node_modules/@yuku-analyzer/binding-linux-arm-musl": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm-musl/-/binding-linux-arm-musl-0.10.2.tgz", - Network accessline 4445
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm-musl/-/binding-linux-arm-musl-0.10.2.tgz", "integrity": "sha512-5qAj2GjoSN6+HuH75+g5r40CFhWmMvH0K8VKWmPfQyOgA/LonoDMr5H5O5feJwzdnfdCyt - Network accessline 4446
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm-musl/-/binding-linux-arm-musl-0.10.2.tgz", - Network accessline 4460
"node_modules/@yuku-analyzer/binding-linux-arm64-gnu": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.10.2.tgz", - Network accessline 4461
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.10.2.tgz", "integrity": "sha512-eJvQ4Ja5oPf/HOjmBkCLYyhOHUkL7U+iMAN8sX44x8exBBpPRyqnhEgTsuU73HzxPLrG - Network accessline 4462
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.10.2.tgz", - Network accessline 4476
"node_modules/@yuku-analyzer/binding-linux-arm64-musl": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.10.2.tgz", - Network accessline 4477
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.10.2.tgz", "integrity": "sha512-TppF2j194mOQ/kBXvNr9u5TYO+eR9r8ieg4lTIEyJIVYHAR9GWeB0oFHLcJiLXVa3q - Network accessline 4478
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.10.2.tgz", - Network accessline 4492
"node_modules/@yuku-analyzer/binding-linux-x64-gnu": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.10.2.tgz", - Network accessline 4493
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.10.2.tgz", "integrity": "sha512-03xu6ocJuwhm1a/JKmrHiaJUO1Oj86rABsm4FAl8AvfewfW/9idIUmPiFxZfb6RfiIONegeb - Network accessline 4494
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.10.2.tgz", - Network accessline 4508
"node_modules/@yuku-analyzer/binding-linux-x64-musl": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-x64-musl/-/binding-linux-x64-musl-0.10.2.tgz", - Network accessline 4509
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-x64-musl/-/binding-linux-x64-musl-0.10.2.tgz", "integrity": "sha512-f7W2sAWWQN8x8YB0RRxIche7mLImH7lDgzUy9+B69cM2I6VFJ4a5+0pgAuMLROPOqimaxF - Network accessline 4510
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-linux-x64-musl/-/binding-linux-x64-musl-0.10.2.tgz", - Network accessline 4524
"node_modules/@yuku-analyzer/binding-win32-arm64": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-win32-arm64/-/binding-win32-arm64-0.10.2.tgz", - Network accessline 4525
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-win32-arm64/-/binding-win32-arm64-0.10.2.tgz", "integrity": "sha512-f534qNc5YaJI29e1oryxEnxPkp7WCYJ1j7ChSec8pQNlYqTm8Tao7hij7NxRF+9BuxzeZCZ+Wsba - Network accessline 4526
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-win32-arm64/-/binding-win32-arm64-0.10.2.tgz", - Network accessline 4537
"node_modules/@yuku-analyzer/binding-win32-x64": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-win32-x64/-/binding-win32-x64-0.10.2.tgz", - Network accessline 4538
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-win32-x64/-/binding-win32-x64-0.10.2.tgz", "integrity": "sha512-sKHkmLK8BsindMfyIThoN0bWC5uqSJEVNaLRD/ifA99mtb0UDin1ZCg4WYSVQAmM4k2iOTl4UZx/p3zc - Network accessline 4539
"resolved": "https://registry.npmjs.org/@yuku-analyzer/binding-win32-x64/-/binding-win32-x64-0.10.2.tgz", - Network accessline 4550
"node_modules/@yuku-toolchain/types": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.10.2.tgz", - Network accessline 4551
"version": "0.10.2", "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.10.2.tgz", "integrity": "sha512-sSeo4SSSToiS+sSD+bwn/s94EEcaLJ7tG5LCp8gFYC1G5VzxzX7fqB6m9RU1yMD8KTpu6zdU/I1NlQf8hVBJ9Q==", - Network accessline 4552
"resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.10.2.tgz", - Network accessline 4556
"node_modules/acorn": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - Network accessline 4557
"version": "8.17.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - Network accessline 4558
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - Network accessline 4568
"node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - Network accessline 4569
"version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - Network accessline 4570
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - Network accessline 4577
"node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - Network accessline 4578
"version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - Network accessline 4579
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - Network accessline 4589
"funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" - Network accessline 4590
"type": "github", "url": "https://github.com/sponsors/epoberezkin" } - Network accessline 4591
"url": "https://github.com/sponsors/epoberezkin" - Network accessline 4594
"node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - Network accessline 4595
"version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - Network accessline 4596
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - Network accessline 4605
}, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 4606
"funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - Network accessline 4607
"url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 4610
"node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - Network accessline 4611
"version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - Network accessline 4612
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - Network accessline 4617
"node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - Network accessline 4618
"version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - Network accessline 4619
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - Network accessline 4629
"node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - Network accessline 4630
"version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - Network accessline 4631
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - Network accessline 4639
"node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - Network accessline 4640
"version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1 - Network accessline 4641
"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - Network accessline 4651
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4652
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4653
"url": "https://github.com/sponsors/ljharb" - Network accessline 4656
"node_modules/array-includes": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - Network accessline 4657
"version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - Network accessline 4658
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - Network accessline 4674
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4675
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4676
"url": "https://github.com/sponsors/ljharb" - Network accessline 4679
"node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - Network accessline 4680
"version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2e - Network accessline 4681
"resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - Network accessline 4695
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4696
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4697
"url": "https://github.com/sponsors/ljharb" - Network accessline 4700
"node_modules/array.prototype.findlastindex": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - Network accessline 4701
"version": "1.2.6", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/ - Network accessline 4702
"resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - Network accessline 4717
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4718
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4719
"url": "https://github.com/sponsors/ljharb" - Network accessline 4722
"node_modules/array.prototype.flat": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - Network accessline 4723
"version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - Network accessline 4724
"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - Network accessline 4736
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4737
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4738
"url": "https://github.com/sponsors/ljharb" - Network accessline 4741
"node_modules/array.prototype.flatmap": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - Network accessline 4742
"version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpj - Network accessline 4743
"resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - Network accessline 4755
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4756
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4757
"url": "https://github.com/sponsors/ljharb" - Network accessline 4760
"node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - Network accessline 4761
"version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC - Network accessline 4762
"resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - Network accessline 4777
"node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - Network accessline 4778
"version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/T - Network accessline 4779
"resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - Network accessline 4794
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4795
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4796
"url": "https://github.com/sponsors/ljharb" - Network accessline 4799
"node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - Network accessline 4800
"version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - Network accessline 4801
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - Network accessline 4809
"node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - Network accessline 4810
"version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - Network accessline 4811
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - Network accessline 4816
"node_modules/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - Network accessline 4817
"version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - Network accessline 4818
"resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - Network accessline 4825
"node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - Network accessline 4826
"version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - Network accessline 4827
"resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - Network accessline 4835
"node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - Network accessline 4836
"version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ= - Network accessline 4837
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - Network accessline 4846
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4847
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4848
"url": "https://github.com/sponsors/ljharb" - Network accessline 4851
"node_modules/axe-core": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", - Network accessline 4852
"version": "4.12.1", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", - Network accessline 4853
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", - Network accessline 4861
"node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - Network accessline 4862
"version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - Network accessline 4863
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - Network accessline 4871
"node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - Network accessline 4872
"version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - Network accessline 4873
"resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - Network accessline 4876
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 4877
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 4878
"url": "https://github.com/sponsors/wooorm" - Network accessline 4881
"node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - Network accessline 4882
"version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - Network accessline 4883
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - Network accessline 4888
"node_modules/baseline-browser-mapping": { "version": "2.10.42", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", - Network accessline 4889
"version": "2.10.42", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYN - Network accessline 4890
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", - Network accessline 4900
"node_modules/brace-expansion": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - Network accessline 4901
"version": "1.1.15", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - Network accessline 4902
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - Network accessline 4911
"node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - Network accessline 4912
"version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - Network accessline 4913
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - Network accessline 4924
"node_modules/browserslist": { "version": "4.28.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - Network accessline 4925
"version": "4.28.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - Network accessline 4926
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - Network accessline 4930
{ "type": "opencollective", "url": "https://opencollective.com/browserslist" - Network accessline 4931
"type": "opencollective", "url": "https://opencollective.com/browserslist" }, - Network accessline 4932
"url": "https://opencollective.com/browserslist" - Network accessline 4934
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" - Network accessline 4935
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, - Network accessline 4936
"url": "https://tidelift.com/funding/github/npm/browserslist" - Network accessline 4938
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 4939
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 4940
"url": "https://github.com/sponsors/ai" - Network accessline 4958
"node_modules/call-bind": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - Network accessline 4959
"version": "1.0.9", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - Network accessline 4960
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - Network accessline 4972
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 4973
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 4974
"url": "https://github.com/sponsors/ljharb" - Network accessline 4977
"node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - Network accessline 4978
"version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuM - Network accessline 4979
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - Network accessline 4991
"node_modules/call-bound": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - Network accessline 4992
"version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - Network accessline 4993
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - Network accessline 5003
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5004
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5005
"url": "https://github.com/sponsors/ljharb" - Network accessline 5008
"node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - Network accessline 5009
"version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - Network accessline 5010
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - Network accessline 5018
"node_modules/caniuse-lite": { "version": "1.0.30001800", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", - Network accessline 5019
"version": "1.0.30001800", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", - Network accessline 5020
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", - Network accessline 5023
{ "type": "opencollective", "url": "https://opencollective.com/browserslist" - Network accessline 5024
"type": "opencollective", "url": "https://opencollective.com/browserslist" }, - Network accessline 5025
"url": "https://opencollective.com/browserslist" - Network accessline 5027
{ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - Network accessline 5028
"type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, - Network accessline 5029
"url": "https://tidelift.com/funding/github/npm/caniuse-lite" - Network accessline 5031
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 5032
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 5033
"url": "https://github.com/sponsors/ai" - Network accessline 5038
"node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - Network accessline 5039
"version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - Network accessline 5040
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - Network accessline 5043
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5044
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5045
"url": "https://github.com/sponsors/wooorm" - Network accessline 5048
"node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - Network accessline 5049
"version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - Network accessline 5050
"resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - Network accessline 5058
"node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - Network accessline 5059
"version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - Network accessline 5060
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - Network accessline 5070
}, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 5071
"funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } - Network accessline 5072
"url": "https://github.com/chalk/chalk?sponsor=1" - Network accessline 5075
"node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - Network accessline 5076
"version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - Network accessline 5077
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - Network accessline 5080
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5081
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5082
"url": "https://github.com/sponsors/wooorm" - Network accessline 5085
"node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - Network accessline 5086
"version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qD - Network accessline 5087
"resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - Network accessline 5090
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5091
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5092
"url": "https://github.com/sponsors/wooorm" - Network accessline 5095
"node_modules/character-entities-legacy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - Network accessline 5096
"version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wyd - Network accessline 5097
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - Network accessline 5100
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5101
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5102
"url": "https://github.com/sponsors/wooorm" - Network accessline 5105
"node_modules/character-reference-invalid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - Network accessline 5106
"version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0 - Network accessline 5107
"resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - Network accessline 5110
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5111
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5112
"url": "https://github.com/sponsors/wooorm" - Network accessline 5115
"node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - Network accessline 5116
"version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - Network accessline 5117
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - Network accessline 5125
}, "funding": { "url": "https://paulmillr.com/funding/" - Network accessline 5126
"funding": { "url": "https://paulmillr.com/funding/" } - Network accessline 5127
"url": "https://paulmillr.com/funding/" - Network accessline 5130
"node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - Network accessline 5131
"version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkeP - Network accessline 5132
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - Network accessline 5137
}, "funding": { "url": "https://polar.sh/cva" - Network accessline 5138
"funding": { "url": "https://polar.sh/cva" } - Network accessline 5139
"url": "https://polar.sh/cva" - Network accessline 5142
"node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - Network accessline 5143
"version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - Network accessline 5144
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - Network accessline 5148
"node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - Network accessline 5149
"version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - Network accessline 5150
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - Network accessline 5157
"node_modules/cn": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/cn/-/cn-0.3.3.tgz", - Network accessline 5158
"version": "0.3.3", "resolved": "https://registry.npmjs.org/cn/-/cn-0.3.3.tgz", "integrity": "sha512-OEiyJkSpYm2kOuNOKQ+c2wmzZRG8orrb9fnObtHTbCGNx/E9KLnGcmcocItOzREKk5KzQN5I2e3BUCj563KEpw==", - Network accessline 5159
"resolved": "https://registry.npmjs.org/cn/-/cn-0.3.3.tgz", - Network accessline 5169
"node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - Network accessline 5170
"version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - Network accessline 5171
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - Network accessline 5174
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5175
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5176
"url": "https://github.com/sponsors/wooorm" - Network accessline 5179
"node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - Network accessline 5180
"version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - Network accessline 5181
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - Network accessline 5192
"node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - Network accessline 5193
"version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - Network accessline 5194
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - Network accessline 5199
"node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - Network accessline 5200
"version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg= - Network accessline 5201
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - Network accessline 5204
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5205
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5206
"url": "https://github.com/sponsors/wooorm" - Network accessline 5209
"node_modules/compute-scroll-into-view": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", - Network accessline 5210
"version": "3.1.1", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUv - Network accessline 5211
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", - Network accessline 5215
"node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - Network accessline 5216
"version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - Network accessline 5217
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - Network accessline 5222
"node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - Network accessline 5223
"version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - Network accessline 5224
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - Network accessline 5229
"node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - Network accessline 5230
"version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - Network accessline 5231
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - Network accessline 5244
"node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - Network accessline 5245
"version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - Network accessline 5246
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - Network accessline 5251
"node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - Network accessline 5252
"version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - Network accessline 5253
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - Network accessline 5258
"node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - Network accessline 5259
"version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - Network accessline 5260
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - Network accessline 5271
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5272
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5273
"url": "https://github.com/sponsors/ljharb" - Network accessline 5276
"node_modules/data-view-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - Network accessline 5277
"version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==" - Network accessline 5278
"resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - Network accessline 5289
}, "funding": { "url": "https://github.com/sponsors/inspect-js" - Network accessline 5290
"funding": { "url": "https://github.com/sponsors/inspect-js" } - Network accessline 5291
"url": "https://github.com/sponsors/inspect-js" - Network accessline 5294
"node_modules/data-view-byte-offset": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - Network accessline 5295
"version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==" - Network accessline 5296
"resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - Network accessline 5307
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5308
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5309
"url": "https://github.com/sponsors/ljharb" - Network accessline 5312
"node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 5313
"version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - Network accessline 5314
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 5329
"node_modules/decode-named-character-reference": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - Network accessline 5330
"version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mM - Network accessline 5331
"resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - Network accessline 5337
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5338
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5339
"url": "https://github.com/sponsors/wooorm" - Network accessline 5342
"node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - Network accessline 5343
"version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - Network accessline 5344
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - Network accessline 5349
"node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - Network accessline 5350
"version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - Network accessline 5351
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - Network accessline 5362
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5363
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5364
"url": "https://github.com/sponsors/ljharb" - Network accessline 5367
"node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - Network accessline 5368
"version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - Network accessline 5369
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - Network accessline 5380
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5381
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5382
"url": "https://github.com/sponsors/ljharb" - Network accessline 5385
"node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - Network accessline 5386
"version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - Network accessline 5387
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - Network accessline 5394
"node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - Network accessline 5395
"version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - Network accessline 5396
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - Network accessline 5404
"node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - Network accessline 5405
"version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - Network accessline 5406
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - Network accessline 5410
"node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - Network accessline 5411
"version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - Network accessline 5412
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - Network accessline 5418
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 5419
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 5420
"url": "https://github.com/sponsors/wooorm" - Network accessline 5423
"node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - Network accessline 5424
"version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - Network accessline 5425
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - Network accessline 5436
"node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - Network accessline 5437
"version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - Network accessline 5438
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - Network accessline 5451
"node_modules/electron-to-chromium": { "version": "1.5.387", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", - Network accessline 5452
"version": "1.5.387", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", "integrity": "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ= - Network accessline 5453
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", - Network accessline 5458
"node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - Network accessline 5459
"version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - Network accessline 5460
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - Network accessline 5465
"node_modules/enhanced-resolve": { "version": "5.25.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", - Network accessline 5466
"version": "5.25.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", - Network accessline 5467
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", - Network accessline 5479
"node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - Network accessline 5480
"version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - Network accessline 5481
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - Network accessline 5486
}, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 5487
"funding": { "url": "https://github.com/fb55/entities?sponsor=1" } - Network accessline 5488
"url": "https://github.com/fb55/entities?sponsor=1" - Network accessline 5491
"node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - Network accessline 5492
"version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - Network accessline 5493
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - Network accessline 5555
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5556
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5557
"url": "https://github.com/sponsors/ljharb" - Network accessline 5560
"node_modules/es-abstract-get": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", - Network accessline 5561
"version": "1.0.0", "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", - Network accessline 5562
"resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", - Network accessline 5574
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5575
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5576
"url": "https://github.com/sponsors/ljharb" - Network accessline 5579
"node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - Network accessline 5580
"version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - Network accessline 5581
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - Network accessline 5589
"node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - Network accessline 5590
"version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - Network accessline 5591
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - Network accessline 5599
"node_modules/es-iterator-helpers": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", - Network accessline 5600
"version": "1.3.3", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==", - Network accessline 5601
"resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", - Network accessline 5627
"node_modules/es-module-lexer": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - Network accessline 5628
"version": "2.3.2", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - Network accessline 5629
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - Network accessline 5634
"node_modules/es-object-atoms": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - Network accessline 5635
"version": "1.1.2", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - Network accessline 5636
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - Network accessline 5647
"node_modules/es-set-tostringtag": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - Network accessline 5648
"version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - Network accessline 5649
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - Network accessline 5663
"node_modules/es-shim-unscopables": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - Network accessline 5664
"version": "1.1.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - Network accessline 5665
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - Network accessline 5676
"node_modules/es-to-primitive": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", - Network accessline 5677
"version": "1.3.4", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", - Network accessline 5678
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", - Network accessline 5692
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 5693
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 5694
"url": "https://github.com/sponsors/ljharb" - Network accessline 5697
"node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - Network accessline 5698
"version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ= - Network accessline 5699
"resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", - Network accessline 5708
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 5709
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 5710
"url": "https://opencollective.com/unified" - Network accessline 5713
"node_modules/esast-util-from-js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - Network accessline 5714
"version": "2.0.1", "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - Network accessline 5715
"resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", - Network accessline 5724
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 5725
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 5726
"url": "https://opencollective.com/unified" - Network accessline 5729
"node_modules/esbuild": { "version": "0.28.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - Network accessline 5730
"version": "0.28.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", - Network accessline 5731
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - Network accessline 5770
"node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 5771
"version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - Network accessline 5772
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 5780
"node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - Network accessline 5781
"version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - Network accessline 5782
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - Network accessline 5788
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 5789
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 5790
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 5793
"node_modules/eslint": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - Network accessline 5794
"version": "9.39.4", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - Network accessline 5795
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - Network accessline 5840
}, "funding": { "url": "https://eslint.org/donate" - Network accessline 5841
"funding": { "url": "https://eslint.org/donate" }, - Network accessline 5842
"url": "https://eslint.org/donate" - Network accessline 5853
"node_modules/eslint-config-next": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.10.tgz", - Network accessline 5854
"version": "16.2.10", "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.10.tgz", "integrity": "sha512-HSybLOY0QKf39i4FWUqPN0xWiNDi6A6UqJmZtgDkS3zMqjXTqULvj/sueXx3cdCG0mVG+qH6k5/qdegklH1d1w==", - Network accessline 5855
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.10.tgz", - Network accessline 5880
"node_modules/eslint-config-next/node_modules/globals": { "version": "16.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - Network accessline 5881
"version": "16.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", - Network accessline 5882
"resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - Network accessline 5888
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 5889
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 5890
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 5893
"node_modules/eslint-import-resolver-node": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - Network accessline 5894
"version": "0.3.10", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1 - Network accessline 5895
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - Network accessline 5905
"node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - Network accessline 5906
"version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - Network accessline 5907
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - Network accessline 5915
"node_modules/eslint-import-resolver-typescript": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - Network accessline 5916
"version": "3.10.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c - Network accessline 5917
"resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - Network accessline 5932
}, "funding": { "url": "https://opencollective.com/eslint-import-resolver-typescript" - Network accessline 5933
"funding": { "url": "https://opencollective.com/eslint-import-resolver-typescript" }, - Network accessline 5934
"url": "https://opencollective.com/eslint-import-resolver-typescript" - Network accessline 5950
"node_modules/eslint-module-utils": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", - Network accessline 5951
"version": "2.14.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", - Network accessline 5952
"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", - Network accessline 5968
"node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - Network accessline 5969
"version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - Network accessline 5970
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - Network accessline 5978
"node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - Network accessline 5979
"version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==" - Network accessline 5980
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - Network accessline 6012
"node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - Network accessline 6013
"version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - Network accessline 6014
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - Network accessline 6022
"node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - Network accessline 6023
"version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2 - Network accessline 6024
"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - Network accessline 6052
"node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - Network accessline 6053
"version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - Network accessline 6054
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - Network accessline 6085
"node_modules/eslint-plugin-react-hooks": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - Network accessline 6086
"version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1 - Network accessline 6087
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - Network accessline 6105
"node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - Network accessline 6106
"version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - Network accessline 6107
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - Network accessline 6117
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 6118
"funding": { "url": "https://opencollective.com/eslint" } - Network accessline 6119
"url": "https://opencollective.com/eslint" - Network accessline 6122
"node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - Network accessline 6123
"version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - Network accessline 6124
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - Network accessline 6130
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 6131
"funding": { "url": "https://opencollective.com/eslint" } - Network accessline 6132
"url": "https://opencollective.com/eslint" - Network accessline 6135
"node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - Network accessline 6136
"version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - Network accessline 6137
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - Network accessline 6148
}, "funding": { "url": "https://opencollective.com/eslint" - Network accessline 6149
"funding": { "url": "https://opencollective.com/eslint" } - Network accessline 6150
"url": "https://opencollective.com/eslint" - Network accessline 6153
"node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - Network accessline 6154
"version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - Network accessline 6155
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - Network accessline 6166
"node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - Network accessline 6167
"version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - Network accessline 6168
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - Network accessline 6179
"node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - Network accessline 6180
"version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - Network accessline 6181
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - Network accessline 6189
"node_modules/estree-util-attach-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - Network accessline 6190
"version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60 - Network accessline 6191
"resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - Network accessline 6197
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 6198
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 6199
"url": "https://opencollective.com/unified" - Network accessline 6202
"node_modules/estree-util-build-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - Network accessline 6203
"version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==" - Network accessline 6204
"resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - Network accessline 6213
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 6214
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 6215
"url": "https://opencollective.com/unified" - Network accessline 6218
"node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - Network accessline 6219
"version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVi - Network accessline 6220
"resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - Network accessline 6223
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 6224
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 6225
"url": "https://opencollective.com/unified" - Network accessline 6228
"node_modules/estree-util-scope": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz", - Network accessline 6229
"version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz", "integrity": "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==", - Network accessline 6230
"resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz", - Network accessline 6237
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 6238
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 6239
"url": "https://opencollective.com/unified" - Network accessline 6242
"node_modules/estree-util-to-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - Network accessline 6243
"version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - Network accessline 6244
"resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - Network accessline 6252
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 6253
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 6254
"url": "https://opencollective.com/unified" - Network accessline 6257
"node_modules/estree-util-value-to-estree": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - Network accessline 6258
"version": "3.5.0", "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9 - Network accessline 6259
"resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - Network accessline 6264
}, "funding": { "url": "https://github.com/sponsors/remcohaszing" - Network accessline 6265
"funding": { "url": "https://github.com/sponsors/remcohaszing" } - Network accessline 6266
"url": "https://github.com/sponsors/remcohaszing" - Network accessline 6269
"node_modules/estree-util-visit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - Network accessline 6270
"version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - Network accessline 6271
"resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - Network accessline 6278
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 6279
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 6280
"url": "https://opencollective.com/unified" - Network accessline 6283
"node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - Network accessline 6284
"version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - Network accessline 6285
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - Network accessline 6292
"node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - Network accessline 6293
"version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - Network accessline 6294
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - Network accessline 6302
"node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - Network accessline 6303
"version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", - Network accessline 6304
"resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - Network accessline 6312
"node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - Network accessline 6313
"version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - Network accessline 6314
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - Network accessline 6318
"node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - Network accessline 6319
"version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - Network accessline 6320
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - Network accessline 6325
"node_modules/fast-glob": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - Network accessline 6326
"version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - Network accessline 6327
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - Network accessline 6342
"node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - Network accessline 6343
"version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - Network accessline 6344
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - Network accessline 6355
"node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - Network accessline 6356
"version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjC - Network accessline 6357
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - Network accessline 6362
"node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - Network accessline 6363
"version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - Network accessline 6364
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - Network accessline 6369
"node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - Network accessline 6370
"version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - Network accessline 6371
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - Network accessline 6379
"node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - Network accessline 6380
"version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - Network accessline 6381
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - Network accessline 6392
"node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - Network accessline 6393
"version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - Network accessline 6394
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - Network accessline 6405
"node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - Network accessline 6406
"version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - Network accessline 6407
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - Network accessline 6417
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6418
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6419
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6422
"node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - Network accessline 6423
"version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - Network accessline 6424
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - Network accessline 6436
"node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - Network accessline 6437
"version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - Network accessline 6438
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - Network accessline 6443
"node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - Network accessline 6444
"version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - Network accessline 6445
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - Network accessline 6454
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6455
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6456
"url": "https://github.com/sponsors/ljharb" - Network accessline 6459
"node_modules/framer-motion": { "version": "12.42.2", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz", - Network accessline 6460
"version": "12.42.2", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz", "integrity": "sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==", - Network accessline 6461
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.2.tgz", - Network accessline 6486
"node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 6487
"version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - Network accessline 6488
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 6500
"node_modules/fumadocs-core": { "version": "16.15.13", "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.15.13.tgz", - Network accessline 6501
"version": "16.15.13", "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.15.13.tgz", "integrity": "sha512-ze12PWStBn3S7LB6nuTHDoIY9EW66Hs/IQvvHDQHr3IftcKvxDkVWNeKGlnkSkmZvDPyXXkmFghMN/qo/nbicA==", - Network accessline 6502
"resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.15.13.tgz", - Network accessline 6607
"node_modules/fumadocs-mdx": { "version": "15.4.3", "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-15.4.3.tgz", - Network accessline 6608
"version": "15.4.3", "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-15.4.3.tgz", "integrity": "sha512-CWhSg6BsJlEtSLcuCKyHIN1NT+n5G7llmsnM2v8RfGixzrinmLQdQ2dAe8Jt7svp1yBCAFObvtC6UdJ0oqn55A==", - Network accessline 6609
"resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-15.4.3.tgz", - Network accessline 6682
"node_modules/fumadocs-mdx/node_modules/magic-string": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", - Network accessline 6683
"version": "1.4.2", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", - Network accessline 6684
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", - Network accessline 6691
"node_modules/fumadocs-mdx/node_modules/picomatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - Network accessline 6692
"version": "4.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - Network accessline 6693
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - Network accessline 6698
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 6699
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 6700
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 6703
"node_modules/fumadocs-ui": { "version": "16.15.13", "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.15.13.tgz", - Network accessline 6704
"version": "16.15.13", "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.15.13.tgz", "integrity": "sha512-Q636/K0gApaLDOoP0beC24/ojMDTKZyvnBSOzZ2O7Zz5cKECKStPPaYAwHcVYRmpI/Qf+AhfYKIx7PyEHM+zMg==", - Network accessline 6705
"resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.15.13.tgz", - Network accessline 6756
"node_modules/fumadocs-ui/node_modules/framer-motion": { "version": "13.4.2", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.4.2.tgz", - Network accessline 6757
"version": "13.4.2", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.4.2.tgz", "integrity": "sha512-yrC5GJqlGbuZEz2DFaH+VUCrBwlA6mM5v/Sfazd83/IRpWdOdVqgZmsAZWoS30YTuA3PCbGNL2JIWyGVmeimsA==", - Network accessline 6758
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.4.2.tgz", - Network accessline 6779
"node_modules/fumadocs-ui/node_modules/motion": { "version": "13.4.2", "resolved": "https://registry.npmjs.org/motion/-/motion-13.4.2.tgz", - Network accessline 6780
"version": "13.4.2", "resolved": "https://registry.npmjs.org/motion/-/motion-13.4.2.tgz", "integrity": "sha512-PlwVlwO7Ibhv2gZMX9ZqE7eGfSmbeU9Yf+mqkvJFdDSyTK7inlKRCry7IpofrcIU8JY7++83614eG7TJ7ORC2w==", - Network accessline 6781
"resolved": "https://registry.npmjs.org/motion/-/motion-13.4.2.tgz", - Network accessline 6801
"node_modules/fumadocs-ui/node_modules/motion-dom": { "version": "13.4.2", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.4.2.tgz", - Network accessline 6802
"version": "13.4.2", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.4.2.tgz", "integrity": "sha512-mY293Iyj4rOQo5sDxUwPYLOKiveLQrJoK1tKfG8V1H3MMGMfan3s2i7NBW18WnD39DD79ogyiL/1fmy22GLG5w==", - Network accessline 6803
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.4.2.tgz", - Network accessline 6810
"node_modules/fumadocs-ui/node_modules/motion-utils": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.3.0.tgz", - Network accessline 6811
"version": "13.3.0", "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.3.0.tgz", "integrity": "sha512-sgSschQp7EseHInIlR7hBbMuvet3RA0bs28KPZAXJcGKGdxHGvh1ogpYDilY3bOMtl73EqPNmp75sAKHYPU5sg==", - Network accessline 6812
"resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.3.0.tgz", - Network accessline 6816
"node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - Network accessline 6817
"version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - Network accessline 6818
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - Network accessline 6821
"license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6822
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6823
"url": "https://github.com/sponsors/ljharb" - Network accessline 6826
"node_modules/function.prototype.name": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", - Network accessline 6827
"version": "1.2.0", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/e - Network accessline 6828
"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", - Network accessline 6845
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6846
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6847
"url": "https://github.com/sponsors/ljharb" - Network accessline 6850
"node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - Network accessline 6851
"version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - Network accessline 6852
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - Network accessline 6855
"license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6856
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6857
"url": "https://github.com/sponsors/ljharb" - Network accessline 6860
"node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - Network accessline 6861
"version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - Network accessline 6862
"resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - Network accessline 6870
"node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - Network accessline 6871
"version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - Network accessline 6872
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - Network accessline 6880
"node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - Network accessline 6881
"version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - Network accessline 6882
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - Network accessline 6900
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6901
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6902
"url": "https://github.com/sponsors/ljharb" - Network accessline 6905
"node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - Network accessline 6906
"version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - Network accessline 6907
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - Network accessline 6914
"node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - Network accessline 6915
"version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - Network accessline 6916
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - Network accessline 6928
"node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - Network accessline 6929
"version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg= - Network accessline 6930
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - Network accessline 6941
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 6942
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 6943
"url": "https://github.com/sponsors/ljharb" - Network accessline 6946
"node_modules/get-tsconfig": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - Network accessline 6947
"version": "4.14.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", - Network accessline 6948
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - Network accessline 6954
}, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - Network accessline 6955
"funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } - Network accessline 6956
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - Network accessline 6959
"node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - Network accessline 6960
"version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - Network accessline 6961
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - Network accessline 6965
"node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - Network accessline 6966
"version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - Network accessline 6967
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - Network accessline 6978
"node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - Network accessline 6979
"version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - Network accessline 6980
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - Network accessline 6986
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 6987
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 6988
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 6991
"node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - Network accessline 6992
"version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - Network accessline 6993
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - Network accessline 7003
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7004
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7005
"url": "https://github.com/sponsors/ljharb" - Network accessline 7008
"node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - Network accessline 7009
"version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - Network accessline 7010
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - Network accessline 7016
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7017
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7018
"url": "https://github.com/sponsors/ljharb" - Network accessline 7021
"node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - Network accessline 7022
"version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - Network accessline 7023
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - Network accessline 7028
"node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - Network accessline 7029
"version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - Network accessline 7030
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - Network accessline 7036
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7037
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7038
"url": "https://github.com/sponsors/ljharb" - Network accessline 7041
"node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - Network accessline 7042
"version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - Network accessline 7043
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - Network accessline 7051
"node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - Network accessline 7052
"version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJd - Network accessline 7053
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - Network accessline 7059
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7060
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7061
"url": "https://github.com/sponsors/ljharb" - Network accessline 7064
"node_modules/has-proto": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - Network accessline 7065
"version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - Network accessline 7066
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - Network accessline 7075
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7076
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7077
"url": "https://github.com/sponsors/ljharb" - Network accessline 7080
"node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - Network accessline 7081
"version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - Network accessline 7082
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - Network accessline 7088
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7089
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7090
"url": "https://github.com/sponsors/ljharb" - Network accessline 7093
"node_modules/has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - Network accessline 7094
"version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - Network accessline 7095
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - Network accessline 7104
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7105
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7106
"url": "https://github.com/sponsors/ljharb" - Network accessline 7109
"node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - Network accessline 7110
"version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - Network accessline 7111
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - Network accessline 7122
"node_modules/hast-util-from-parse5": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - Network accessline 7123
"version": "8.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==" - Network accessline 7124
"resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - Network accessline 7137
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7138
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7139
"url": "https://opencollective.com/unified" - Network accessline 7142
"node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - Network accessline 7143
"version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliD - Network accessline 7144
"resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - Network accessline 7150
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7151
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7152
"url": "https://opencollective.com/unified" - Network accessline 7155
"node_modules/hast-util-raw": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - Network accessline 7156
"version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", - Network accessline 7157
"resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - Network accessline 7175
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7176
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7177
"url": "https://opencollective.com/unified" - Network accessline 7180
"node_modules/hast-util-to-estree": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - Network accessline 7181
"version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - Network accessline 7182
"resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", - Network accessline 7203
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7204
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7205
"url": "https://opencollective.com/unified" - Network accessline 7208
"node_modules/hast-util-to-html": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - Network accessline 7209
"version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - Network accessline 7210
"resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - Network accessline 7226
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7227
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7228
"url": "https://opencollective.com/unified" - Network accessline 7231
"node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - Network accessline 7232
"version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCb - Network accessline 7233
"resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - Network accessline 7253
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7254
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7255
"url": "https://opencollective.com/unified" - Network accessline 7258
"node_modules/hast-util-to-parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - Network accessline 7259
"version": "8.0.1", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", - Network accessline 7260
"resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", - Network accessline 7272
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7273
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7274
"url": "https://opencollective.com/unified" - Network accessline 7277
"node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - Network accessline 7278
"version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - Network accessline 7279
"resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - Network accessline 7285
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7286
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7287
"url": "https://opencollective.com/unified" - Network accessline 7290
"node_modules/hastscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - Network accessline 7291
"version": "9.0.1", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - Network accessline 7292
"resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - Network accessline 7302
"funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - Network accessline 7303
"type": "opencollective", "url": "https://opencollective.com/unified" } - Network accessline 7304
"url": "https://opencollective.com/unified" - Network accessline 7307
"node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - Network accessline 7308
"version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - Network accessline 7309
"resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - Network accessline 7314
"node_modules/hermes-parser": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - Network accessline 7315
"version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - Network accessline 7316
"resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - Network accessline 7324
"node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - Network accessline 7325
"version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - Network accessline 7326
"resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - Network accessline 7329
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 7330
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 7331
"url": "https://github.com/sponsors/wooorm" - Network accessline 7334
"node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - Network accessline 7335
"version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - Network accessline 7336
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - Network accessline 7344
"node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - Network accessline 7345
"version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - Network accessline 7346
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - Network accessline 7356
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 7357
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 7358
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 7361
"node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - Network accessline 7362
"version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - Network accessline 7363
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - Network accessline 7371
"node_modules/inline-style-parser": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - Network accessline 7372
"version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - Network accessline 7373
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - Network accessline 7377
"node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - Network accessline 7378
"version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - Network accessline 7379
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - Network accessline 7392
"node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - Network accessline 7393
"version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - Network accessline 7394
"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - Network accessline 7397
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 7398
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 7399
"url": "https://github.com/sponsors/wooorm" - Network accessline 7402
"node_modules/is-alphanumerical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - Network accessline 7403
"version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - Network accessline 7404
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - Network accessline 7411
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 7412
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 7413
"url": "https://github.com/sponsors/wooorm" - Network accessline 7416
"node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - Network accessline 7417
"version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - Network accessline 7418
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - Network accessline 7429
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7430
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7431
"url": "https://github.com/sponsors/ljharb" - Network accessline 7434
"node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - Network accessline 7435
"version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - Network accessline 7436
"resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - Network accessline 7449
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7450
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7451
"url": "https://github.com/sponsors/ljharb" - Network accessline 7454
"node_modules/is-bigint": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - Network accessline 7455
"version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - Network accessline 7456
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - Network accessline 7465
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7466
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7467
"url": "https://github.com/sponsors/ljharb" - Network accessline 7470
"node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - Network accessline 7471
"version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - Network accessline 7472
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - Network accessline 7482
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7483
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7484
"url": "https://github.com/sponsors/ljharb" - Network accessline 7487
"node_modules/is-bun-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - Network accessline 7488
"version": "2.0.0", "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - Network accessline 7489
"resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - Network accessline 7497
"node_modules/is-bun-module/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - Network accessline 7498
"version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - Network accessline 7499
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - Network accessline 7510
"node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - Network accessline 7511
"version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - Network accessline 7512
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - Network accessline 7518
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7519
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7520
"url": "https://github.com/sponsors/ljharb" - Network accessline 7523
"node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - Network accessline 7524
"version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - Network accessline 7525
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - Network accessline 7534
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7535
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7536
"url": "https://github.com/sponsors/ljharb" - Network accessline 7539
"node_modules/is-data-view": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - Network accessline 7540
"version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - Network accessline 7541
"resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - Network accessline 7552
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7553
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7554
"url": "https://github.com/sponsors/ljharb" - Network accessline 7557
"node_modules/is-date-object": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - Network accessline 7558
"version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - Network accessline 7559
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - Network accessline 7569
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7570
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7571
"url": "https://github.com/sponsors/ljharb" - Network accessline 7574
"node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - Network accessline 7575
"version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - Network accessline 7576
"resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - Network accessline 7579
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 7580
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 7581
"url": "https://github.com/sponsors/wooorm" - Network accessline 7584
"node_modules/is-document.all": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", - Network accessline 7585
"version": "1.0.0", "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", - Network accessline 7586
"resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", - Network accessline 7595
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7596
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7597
"url": "https://github.com/sponsors/ljharb" - Network accessline 7600
"node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - Network accessline 7601
"version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - Network accessline 7602
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - Network accessline 7610
"node_modules/is-finalizationregistry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - Network accessline 7611
"version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrys - Network accessline 7612
"resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - Network accessline 7621
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7622
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7623
"url": "https://github.com/sponsors/ljharb" - Network accessline 7626
"node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - Network accessline 7627
"version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==" - Network accessline 7628
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - Network accessline 7641
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7642
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7643
"url": "https://github.com/sponsors/ljharb" - Network accessline 7646
"node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - Network accessline 7647
"version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - Network accessline 7648
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - Network accessline 7659
"node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - Network accessline 7660
"version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - Network accessline 7661
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - Network accessline 7664
"funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" - Network accessline 7665
"type": "github", "url": "https://github.com/sponsors/wooorm" } - Network accessline 7666
"url": "https://github.com/sponsors/wooorm" - Network accessline 7669
"node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - Network accessline 7670
"version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - Network accessline 7671
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - Network accessline 7677
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7678
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7679
"url": "https://github.com/sponsors/ljharb" - Network accessline 7682
"node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - Network accessline 7683
"version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - Network accessline 7684
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - Network accessline 7690
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7691
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7692
"url": "https://github.com/sponsors/ljharb" - Network accessline 7695
"node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - Network accessline 7696
"version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - Network accessline 7697
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - Network accessline 7705
"node_modules/is-number-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - Network accessline 7706
"version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - Network accessline 7707
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - Network accessline 7717
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7718
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7719
"url": "https://github.com/sponsors/ljharb" - Network accessline 7722
"node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - Network accessline 7723
"version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - Network accessline 7724
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - Network accessline 7729
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 7730
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 7731
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 7734
"node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - Network accessline 7735
"version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - Network accessline 7736
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - Network accessline 7748
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7749
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7750
"url": "https://github.com/sponsors/ljharb" - Network accessline 7753
"node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - Network accessline 7754
"version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - Network accessline 7755
"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - Network accessline 7761
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7762
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7763
"url": "https://github.com/sponsors/ljharb" - Network accessline 7766
"node_modules/is-shared-array-buffer": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - Network accessline 7767
"version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A= - Network accessline 7768
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - Network accessline 7777
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7778
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7779
"url": "https://github.com/sponsors/ljharb" - Network accessline 7782
"node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - Network accessline 7783
"version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - Network accessline 7784
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - Network accessline 7794
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7795
"funding": { "url": "https://github.com/sponsors/ljharb" } - Network accessline 7796
"url": "https://github.com/sponsors/ljharb" - Network accessline 7799
"node_modules/is-symbol": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - Network accessline 7800
"version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - Network accessline 7801
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - Network accessline 7812
}, "funding": { "url": "https://github.com/sponsors/ljharb" - Network accessline 7814
"url": "https://github.com/sponsors/ljharb"
site/package.json
- Executable scriptline 1
Executable file
site/postcss.config.mjs
- Executable scriptline 1
Executable file
site/public/promo/anatomy-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="668" viewBox="0 0 920 668" role="img" aria-label="Anatomy of a wigolo search result: explainable score decomposition, live engine telemetry, surfaced degradation, and self-flagged
site/public/promo/anatomy.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="668" viewBox="0 0 920 668" role="img" aria-label="Anatomy of a wigolo search result: explainable score decomposition, live engine telemetry, surfaced degradation, and self-flagged
site/public/promo/ask-twice-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="400" viewBox="0 0 880 400" role="img" aria-label="Ask twice, pay never: the first query hits the live web in 3.6 seconds, the second answers from local cache in milliseconds, and t
site/public/promo/ask-twice.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="400" viewBox="0 0 880 400" role="img" aria-label="Ask twice, pay never: the first query hits the live web in 3.6 seconds, the second answers from local cache in milliseconds, and t
site/public/promo/fusion-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="520" viewBox="0 0 880 520" role="img" aria-label="18 search engines fused by reciprocal rank fusion, reranked by an on-device cross-encoder, producing one scored answer">
site/public/promo/fusion.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="520" viewBox="0 0 880 520" role="img" aria-label="18 search engines fused by reciprocal rank fusion, reranked by an on-device cross-encoder, producing one scored answer">
site/public/promo/ladder-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="440" viewBox="0 0 880 440" role="img" aria-label="wigolo's fetch escalation ladder: plain HTTP first, TLS-impersonation on anti-bot challenges, headless browser on SPA shells — dec
site/public/promo/ladder.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="440" viewBox="0 0 880 440" role="img" aria-label="wigolo's fetch escalation ladder: plain HTTP first, TLS-impersonation on anti-bot challenges, headless browser on SPA shells — dec
site/public/promo/meter-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="380" viewBox="0 0 880 380" role="img" aria-label="The meter: a metered cloud API's cost climbs with every query while wigolo stays at zero dollars, flat, forever. Illustrative pric
site/public/promo/meter.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="880" height="380" viewBox="0 0 880 380" role="img" aria-label="The meter: a metered cloud API's cost climbs with every query while wigolo stays at zero dollars, flat, forever. Illustrative pric
site/public/sponsors/testmu-ai-dark.svg
- Network accessline 1
<svg width="513" height="80" viewBox="0 0 513 80" fill="none" xmlns="http://www.w3.org/2000/svg">
site/public/sponsors/testmu-ai.svg
- Network accessline 1
<svg width="513" height="80" viewBox="0 0 513 80" fill="none" xmlns="http://www.w3.org/2000/svg">
site/scripts/indexnow.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 8
// // Run after a deploy is live. The key is public by design: the engines verify // it by fetching https://wigolo.app/<key>.txt, which ships in public/. - Network accessline 10
// it by fetching https://wigolo.app/<key>.txt, which ships in public/. - Network accessline 20
const sitemap = readFileSync(join(SITE, "out", "sitemap.xml"), "utf8"); const urls = [...sitemap.matchAll(/<loc>([^<]+)<\/loc>/g)].map((m) => m[1]).filter((u) => new URL(u).host === HOST); if (urls.length === 0) throw new Error("No wigolo.a - Network accessline 22
if (urls.length === 0) throw new Error("No wigolo.app URLs in out/sitemap.xml — build with NEXT_PUBLIC_SITE_URL=https://wigolo.app first."); - Network accessline 29
const res = await fetch("https://api.indexnow.org/indexnow", { - Network accessline 30
method: "POST", headers: { "content-type": "application/json; charset=utf-8" }, body: JSON.stringify({ host: HOST, key: KEY, keyLocation: `https://${HOST}/${KEY}.txt`, urlList: urls }), - Network accessline 31
headers: { "content-type": "application/json; charset=utf-8" }, body: JSON.stringify({ host: HOST, key: KEY, keyLocation: `https://${HOST}/${KEY}.txt`, urlList: urls }), }); - Network accessline 32
body: JSON.stringify({ host: HOST, key: KEY, keyLocation: `https://${HOST}/${KEY}.txt`, urlList: urls }),
site/scripts/logo-wall/fetch-logos.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 32
const sourceUrl = (logo) => { if (logo.source === "github-avatar") return `https://github.com/${logo.org}.png?size=128`; - Network accessline 33
if (logo.source === "github-avatar") return `https://github.com/${logo.org}.png?size=128`; - Network accessline 34
if (logo.source === "favicon") return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(logo.domain)}&sz=128`; return null; - Network accessline 35
return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(logo.domain)}&sz=128`; - Network accessline 95
let res; try { res = await fetch(url, { redirect: "follow", signal: AbortSignal.timeout(15000) }); - Network accessline 96
try { res = await fetch(url, { redirect: "follow", signal: AbortSignal.timeout(15000) }); } catch (e) { - Network accessline 97
res = await fetch(url, { redirect: "follow", signal: AbortSignal.timeout(15000) });
site/scripts/logo-wall/mine.mjs
- Executable scriptline 1
#!/usr/bin/env node - Access to secretsline 7
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 35
async function gql(query, variables, attempt = 1) { const res = await fetch("https://api.github.com/graphql", { - Network accessline 36
const res = await fetch("https://api.github.com/graphql", {
site/scripts/logo-wall/normalize.mjs
- Executable scriptline 1
Executable file - Network accessline 90
/** "https://www.acme.io/x" → "acme" (the registrable label). */ - Network accessline 99
export function hostOf(url) { if (typeof url !== "string" || !url.trim()) return ""; const withScheme = /^https?:\/\//i.test(url) ? url : `https://${url}`; - Network accessline 100
if (typeof url !== "string" || !url.trim()) return ""; const withScheme = /^https?:\/\//i.test(url) ? url : `https://${url}`; try { - Network accessline 101
const withScheme = /^https?:\/\//i.test(url) ? url : `https://${url}`;
site/scripts/logo-wall/normalize.test.mjs
- Executable scriptline 1
Executable file - Network accessline 36
test("a URL in the company field becomes its domain label, not 'https:'", () => { assert.deepEqual(splitCompanies("https://www.acme.io/about"), ["acme"]); - Network accessline 37
assert.deepEqual(splitCompanies("https://www.acme.io/about"), ["acme"]); - Network accessline 38
assert.deepEqual(splitCompanies("https://me.github.io"), []); - Network accessline 42
assert.equal(hostMatchesKey("omranjamal.github.io", "omranjamal"), false); assert.equal(hostMatchesKey("optimizely.com", "optimizely"), true); assert.equal(hostMatchesKey(hostOf("https://www.optimizely.com/x"), "optimizely"), true); - Network accessline 43
assert.equal(hostMatchesKey("optimizely.com", "optimizely"), true); assert.equal(hostMatchesKey(hostOf("https://www.optimizely.com/x"), "optimizely"), true); assert.equal(hostMatchesKey("randomblog.com", "optimizely"), false); - Network accessline 44
assert.equal(hostMatchesKey(hostOf("https://www.optimizely.com/x"), "optimizely"), true);
site/scripts/logo-wall/silhouette.mjs
- Executable scriptline 1
Executable file
site/scripts/logo-wall/silhouette.test.mjs
- Executable scriptline 1
Executable file
site/scripts/sync-content.mjs
site/scripts/sync-content.test.mjs
- Executable scriptline 1
Executable file - Network accessline 15
examples: new Set(["rest-curl", "one-shot-cli", "plugin-search-engine"]), }; const GH = "https://github.com/KnockOutEZ/wigolo"; - Network accessline 17
const GH = "https://github.com/KnockOutEZ/wigolo"; - Network accessline 64
test("absolute URLs, anchors and code blocks are left alone", () => { const md = "[x](https://a.b) [y](#h)\n```\n[z](./rest-api.md)\n```"; - Network accessline 65
const md = "[x](https://a.b) [y](#h)\n```\n[z](./rest-api.md)\n```";
site/src/app/alternatives/[slug]/page.tsx
- Executable scriptline 1
Executable file - Network accessline 73
Get started </a> <a className="btn btn-ghost" href="https://github.com/KnockOutEZ/wigolo"> - Network accessline 74
</a> <a className="btn btn-ghost" href="https://github.com/KnockOutEZ/wigolo"> Star on GitHub - Network accessline 75
<a className="btn btn-ghost" href="https://github.com/KnockOutEZ/wigolo">
site/src/app/alternatives/page.tsx
- Executable scriptline 1
Executable file
site/src/app/docs/[[...slug]]/page.tsx
- Executable scriptline 1
Executable file
site/src/app/docs/layout.tsx
- Executable scriptline 1
Executable file
site/src/app/go/[slug]/SponsorCard.tsx
- Executable scriptline 1
Executable file
site/src/app/go/[slug]/SponsorRedirect.tsx
- Executable scriptline 1
Executable file
site/src/app/go/[slug]/page.tsx
- Executable scriptline 1
Executable file
site/src/app/layout.tsx
- Executable scriptline 1
Executable file - Network accessline 47
"no API key", ], authors: [{ name: "Towhid Khan", url: "https://github.com/KnockOutEZ" }], - Network accessline 48
], authors: [{ name: "Towhid Khan", url: "https://github.com/KnockOutEZ" }], creator: "Towhid Khan", - Network accessline 49
authors: [{ name: "Towhid Khan", url: "https://github.com/KnockOutEZ" }],
site/src/app/llms-full.txt/route.ts
- Executable scriptline 1
Executable file
site/src/app/llms.txt/route.ts
- Executable scriptline 1
Executable file
site/src/app/logo-wall.svg/route.ts
- Executable scriptline 1
Executable file - Network accessline 12
) .join(""); return new Response(`<svg xmlns="http://www.w3.org/2000/svg">${symbols}</svg>`, { - Network accessline 13
.join(""); return new Response(`<svg xmlns="http://www.w3.org/2000/svg">${symbols}</svg>`, { headers: { "Content-Type": "image/svg+xml; charset=utf-8" }, - Network accessline 14
return new Response(`<svg xmlns="http://www.w3.org/2000/svg">${symbols}</svg>`, {
site/src/app/page.tsx
- Executable scriptline 1
Executable file
site/src/app/robots.ts
- Executable scriptline 1
Executable file
site/src/app/search.json/route.ts
- Executable scriptline 1
Executable file
site/src/app/sitemap.ts
- Executable scriptline 1
Executable file
site/src/app/sponsors/page.tsx
- Executable scriptline 1
Executable file - Network accessline 144
ktowhid20@gmail.com </a> <a className="btn btn-ghost" href="https://buymeacoffee.com/knockoutez"> - Network accessline 145
</a> <a className="btn btn-ghost" href="https://buymeacoffee.com/knockoutez"> Buy me a coffee - Network accessline 146
<a className="btn btn-ghost" href="https://buymeacoffee.com/knockoutez">
site/src/components/Analytics.tsx
- Executable scriptline 1
Executable file
site/src/components/AnnouncementBar.tsx
- Executable scriptline 1
Executable file
site/src/components/FeatureMarquee.tsx
- Executable scriptline 1
Executable file
site/src/components/Feedback.tsx
- Executable scriptline 1
Executable file - Access to secretsline 7
[Credential-related source omitted] - Network accessline 21
setState("sending"); try { const res = await fetch("https://api.web3forms.com/submit", { - Network accessline 22
try { const res = await fetch("https://api.web3forms.com/submit", { method: "POST", - Network accessline 23
const res = await fetch("https://api.web3forms.com/submit", {
site/src/components/Footer.tsx
- Executable scriptline 1
Executable file - Network accessline 25
links: [ { label: "GitHub", href: GH, ext: true }, { label: "npm", href: "https://www.npmjs.com/package/wigolo", ext: true }, - Network accessline 26
{ label: "GitHub", href: GH, ext: true }, { label: "npm", href: "https://www.npmjs.com/package/wigolo", ext: true }, { label: "Examples", href: `${BASE_PATH}/docs/examples/` }, - Network accessline 27
{ label: "npm", href: "https://www.npmjs.com/package/wigolo", ext: true }, - Network accessline 39
{ label: "Sponsors", href: `${BASE_PATH}/#sponsors` }, { label: "Sponsor wigolo", href: `${BASE_PATH}/sponsors/` }, { label: "Buy me a coffee", href: "https://buymeacoffee.com/knockoutez", ext: true }, - Network accessline 40
{ label: "Sponsor wigolo", href: `${BASE_PATH}/sponsors/` }, { label: "Buy me a coffee", href: "https://buymeacoffee.com/knockoutez", ext: true }, { label: "Email the maintainer", href: "mailto:ktowhid20@gmail.com" }, - Network accessline 41
{ label: "Buy me a coffee", href: "https://buymeacoffee.com/knockoutez", ext: true },
site/src/components/Hero.tsx
- Executable scriptline 1
Executable file
site/src/components/HowItWorks.tsx
- Executable scriptline 1
Executable file
site/src/components/LogoWall.tsx
- Executable scriptline 1
Executable file - Network accessline 79
<a className={styles.noteLink} href="https://github.com/KnockOutEZ/wigolo/issues/new?template=adopter.yml" - Network accessline 80
className={styles.noteLink} href="https://github.com/KnockOutEZ/wigolo/issues/new?template=adopter.yml" target="_blank" - Network accessline 81
href="https://github.com/KnockOutEZ/wigolo/issues/new?template=adopter.yml"
site/src/components/Nav.tsx
site/src/components/OpenSource.tsx
- Executable scriptline 1
Executable file - Network accessline 15
body: "The open-source version is the full product. If wigolo saves you a metered search bill, a coffee keeps it maintained.", cta: "Buy me a coffee", href: "https://buymeacoffee.com/knockoutez", - Network accessline 16
cta: "Buy me a coffee", href: "https://buymeacoffee.com/knockoutez", }, - Network accessline 17
href: "https://buymeacoffee.com/knockoutez", - Network accessline 56
<p className={styles.byline}> built and maintained by{" "} <a href="https://github.com/KnockOutEZ" target="_blank" rel="noreferrer"> - Network accessline 57
built and maintained by{" "} <a href="https://github.com/KnockOutEZ" target="_blank" rel="noreferrer"> @KnockOutEZ - Network accessline 58
<a href="https://github.com/KnockOutEZ" target="_blank" rel="noreferrer">
site/src/components/Parity.tsx
- Executable scriptline 1
Executable file - Network accessline 100
evidence alone —{" "} <a href="https://github.com/KnockOutEZ/wigolo#benchmark" - Network accessline 101
<a href="https://github.com/KnockOutEZ/wigolo#benchmark" target="_blank" - Network accessline 102
href="https://github.com/KnockOutEZ/wigolo#benchmark"
site/src/components/Quickstart.tsx
- Executable scriptline 1
Executable file - Access to secretsline 49
[Credential-related source omitted] - Network accessline 59
<h2 className={styles.title}>Working in under two minutes.</h2> <a href="https://github.com/KnockOutEZ/wigolo" - Network accessline 60
<a href="https://github.com/KnockOutEZ/wigolo" className={styles.preview} - Network accessline 61
href="https://github.com/KnockOutEZ/wigolo"
site/src/components/Reveal.tsx
- Executable scriptline 1
Executable file
site/src/components/SponsorStrip.tsx
- Executable scriptline 1
Executable file
site/src/components/Sponsors.tsx
- Executable scriptline 1
Executable file
site/src/components/StartShipping.tsx
- Executable scriptline 1
Executable file
site/src/components/Stats.tsx
- Executable scriptline 1
Executable file
site/src/components/Testimonials.tsx
- Executable scriptline 1
Executable file
site/src/components/Tools.tsx
site/src/components/TrustedBy.tsx
- Executable scriptline 1
Executable file
site/src/components/alternatives/Inline.tsx
- Executable scriptline 1
Executable file
site/src/components/docs/SearchDialog.tsx
- Executable scriptline 1
Executable file
site/src/content/alternatives.ts
- Executable scriptline 1
Executable file - Network accessline 87
slug: "firecrawl", name: "Firecrawl", site: "https://www.firecrawl.dev", - Network accessline 88
name: "Firecrawl", site: "https://www.firecrawl.dev", title: "Free Firecrawl alternative: open source, runs locally", - Network accessline 89
site: "https://www.firecrawl.dev", - Network accessline 134
], sources: [ { label: "Firecrawl pricing", url: "https://www.firecrawl.dev/pricing" }, - Network accessline 135
sources: [ { label: "Firecrawl pricing", url: "https://www.firecrawl.dev/pricing" }, { label: "Firecrawl self-hosting guide", url: "https://docs.firecrawl.dev/contributing/self-host" }, - Network accessline 136
{ label: "Firecrawl pricing", url: "https://www.firecrawl.dev/pricing" }, - Network accessline 137
{ label: "Firecrawl self-hosting guide", url: "https://docs.firecrawl.dev/contributing/self-host" }, - Network accessline 141
slug: "exa", name: "Exa", site: "https://exa.ai", - Network accessline 142
name: "Exa", site: "https://exa.ai", title: "Free Exa alternative: AI web search, no API key", - Network accessline 143
site: "https://exa.ai", - Network accessline 183
...SHARED_FAQ, ], sources: [{ label: "Exa pricing", url: "https://exa.ai/pricing" }], - Network accessline 184
], sources: [{ label: "Exa pricing", url: "https://exa.ai/pricing" }], }, - Network accessline 185
sources: [{ label: "Exa pricing", url: "https://exa.ai/pricing" }], - Network accessline 188
slug: "tavily", name: "Tavily", site: "https://www.tavily.com", - Network accessline 189
name: "Tavily", site: "https://www.tavily.com", title: "Free Tavily alternative: local search API for agents", - Network accessline 190
site: "https://www.tavily.com", - Network accessline 225
...SHARED_FAQ, ], sources: [{ label: "Tavily credits & pricing", url: "https://docs.tavily.com/documentation/api-credits" }], - Network accessline 226
], sources: [{ label: "Tavily credits & pricing", url: "https://docs.tavily.com/documentation/api-credits" }], }, - Network accessline 227
sources: [{ label: "Tavily credits & pricing", url: "https://docs.tavily.com/documentation/api-credits" }],
site/src/content/llms-preamble.md
- Network accessline 5
Website: https://wigolo.app/ · Docs: https://wigolo.app/docs/ - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Network accessline 19
- [GitHub repository](https://github.com/KnockOutEZ/wigolo): source, README, full documentation - Network accessline 20
- [npm package](https://www.npmjs.com/package/wigolo) - Network accessline 21
- [Report a bug](https://github.com/KnockOutEZ/wigolo/issues/new?template=bug_report.yml) - Network accessline 22
- [Discussions](https://github.com/KnockOutEZ/wigolo/discussions) - Network accessline 23
- [Licensing](https://github.com/KnockOutEZ/wigolo/blob/main/LICENSING.md): AGPL-3.0 for everyone; commercial license terms for companies that need to build on wigolo without copyleft obligations
site/src/lib/analytics.ts
site/src/lib/jsonld.ts
- Executable scriptline 1
Executable file - Network accessline 6
const SAME_AS = [ GH, "https://www.npmjs.com/package/wigolo", - Network accessline 7
GH, "https://www.npmjs.com/package/wigolo", "https://pypi.org/project/wigolo/", - Network accessline 8
"https://www.npmjs.com/package/wigolo", - Network accessline 9
"https://pypi.org/project/wigolo/", - Network accessline 10
"https://x.com/yourtowhid", - Network accessline 11
"https://discord.gg/BkUUgz2bNF", - Network accessline 38
description, url: `${SITE_URL}/`, downloadUrl: "https://www.npmjs.com/package/wigolo", - Network accessline 39
url: `${SITE_URL}/`, downloadUrl: "https://www.npmjs.com/package/wigolo", installUrl: `${SITE_URL}/docs/getting-started/`, - Network accessline 40
downloadUrl: "https://www.npmjs.com/package/wigolo", - Network accessline 42
softwareVersion: "0.2.x (public beta)", releaseNotes: `${GH}/releases`, license: "https://www.gnu.org/licenses/agpl-3.0.html", - Network accessline 43
releaseNotes: `${GH}/releases`, license: "https://www.gnu.org/licenses/agpl-3.0.html", isAccessibleForFree: true, - Network accessline 44
license: "https://www.gnu.org/licenses/agpl-3.0.html", - Network accessline 45
isAccessibleForFree: true, offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, author: { "@type": "Person", name: "Towhid Khan", url: "https://github.com/KnockOutEZ" }, - Network accessline 46
offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, author: { "@type": "Person", name: "Towhid Khan", url: "https://github.com/KnockOutEZ" }, publisher: { "@id": `${SITE_URL}/#org` }, - Network accessline 47
author: { "@type": "Person", name: "Towhid Khan", url: "https://github.com/KnockOutEZ" }, - Network accessline 72
export const graph = (...nodes: object[]) => JSON.stringify({ "@context": "https://schema.org", "@graph": nodes }).replace(/</g, "\\u003c"); - Network accessline 73
JSON.stringify({ "@context": "https://schema.org", "@graph": nodes }).replace(/</g, "\\u003c");
site/src/lib/lastmod.ts
- Executable scriptline 1
Executable file
site/src/lib/llms.ts
- Executable scriptline 1
Executable file
site/src/lib/logo-wall.ts
- Executable scriptline 1
Executable file - Network accessline 131
const STAR_DATA = "https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-data.json"; - Network accessline 132
"https://raw.githubusercontent.com/KnockOutEZ/wigolo/star-chart/star-data.json"; - Network accessline 147
export async function starCount(fallback = 5300): Promise<number> { try { const res = await fetch(STAR_DATA, { signal: AbortSignal.timeout(5000) }); - Network accessline 148
try { const res = await fetch(STAR_DATA, { signal: AbortSignal.timeout(5000) }); if (!res.ok) return fallback; - Network accessline 149
const res = await fetch(STAR_DATA, { signal: AbortSignal.timeout(5000) });
site/src/lib/site.ts
site/src/lib/source.ts
- Executable scriptline 1
Executable file
site/src/lib/sponsors.ts
- Executable scriptline 1
Executable file - Network accessline 55
description: "TestMu AI (formerly LambdaTest) is the world's first full-stack agentic AI quality engineering platform, trusted by 18,000+ enterprises.", url: "https://www.testmuai.com/?utm_source=wigolo&utm_medium=opensourcecollab - Network accessline 56
"TestMu AI (formerly LambdaTest) is the world's first full-stack agentic AI quality engineering platform, trusted by 18,000+ enterprises.", url: "https://www.testmuai.com/?utm_source=wigolo&utm_medium=opensourcecollab", logo: { - Network accessline 57
url: "https://www.testmuai.com/?utm_source=wigolo&utm_medium=opensourcecollab",
site/src/lib/stats.ts
- Executable scriptline 1
Executable file - Network accessline 8
export async function npmMonthlyDownloads(): Promise<number | null> { try { const res = await fetch(`https://api.npmjs.org/downloads/point/last-month/${NPM_PACKAGES.join(",")}`, { - Network accessline 9
try { const res = await fetch(`https://api.npmjs.org/downloads/point/last-month/${NPM_PACKAGES.join(",")}`, { signal: AbortSignal.timeout(5000), - Network accessline 10
const res = await fetch(`https://api.npmjs.org/downloads/point/last-month/${NPM_PACKAGES.join(",")}`, {
site/tests/alternatives.test.ts
- Executable scriptline 1
Executable file
site/tests/analytics.test.ts
- Executable scriptline 1
Executable file
site/tests/logo-wall.test.ts
- Executable scriptline 1
Executable file
site/vitest.config.mts
- Executable scriptline 1
Executable file
skills/wigolo-agent/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 30
{ "prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 30
{ "prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 30
{ "prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 30
{ "prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 31
"prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], "max_pages": 6 - Network accessline 31
"prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], "max_pages": 6 - Network accessline 31
"prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], "max_pages": 6 - Network accessline 31
"prompt": "Compare features across these CMS platforms", "urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], "max_pages": 6 - Network accessline 32
"urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 32
"urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 32
"urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"], - Network accessline 32
"urls": ["https://contentful.com/pricing", "https://sanity.io/pricing"],
skills/wigolo-cache/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo
skills/wigolo-crawl/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 20
// Crawl docs via sitemap (fastest, recommended for doc sites) { "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 20
// Crawl docs via sitemap (fastest, recommended for doc sites) { "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 20
// Crawl docs via sitemap (fastest, recommended for doc sites) { "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 20
// Crawl docs via sitemap (fastest, recommended for doc sites) { "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 20
// Crawl docs via sitemap (fastest, recommended for doc sites) { "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 21
{ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 21
{ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 21
{ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 21
{ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 21
{ "url": "https://docs.example.com", "strategy": "sitemap", "max_pages": 30 } - Network accessline 23
// BFS crawl with scope filter { "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 23
// BFS crawl with scope filter { "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 23
// BFS crawl with scope filter { "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 23
// BFS crawl with scope filter { "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 23
// BFS crawl with scope filter { "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 24
{ "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 24
{ "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 24
{ "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 24
{ "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 24
{ "url": "https://example.com", "strategy": "bfs", "max_depth": 3, "max_pages": 50, "include_patterns": ["^https://example\\.com/docs"] } - Network accessline 26
// URL discovery only (no content fetched — fastest for scoping) { "url": "https://example.com", "strategy": "map" } - Network accessline 26
// URL discovery only (no content fetched — fastest for scoping) { "url": "https://example.com", "strategy": "map" } - Network accessline 26
// URL discovery only (no content fetched — fastest for scoping) { "url": "https://example.com", "strategy": "map" } - Network accessline 26
// URL discovery only (no content fetched — fastest for scoping) { "url": "https://example.com", "strategy": "map" } - Network accessline 26
// URL discovery only (no content fetched — fastest for scoping) { "url": "https://example.com", "strategy": "map" } - Network accessline 27
{ "url": "https://example.com", "strategy": "map" } - Network accessline 27
{ "url": "https://example.com", "strategy": "map" } - Network accessline 27
{ "url": "https://example.com", "strategy": "map" } - Network accessline 27
{ "url": "https://example.com", "strategy": "map" } - Network accessline 27
{ "url": "https://example.com", "strategy": "map" } - Network accessline 29
// Authenticated crawl { "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 29
// Authenticated crawl { "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 29
// Authenticated crawl { "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 29
// Authenticated crawl { "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 29
// Authenticated crawl { "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 30
{ "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 30
{ "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 30
{ "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 30
{ "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 } - Network accessline 30
{ "url": "https://app.example.com/docs", "strategy": "bfs", "use_auth": true, "max_pages": 20 }
skills/wigolo-diff/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 20
// Live page vs its cached version (re-fetches `new` side) { "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 20
// Live page vs its cached version (re-fetches `new` side) { "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 20
// Live page vs its cached version (re-fetches `new` side) { "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 20
// Live page vs its cached version (re-fetches `new` side) { "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 21
{ "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 21
{ "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 21
{ "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 21
{ "old": { "url": "https://docs.example.com/api" }, "new": { "url": "https://docs.example.com/api" } } - Network accessline 23
// Two different URLs { "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 23
// Two different URLs { "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 23
// Two different URLs { "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 23
// Two different URLs { "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 24
{ "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 24
{ "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 24
{ "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 24
{ "old": { "url": "https://v1.example.com/spec" }, "new": { "url": "https://v2.example.com/spec" } } - Network accessline 29
// Structured per-section hunks at word granularity { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 29
// Structured per-section hunks at word granularity { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 29
// Structured per-section hunks at word granularity { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 29
// Structured per-section hunks at word granularity { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 30
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 30
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 30
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 30
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "hunks", "granularity": "word" } - Network accessline 32
// Counts only { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 32
// Counts only { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 32
// Counts only { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 32
// Counts only { "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 33
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 33
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 33
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" } - Network accessline 33
{ "old": { "url": "https://example.com" }, "new": { "url": "https://example.com" }, "output": "summary" }
skills/wigolo-extract/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 20
// Full structured extraction (ALWAYS prefer this) { "url": "https://bun.sh", "mode": "structured" } - Network accessline 20
// Full structured extraction (ALWAYS prefer this) { "url": "https://bun.sh", "mode": "structured" } - Network accessline 20
// Full structured extraction (ALWAYS prefer this) { "url": "https://bun.sh", "mode": "structured" } - Network accessline 20
// Full structured extraction (ALWAYS prefer this) { "url": "https://bun.sh", "mode": "structured" } - Network accessline 21
{ "url": "https://bun.sh", "mode": "structured" } - Network accessline 21
{ "url": "https://bun.sh", "mode": "structured" } - Network accessline 21
{ "url": "https://bun.sh", "mode": "structured" } - Network accessline 21
{ "url": "https://bun.sh", "mode": "structured" } - Network accessline 23
// JSON Schema extraction — heuristic field matching { "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "stri - Network accessline 23
// JSON Schema extraction — heuristic field matching { "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "stri - Network accessline 23
// JSON Schema extraction — heuristic field matching { "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "stri - Network accessline 23
// JSON Schema extraction — heuristic field matching { "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "stri - Network accessline 24
{ "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "string" } } } } - Network accessline 24
{ "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "string" } } } } - Network accessline 24
{ "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "string" } } } } - Network accessline 24
{ "url": "https://example.com/pricing", "mode": "schema", "schema": { "type": "object", "properties": { "name": { "type": "string" }, "price": { "type": "string" }, "sku": { "type": "string" } } } } - Network accessline 26
// CSS selector extraction { "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 26
// CSS selector extraction { "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 26
// CSS selector extraction { "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 26
// CSS selector extraction { "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 27
{ "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 27
{ "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 27
{ "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 27
{ "url": "https://example.com", "mode": "selector", "css_selector": ".product-card", "multiple": true } - Network accessline 29
// Metadata only (matches fetch metadata shape) { "url": "https://example.com", "mode": "metadata" } - Network accessline 29
// Metadata only (matches fetch metadata shape) { "url": "https://example.com", "mode": "metadata" } - Network accessline 29
// Metadata only (matches fetch metadata shape) { "url": "https://example.com", "mode": "metadata" } - Network accessline 29
// Metadata only (matches fetch metadata shape) { "url": "https://example.com", "mode": "metadata" } - Network accessline 30
{ "url": "https://example.com", "mode": "metadata" } - Network accessline 30
{ "url": "https://example.com", "mode": "metadata" } - Network accessline 30
{ "url": "https://example.com", "mode": "metadata" } - Network accessline 30
{ "url": "https://example.com", "mode": "metadata" } - Network accessline 62
{ "url": "https://blog.example.com/post", "named_schema": "Article" } - Network accessline 62
{ "url": "https://blog.example.com/post", "named_schema": "Article" } - Network accessline 62
{ "url": "https://blog.example.com/post", "named_schema": "Article" } - Network accessline 62
{ "url": "https://blog.example.com/post", "named_schema": "Article" }
skills/wigolo-fetch/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 20
// Basic fetch { "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 21
{ "url": "https://react.dev/reference/react/useState" } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 23
// Fresh content (bypass cache) { "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 24
{ "url": "https://news.ycombinator.com", "force_refresh": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 26
// With authentication { "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 27
{ "url": "https://app.example.com/dashboard", "use_auth": true } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 29
// Section targeting (cheapest — reads one heading only) { "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 30
{ "url": "https://docs.example.com/api", "section": "Authentication" } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 32
// Compact context for AI { "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 33
{ "url": "https://docs.example.com/api", "max_content_chars": 3000 } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 35
// Browser actions before extraction { "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] } - Network accessline 36
{ "url": "https://example.com", "actions": [{"type": "click", "selector": "#load-more"}, {"type": "wait", "ms": 1000}] }
skills/wigolo-find-similar/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 20
// Find pages similar to a URL { "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 20
// Find pages similar to a URL { "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 20
// Find pages similar to a URL { "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 20
// Find pages similar to a URL { "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 21
{ "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 21
{ "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 21
{ "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 21
{ "url": "https://docs.astro.build/en/getting-started/" } - Network accessline 26
// Scoped to specific domains { "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 26
// Scoped to specific domains { "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 26
// Scoped to specific domains { "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 26
// Scoped to specific domains { "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 27
{ "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 27
{ "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 27
{ "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 27
{ "url": "https://react.dev/reference/react/use", "include_domains": ["vuejs.org", "svelte.dev"] } - Network accessline 29
// Cache-only (no web fallback) { "url": "https://example.com/page", "include_web": false } - Network accessline 29
// Cache-only (no web fallback) { "url": "https://example.com/page", "include_web": false } - Network accessline 29
// Cache-only (no web fallback) { "url": "https://example.com/page", "include_web": false } - Network accessline 29
// Cache-only (no web fallback) { "url": "https://example.com/page", "include_web": false } - Network accessline 30
{ "url": "https://example.com/page", "include_web": false } - Network accessline 30
{ "url": "https://example.com/page", "include_web": false } - Network accessline 30
{ "url": "https://example.com/page", "include_web": false } - Network accessline 30
{ "url": "https://example.com/page", "include_web": false } - Network accessline 77
// Step 1: crawl to populate cache with embeddings { "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 77
// Step 1: crawl to populate cache with embeddings { "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 77
// Step 1: crawl to populate cache with embeddings { "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 77
// Step 1: crawl to populate cache with embeddings { "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 78
{ "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 78
{ "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 78
{ "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 78
{ "url": "https://docs.framework.dev", "strategy": "sitemap", "max_pages": 20 } - Network accessline 80
// Step 2: now find_similar has real semantic signal { "url": "https://docs.framework.dev/getting-started" } - Network accessline 80
// Step 2: now find_similar has real semantic signal { "url": "https://docs.framework.dev/getting-started" } - Network accessline 80
// Step 2: now find_similar has real semantic signal { "url": "https://docs.framework.dev/getting-started" } - Network accessline 80
// Step 2: now find_similar has real semantic signal { "url": "https://docs.framework.dev/getting-started" } - Network accessline 81
{ "url": "https://docs.framework.dev/getting-started" } - Network accessline 81
{ "url": "https://docs.framework.dev/getting-started" } - Network accessline 81
{ "url": "https://docs.framework.dev/getting-started" } - Network accessline 81
{ "url": "https://docs.framework.dev/getting-started" }
skills/wigolo-research/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo
skills/wigolo-search/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo
skills/wigolo-watch/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo - Network accessline 22
// Create a single-URL watch (checks no more than once every 6 hours) { "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 22
// Create a single-URL watch (checks no more than once every 6 hours) { "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 22
// Create a single-URL watch (checks no more than once every 6 hours) { "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 23
{ "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 23
{ "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 23
{ "action": "create", "url": "https://nodejs.org/en/blog", "interval_seconds": 21600 } - Network accessline 25
// Batch create across several URLs { "action": "create", "urls": ["https://a.example.com", "https://b.example.com"], "interval_seconds": 3600 } - Network accessline 25
// Batch create across several URLs { "action": "create", "urls": ["https://a.example.com", "https://b.example.com"], "interval_seconds": 3600 } - Network accessline 25
// Batch create across several URLs { "action": "create", "urls": ["https://a.example.com", "https://b.example.com"], "interval_seconds": 3600 } - Network accessline 26
{ "action": "create", "urls": ["https://a.example.com", "https://b.example.com"], "interval_seconds": 3600 } - Network accessline 26
{ "action": "create", "urls": ["https://a.example.com", "https://b.example.com"], "interval_seconds": 3600 } - Network accessline 26
{ "action": "create", "urls": ["https://a.example.com", "https://b.example.com"], "interval_seconds": 3600 } - Network accessline 28
// Scope the diff to a subtree { "action": "create", "url": "https://example.com/pricing", "interval_seconds": 86400, "selector": "#pricing-table" } - Network accessline 28
// Scope the diff to a subtree { "action": "create", "url": "https://example.com/pricing", "interval_seconds": 86400, "selector": "#pricing-table" } - Network accessline 28
// Scope the diff to a subtree { "action": "create", "url": "https://example.com/pricing", "interval_seconds": 86400, "selector": "#pricing-table" } - Network accessline 29
{ "action": "create", "url": "https://example.com/pricing", "interval_seconds": 86400, "selector": "#pricing-table" } - Network accessline 29
{ "action": "create", "url": "https://example.com/pricing", "interval_seconds": 86400, "selector": "#pricing-table" } - Network accessline 29
{ "action": "create", "url": "https://example.com/pricing", "interval_seconds": 86400, "selector": "#pricing-table" } - Network accessline 31
// Deliver a webhook on change (SSRF-guarded) { "action": "create", "url": "https://example.com/status", "interval_seconds": 300, "notification": "https://hooks.example.com/wigolo" } - Network accessline 31
// Deliver a webhook on change (SSRF-guarded) { "action": "create", "url": "https://example.com/status", "interval_seconds": 300, "notification": "https://hooks.example.com/wigolo" } - Network accessline 31
// Deliver a webhook on change (SSRF-guarded) { "action": "create", "url": "https://example.com/status", "interval_seconds": 300, "notification": "https://hooks.example.com/wigolo" } - Network accessline 32
{ "action": "create", "url": "https://example.com/status", "interval_seconds": 300, "notification": "https://hooks.example.com/wigolo" } - Network accessline 32
{ "action": "create", "url": "https://example.com/status", "interval_seconds": 300, "notification": "https://hooks.example.com/wigolo" } - Network accessline 32
{ "action": "create", "url": "https://example.com/status", "interval_seconds": 300, "notification": "https://hooks.example.com/wigolo" }
skills/wigolo/SKILL.md
- Network accessline 7
author: KnockOutEZ version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 8
version: 0.3.1 homepage: https://github.com/KnockOutEZ/wigolo repository: https://github.com/KnockOutEZ/wigolo - Network accessline 9
homepage: https://github.com/KnockOutEZ/wigolo - Network accessline 10
repository: https://github.com/KnockOutEZ/wigolo
src/agent/executor.ts
src/agent/pipeline.ts
- Executable scriptline 1
Executable file - Network accessline 309
: ''; return { result: `Attempted ${sources.length} page(s) but ${failed} fetch(es) failed${reasonClause}. 0 of ${sources.length} pages yielded content — try again with a broader query, different URLs, or check upstream availa - Network accessline 310
return { result: `Attempted ${sources.length} page(s) but ${failed} fetch(es) failed${reasonClause}. 0 of ${sources.length} pages yielded content — try again with a broader query, different URLs, or check upstream availability.`, - Network accessline 311
result: `Attempted ${sources.length} page(s) but ${failed} fetch(es) failed${reasonClause}. 0 of ${sources.length} pages yielded content — try again with a broader query, different URLs, or check upstream availability.`, - Access to secretsline 321
[Credential-related source omitted]
src/agent/planner.ts
- Executable scriptline 1
Executable file
src/agent/rank.ts
- Executable scriptline 1
Executable file
src/agent/relevance.ts
- Executable scriptline 1
Executable file
src/cache/backfill-embeddings.ts
- Executable scriptline 1
Executable file
src/cache/change-detector.ts
- Executable scriptline 1
Executable file
src/cache/db.ts
- Executable scriptline 1
Executable file
src/cache/diff-engine.ts
- Executable scriptline 1
Executable file
src/cache/diff-summary.ts
- Executable scriptline 1
Executable file
src/cache/lcs.ts
- Executable scriptline 1
Executable file
src/cache/migrations/runner.ts
- Executable scriptline 1
Executable file
src/cache/sqlite-vec-store.ts
- Executable scriptline 1
Executable file
src/cache/store.ts
- Executable scriptline 1
Executable file - Network accessline 12
* * Why: bare tokens with `.` / `-` / `/` / `:` / digits-with-dot * (e.g. "5.4", "x-y", "https://foo") raise `fts5: syntax error near "."`. - Network accessline 13
* Why: bare tokens with `.` / `-` / `/` / `:` / digits-with-dot * (e.g. "5.4", "x-y", "https://foo") raise `fts5: syntax error near "."`. * Quoting tokens that aren't pure word-chars lets FTS5 treat them as phrases. - Network accessline 14
* (e.g. "5.4", "x-y", "https://foo") raise `fts5: syntax error near "."`. - Network accessline 579
WHERE url LIKE 'http://' || ? || '/%' OR url LIKE 'https://' || ? || '/%' OR url LIKE 'http://www.' || ? || '/%' - Network accessline 580
OR url LIKE 'https://' || ? || '/%' OR url LIKE 'http://www.' || ? || '/%' OR url LIKE 'https://www.' || ? || '/%' - Network accessline 581
OR url LIKE 'http://www.' || ? || '/%' - Network accessline 582
OR url LIKE 'https://www.' || ? || '/%' - Network accessline 583
OR url = 'http://' || ? OR url = 'https://' || ? OR url = 'http://www.' || ? - Network accessline 584
OR url = 'https://' || ? OR url = 'http://www.' || ? OR url = 'https://www.' || ? - Network accessline 585
OR url = 'http://www.' || ? - Network accessline 586
OR url = 'https://www.' || ?
src/cli/agents/antigravity.ts
- Executable scriptline 1
Executable file
src/cli/agents/claude-code.ts
src/cli/agents/cline.ts
- Executable scriptline 1
Executable file
src/cli/agents/codex.ts
- Executable scriptline 1
Executable file
src/cli/agents/cursor.ts
- Executable scriptline 1
Executable file
src/cli/agents/gemini-cli.ts
- Executable scriptline 1
Executable file
src/cli/agents/opencode.ts
- Executable scriptline 1
Executable file
src/cli/agents/registry.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/catalog.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/executor.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/index.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/planner.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/receipts.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/snapshot.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/targets.ts
- Executable scriptline 1
Executable file
src/cli/agents/skills/types.ts
- Executable scriptline 1
Executable file
src/cli/agents/utils.ts
- Executable scriptline 1
Executable file
src/cli/agents/vscode.ts
- Executable scriptline 1
Executable file
src/cli/agents/windsurf.ts
- Executable scriptline 1
Executable file
src/cli/agents/zed.ts
- Executable scriptline 1
Executable file
src/cli/auth.ts
- Executable scriptline 1
Executable file - Network accessline 15
write('Error: WIGOLO_CDP_URL is not configured.'); write('Set it to your Chrome debugging endpoint, e.g.:'); write(' export WIGOLO_CDP_URL=http://localhost:9222'); - Network accessline 16
write('Set it to your Chrome debugging endpoint, e.g.:'); write(' export WIGOLO_CDP_URL=http://localhost:9222'); write(''); - Network accessline 17
write(' export WIGOLO_CDP_URL=http://localhost:9222');
src/cli/backfill.ts
- Executable scriptline 1
Executable file
src/cli/config.ts
- Executable scriptline 1
Executable file
src/cli/daemon.ts
- Executable scriptline 1
Executable file - Network accessline 107
return ( 'wigolo is AGPL-3.0 and free to run. Building a commercial product on it? ' + 'Take a commercial license or sponsor the project: https://github.com/KnockOutEZ/wigolo/blob/main/LICENSING.md' - Network accessline 108
'wigolo is AGPL-3.0 and free to run. Building a commercial product on it? ' + 'Take a commercial license or sponsor the project: https://github.com/KnockOutEZ/wigolo/blob/main/LICENSING.md' ); - Network accessline 109
'Take a commercial license or sponsor the project: https://github.com/KnockOutEZ/wigolo/blob/main/LICENSING.md' - Network accessline 142
.then((url) => { log(`Daemon running at ${url}`); log(`Health check: curl ${url}/health`); - Network accessline 143
log(`Daemon running at ${url}`); log(`Health check: curl ${url}/health`); log(`REST API: ${url}/v1 (OpenAPI: ${url}/openapi.json)`); - Network accessline 144
log(`Health check: curl ${url}/health`);
src/cli/doctor.ts
- Executable scriptline 1
Executable file - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 251
[Credential-related source omitted] - Network accessline 496
try { const cfg = getConfig(); const resp = await fetch(`http://${cfg.daemonHost}:${cfg.daemonPort}/health`, { - Network accessline 497
const cfg = getConfig(); const resp = await fetch(`http://${cfg.daemonHost}:${cfg.daemonPort}/health`, { signal: AbortSignal.timeout(2000), - Network accessline 498
const resp = await fetch(`http://${cfg.daemonHost}:${cfg.daemonPort}/health`, { - Network accessline 513
try { const cfg = getConfig(); const resp = await fetch(`http://${cfg.daemonHost}:${cfg.daemonPort}/admin/reset-breakers`, { - Network accessline 514
const cfg = getConfig(); const resp = await fetch(`http://${cfg.daemonHost}:${cfg.daemonPort}/admin/reset-breakers`, { method: 'POST', - Network accessline 515
const resp = await fetch(`http://${cfg.daemonHost}:${cfg.daemonPort}/admin/reset-breakers`, { - Dangerous shell operationline 736
out(' Hint: system libraries missing — run: sudo npx playwright install-deps chromium'); - Access to secretsline 788
[Credential-related source omitted] - Access to secretsline 793
[Credential-related source omitted]
src/cli/flag-bridge.ts
- Executable scriptline 1
Executable file
src/cli/health.ts
- Executable scriptline 1
Executable file - Network accessline 10
const host = config.daemonHost; const port = config.daemonPort; const url = `http://${host}:${port}/health`; - Network accessline 12
const url = `http://${host}:${port}/health`; - Network accessline 14
try { const response = await fetch(url, { - Network accessline 15
const response = await fetch(url, {
src/cli/help.ts
src/cli/index.ts
- Executable scriptline 1
Executable file
src/cli/init.ts
- Executable scriptline 1
Executable file - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 673
[Credential-related source omitted] - Access to secretsline 688
[Credential-related source omitted] - Access to secretsline 709
[Credential-related source omitted] - Access to secretsline 722
[Credential-related source omitted]
src/cli/mcp.ts
- Executable scriptline 1
Executable file
src/cli/ollama-probe.ts
src/cli/plugin.ts
- Executable scriptline 1
Executable file
src/cli/setup-mcp.ts
- Executable scriptline 1
Executable file
src/cli/shell.ts
- Executable scriptline 1
Executable file
src/cli/shutdown.ts
- Executable scriptline 1
Executable file
src/cli/skills.ts
- Executable scriptline 1
Executable file
src/cli/status.ts
- Executable scriptline 1
Executable file
src/cli/telemetry.ts
src/cli/tool-run.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/cache-stats.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/cleanup.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/compute-storage.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/detect-system.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/export-import-config.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/headless-set.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/index.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/provider-keys.ts
- Executable scriptline 1
Executable file - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted]
src/cli/tui/actions/setup-status.ts
src/cli/tui/actions/types.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/uninstall.ts
src/cli/tui/actions/verify-e2e.ts
- Executable scriptline 1
Executable file - Access to secretsline 19
[Credential-related source omitted] - Network accessline 314
const STABLE_FETCH_URL = 'https://www.example.com'; - Network accessline 361
const { buildMinimalRouter } = await import('./verify-router.js'); const router = await buildMinimalRouter(); const raw = await router.fetch(STABLE_FETCH_URL, { renderJs: 'never' }); - Network accessline 362
const router = await buildMinimalRouter(); const raw = await router.fetch(STABLE_FETCH_URL, { renderJs: 'never' }); const chars = raw.html?.length ?? 0; - Network accessline 363
const raw = await router.fetch(STABLE_FETCH_URL, { renderJs: 'never' }); - Access to secretsline 415
[Credential-related source omitted] - Access to secretsline 418
[Credential-related source omitted]
src/cli/tui/actions/verify-router.ts
- Executable scriptline 1
Executable file
src/cli/tui/actions/write-config.ts
- Executable scriptline 1
Executable file
src/cli/tui/agents-types.ts
- Executable scriptline 1
Executable file
src/cli/tui/agents.ts
- Executable scriptline 1
Executable file
src/cli/tui/banner.ts
- Executable scriptline 1
Executable file
src/cli/tui/components/ActionBar.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/Banner.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/CategoryScreen.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/DashboardExport.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/DashboardUninstall.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/DoctorScreen.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/FieldRenderer.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/ImportScreen.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/SettingsHome.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/Verification.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/VerifyScreen.tsx
- Executable scriptline 1
Executable file
src/cli/tui/components/WizardSteps.tsx
- Executable scriptline 1
Executable file
src/cli/tui/config-writer-cli.ts
- Executable scriptline 1
Executable file
src/cli/tui/config-writer-json.ts
- Executable scriptline 1
Executable file
src/cli/tui/config-writer-toml.ts
- Executable scriptline 1
Executable file
src/cli/tui/config-writer.ts
- Executable scriptline 1
Executable file
src/cli/tui/detect-helpers.ts
- Executable scriptline 1
Executable file
src/cli/tui/entry.ts
- Executable scriptline 1
Executable file
src/cli/tui/extras-prompt.ts
src/cli/tui/flags-types.ts
- Executable scriptline 1
Executable file
src/cli/tui/flags.ts
- Executable scriptline 1
Executable file
src/cli/tui/format.ts
- Executable scriptline 1
Executable file
src/cli/tui/hooks/useVerify.ts
- Executable scriptline 1
Executable file
src/cli/tui/reporter-auto.ts
- Executable scriptline 1
Executable file
src/cli/tui/reporter.ts
- Executable scriptline 1
Executable file
src/cli/tui/router/ink.tsx
- Executable scriptline 1
Executable file
src/cli/tui/run-command.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/advanced.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/agents.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/browser.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/cache.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/catalog.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/llm.ts
src/cli/tui/schema/migrate.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/search.ts
- Executable scriptline 1
Executable file
src/cli/tui/schema/types.ts
- Executable scriptline 1
Executable file
src/cli/tui/select-agents.ts
- Executable scriptline 1
Executable file
src/cli/tui/shell/App.tsx
- Executable scriptline 1
Executable file
src/cli/tui/shell/CommandPalette.tsx
src/cli/tui/shell/Footer.tsx
- Executable scriptline 1
Executable file
src/cli/tui/shell/Header.tsx
src/cli/tui/shell/HelpOverlay.tsx
- Executable scriptline 1
Executable file
src/cli/tui/shell/MainPane.tsx
src/cli/tui/shell/Sidebar.tsx
- Executable scriptline 1
Executable file
src/cli/tui/shell/Spinner.tsx
src/cli/tui/shell/palette-index.ts
- Executable scriptline 1
Executable file
src/cli/tui/shell/width.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/activity-store-instance.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/activity-store.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/agent-install-hints.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/agent-targets.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/propagation.ts
src/cli/tui/state/required-fields.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/secret-store.ts
- Executable scriptline 1
Executable file - Access to secretsline 2
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted]
src/cli/tui/state/settings-store.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/toast-store-instance.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/toast-store.ts
- Executable scriptline 1
Executable file
src/cli/tui/state/uninstall-signal.ts
- Executable scriptline 1
Executable file
src/cli/tui/status-agents.ts
- Executable scriptline 1
Executable file
src/cli/tui/status-cache.ts
- Executable scriptline 1
Executable file
src/cli/tui/status-format.ts
- Executable scriptline 1
Executable file
src/cli/tui/status-python.ts
- Executable scriptline 1
Executable file
src/cli/tui/system-check.ts
- Executable scriptline 1
Executable file - Network accessline 85
return { ok: false, message: 'Python 3 not found. Install: https://python.org/downloads or `brew install python3`', - Network accessline 86
ok: false, message: 'Python 3 not found. Install: https://python.org/downloads or `brew install python3`', }; - Network accessline 87
message: 'Python 3 not found. Install: https://python.org/downloads or `brew install python3`',
src/cli/tui/theme/borders.ts
- Executable scriptline 1
Executable file
src/cli/tui/theme/motion-guard.ts
- Executable scriptline 1
Executable file
src/cli/tui/theme/motion.ts
- Executable scriptline 1
Executable file
src/cli/tui/theme/palette.ts
- Executable scriptline 1
Executable file
src/cli/tui/tui-reporter.ts
- Executable scriptline 1
Executable file
src/cli/tui/utils/config-writer.ts
- Executable scriptline 1
Executable file
src/cli/tui/utils/suppress-logs.ts
- Executable scriptline 1
Executable file
src/cli/tui/verify-suggestions.ts
- Executable scriptline 1
Executable file
src/cli/tui/verify.ts
- Executable scriptline 1
Executable file
src/cli/tui/version.ts
- Executable scriptline 1
Executable file
src/cli/tune.ts
- Executable scriptline 1
Executable file
src/cli/uninstall.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 7
* The curl|sh bootstrap installer lays the tool down INSIDE the data dir: - Dangerous shell operationline 27
`For a full cleanup run: rm -rf ${dataDir}`, - Dangerous shell operationline 31
`This wigolo was installed via the curl|sh bootstrap. Its files live under`, - Dangerous shell operationline 38
` install.sh --uninstall (or: rm -rf ${layout.binDir} ${layout.toolDir} ${layout.runtimeDir})`, - Dangerous shell operationline 41
` rm -rf ${dataDir}`, - Dangerous shell operationline 67
` - npm / source install: full cleanup is rm -rf ${dataDir}`, - Dangerous shell operationline 68
' - curl|sh bootstrap: remove the tool with install.sh --uninstall', - Dangerous shell operationline 69
` (keeps your cache/models/keys), or rm -rf ${dataDir} to wipe everything.`,
src/cli/verify.ts
- Executable scriptline 1
Executable file
src/cli/warmup.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 43
* - else, if `sudo -n true` exits 0 → passwordless sudo is configured. - Dangerous shell operationline 50
// `sudo -n true` never prompts: -n makes sudo fail immediately (non-zero) - Dangerous shell operationline 56
// No sudo binary at all (spawn ENOENT — e.g. slim containers). runCommand - Dangerous shell operationline 70
* run sudo (non-root, no passwordless sudo) so the launch smoke-test can emit - Dangerous shell operationline 105
* are root, via passwordless `sudo -n` if available, else SKIP. - Dangerous shell operationline 177
// A deps failure (root / passwordless sudo path) is not a hard error on its - Dangerous shell operationline 198
error: `system libraries missing — install them with:\n sudo npx playwright install-deps ${browser}\nThen re-run: wigolo warmup`,
src/config.ts
- Executable scriptline 1
Executable file - Access to secretsline 149
[Credential-related source omitted] - Network accessline 156
* Base URL for a custom OpenAI-compatible LLM backend. Only consulted when * `llmProvider` is the `ollama` alias; overrides the default * http://localhost:11434. `null` means "use the default local Ollama base". - Network accessline 157
* `llmProvider` is the `ollama` alias; overrides the default * http://localhost:11434. `null` means "use the default local Ollama base". */ - Network accessline 158
* http://localhost:11434. `null` means "use the default local Ollama base". - Access to secretsline 165
[Credential-related source omitted] - Access to secretsline 176
[Credential-related source omitted] - Access to secretsline 334
[Credential-related source omitted] - Access to secretsline 348
[Credential-related source omitted] - Access to secretsline 350
[Credential-related source omitted] - Access to secretsline 351
[Credential-related source omitted] - Access to secretsline 560
[Credential-related source omitted] - Access to secretsline 563
[Credential-related source omitted] - Access to secretsline 575
[Credential-related source omitted] - Access to secretsline 592
[Credential-related source omitted] - Access to secretsline 671
[Credential-related source omitted] - Access to secretsline 672
[Credential-related source omitted] - Access to secretsline 688
[Credential-related source omitted] - Access to secretsline 802
[Credential-related source omitted] - Access to secretsline 804
[Credential-related source omitted]
src/crawl/crawler.ts
- Executable scriptline 1
Executable file - Network accessline 265
// De-duplicate by canonical form first so /foo and /foo/ collapse before // pattern filtering, then keep the first occurrence's original URL for // the network fetch (some servers 404 on the slash-stripped variant). - Network accessline 267
// the network fetch (some servers 404 on the slash-stripped variant).
src/crawl/dedup.ts
- Executable scriptline 1
Executable file
src/crawl/etag-incremental.ts
- Executable scriptline 1
Executable file
src/crawl/index-to-vec.ts
- Executable scriptline 1
Executable file
src/crawl/mapper.ts
- Executable scriptline 1
Executable file
src/crawl/rate-limiter.ts
- Executable scriptline 1
Executable file
src/crawl/robots.ts
- Executable scriptline 1
Executable file
src/crawl/sitemap-first.ts
- Executable scriptline 1
Executable file
src/crawl/sitemap.ts
- Executable scriptline 1
Executable file
src/crawl/url-utils.ts
- Executable scriptline 1
Executable file - Network accessline 29
// Display-friendly canonicalization for emitted page URLs. Strips a trailing // slash on ALL paths (including root) so `https://x.com` and `https://x.com/` - Network accessline 30
// slash on ALL paths (including root) so `https://x.com` and `https://x.com/`
src/daemon/admin-token.ts
- Executable scriptline 1
Executable file
src/daemon/health-check.ts
- Executable scriptline 1
Executable file
src/daemon/http-server.ts
- Executable scriptline 1
Executable file - Network accessline 192
resolvedPort = addr.port; } const url = `http://${this.host}:${resolvedPort}`; - Network accessline 193
} const url = `http://${this.host}:${resolvedPort}`; log.info('Daemon HTTP server started', { url }); - Network accessline 194
const url = `http://${this.host}:${resolvedPort}`; - Network accessline 201
private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> { const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`); - Network accessline 202
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
src/daemon/proxy.ts
- Executable scriptline 1
Executable file - Network accessline 6
export async function tryConnectDaemon(port: number, host: string): Promise<HealthReport | null> { const url = `http://${host}:${port}/health`; - Network accessline 7
const url = `http://${host}:${port}/health`; - Network accessline 9
try { const response = await fetch(url, { - Network accessline 10
const response = await fetch(url, { - Network accessline 41
try { const response = await fetch(url, { - Network accessline 42
const response = await fetch(url, { - Network accessline 71
async checkHealth(): Promise<HealthReport | null> { try { const response = await fetch(`${this.baseUrl}/health`, { - Network accessline 72
try { const response = await fetch(`${this.baseUrl}/health`, { signal: AbortSignal.timeout(2000), - Network accessline 73
const response = await fetch(`${this.baseUrl}/health`, { - Network accessline 88
try { const response = await fetch(url, { - Network accessline 89
const response = await fetch(url, {
src/daemon/rest/auth.ts
src/daemon/rest/dispatch.ts
- Executable scriptline 1
Executable file
src/daemon/rest/errors.ts
- Executable scriptline 1
Executable file
src/daemon/rest/firecrawl-compat.ts
- Executable scriptline 1
Executable file - Network accessline 29
* Firecrawl-compatibility shim (EXPERIMENTAL, flag `WIGOLO_FIRECRAWL_COMPAT=1`). * Maps a lite subset of the Firecrawl v1 surface onto wigolo's tool handlers so * a Firecrawl SDK pointed at `http://host:3333/compat/firecrawl` gets a - Network accessline 30
* Maps a lite subset of the Firecrawl v1 surface onto wigolo's tool handlers so * a Firecrawl SDK pointed at `http://host:3333/compat/firecrawl` gets a * drop-in. Auth, resource limits, and the SSRF target guard all run BEFORE this - Network accessline 31
* a Firecrawl SDK pointed at `http://host:3333/compat/firecrawl` gets a
src/daemon/rest/limits.ts
- Executable scriptline 1
Executable file
src/daemon/rest/openapi.ts
- Executable scriptline 1
Executable file
src/daemon/rest/router.ts
- Executable scriptline 1
Executable file - Network accessline 110
async handle(req: IncomingMessage, res: ServerResponse): Promise<void> { const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`); - Network accessline 111
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
src/daemon/rest/target-guard.ts
- Executable scriptline 1
Executable file
src/daemon/rest/validate.ts
- Executable scriptline 1
Executable file
src/embedding/background-queue.ts
- Executable scriptline 1
Executable file
src/embedding/embed.ts
- Executable scriptline 1
Executable file
src/embedding/fastembed-provider.ts
- Executable scriptline 1
Executable file
src/embedding/key-terms.ts
- Executable scriptline 1
Executable file
src/extraction/boilerplate.ts
- Executable scriptline 1
Executable file
src/extraction/brand-palette.ts
- Executable scriptline 1
Executable file
src/extraction/brand-provenance.ts
- Executable scriptline 1
Executable file
src/extraction/brand.ts
- Executable scriptline 1
Executable file - Network accessline 412
switch (key) { case 'twitter': return handle ? { key, canonical: `https://twitter.com/${handle}` } : undefined; - Network accessline 413
case 'twitter': return handle ? { key, canonical: `https://twitter.com/${handle}` } : undefined; case 'github': - Network accessline 414
return handle ? { key, canonical: `https://twitter.com/${handle}` } : undefined; - Network accessline 415
case 'github': return handle ? { key, canonical: `https://github.com/${handle}` } : undefined; case 'linkedin': - Network accessline 416
return handle ? { key, canonical: `https://github.com/${handle}` } : undefined; - Network accessline 460
if (twitterHandle && !out.twitter) { const canon = `https://twitter.com/${twitterHandle.replace(/^@/, '')}`; - Network accessline 461
const canon = `https://twitter.com/${twitterHandle.replace(/^@/, '')}`; - Network accessline 747
// Match both the v1 (`/css?…`) and v2 (`/css2?…`) endpoints. We also // accept `https://` and `//`-protocol-relative forms (common on - Network accessline 748
// accept `https://` and `//`-protocol-relative forms (common on - Network accessline 755
let url: URL; try { url = new URL(href, 'https://fonts.googleapis.com/'); - Network accessline 756
try { url = new URL(href, 'https://fonts.googleapis.com/'); } catch { - Network accessline 757
url = new URL(href, 'https://fonts.googleapis.com/'); - Network accessline 909
* `safeAbsoluteUrl()`, which only filters dangerous schemes * (`javascript:`/`data:`/`file:`/`blob:`/`vbscript:`). That leaves * loopback (`http://127.0.0.1/`), RFC 1918 (`http://10.0.0.1/`), - Network accessline 910
* (`javascript:`/`data:`/`file:`/`blob:`/`vbscript:`). That leaves * loopback (`http://127.0.0.1/`), RFC 1918 (`http://10.0.0.1/`), * link-local AWS metadata (`http://169.254.169.254/`), and IPv6 private - Network accessline 911
* loopback (`http://127.0.0.1/`), RFC 1918 (`http://10.0.0.1/`), - Network accessline 912
* link-local AWS metadata (`http://169.254.169.254/`), and IPv6 private - Network accessline 944
let response: Response; try { response = await fetch(currentUrl, { - Network accessline 945
try { response = await fetch(currentUrl, { headers: { - Network accessline 946
response = await fetch(currentUrl, {
src/extraction/defuddle.ts
- Executable scriptline 1
Executable file
src/extraction/div-grid.ts
- Executable scriptline 1
Executable file
src/extraction/extract.ts
- Executable scriptline 1
Executable file - Network accessline 4
// Re-export the canonical metadata extractor so legacy callers keep working. // fetch (via pipeline.mergeMetadata) and extract mode=metadata both reach the - Network accessline 5
// fetch (via pipeline.mergeMetadata) and extract mode=metadata both reach the
src/extraction/jsonld.ts
- Executable scriptline 1
Executable file
src/extraction/lang-hints.ts
- Executable scriptline 1
Executable file
src/extraction/list.ts
- Executable scriptline 1
Executable file
src/extraction/llm-fallback.ts
src/extraction/markdown-sanitize.ts
- Executable scriptline 1
Executable file
src/extraction/markdown.ts
- Executable scriptline 1
Executable file
src/extraction/metadata.ts
- Executable scriptline 1
Executable file
src/extraction/pipeline.ts
- Executable scriptline 1
Executable file
src/extraction/readability.ts
- Executable scriptline 1
Executable file
src/extraction/schema-truth.ts
- Executable scriptline 1
Executable file
src/extraction/schema.ts
- Executable scriptline 1
Executable file
src/extraction/site-extractors/amazon.ts
src/extraction/site-extractors/docs-generic.ts
- Executable scriptline 1
Executable file
src/extraction/site-extractors/github.ts
- Executable scriptline 1
Executable file - Network accessline 82
/** * Transform a github.com blob URL into its raw.githubusercontent.com equivalent. * `https://github.com/<owner>/<repo>/blob/<ref>/<path>` → - Network accessline 83
* Transform a github.com blob URL into its raw.githubusercontent.com equivalent. * `https://github.com/<owner>/<repo>/blob/<ref>/<path>` → * `https://raw.githubusercontent.com/<owner>/<repo>/<ref>/<path>`. - Network accessline 84
* `https://github.com/<owner>/<repo>/blob/<ref>/<path>` → - Network accessline 85
* `https://raw.githubusercontent.com/<owner>/<repo>/<ref>/<path>`. - Network accessline 90
if (!match) return null; const [, owner, repo, rest] = match; return `https://raw.githubusercontent.com/${owner}/${repo}/${rest}`; - Network accessline 91
const [, owner, repo, rest] = match; return `https://raw.githubusercontent.com/${owner}/${repo}/${rest}`; } - Network accessline 92
return `https://raw.githubusercontent.com/${owner}/${repo}/${rest}`;
src/extraction/site-extractors/mdn.ts
- Executable scriptline 1
Executable file
src/extraction/site-extractors/reddit.ts
- Executable scriptline 1
Executable file
src/extraction/site-extractors/stackoverflow.ts
- Executable scriptline 1
Executable file
src/extraction/site-extractors/youtube.ts
- Executable scriptline 1
Executable file
src/extraction/structured-data.ts
- Executable scriptline 1
Executable file
src/extraction/structured.ts
- Executable scriptline 1
Executable file
src/extraction/v1/classifier.ts
src/extraction/v1/content-root.ts
- Executable scriptline 1
Executable file
src/extraction/v1/extract-provider.ts
- Executable scriptline 1
Executable file
src/extraction/v1/local-llm.ts
- Executable scriptline 1
Executable file
src/extraction/v1/news.ts
- Executable scriptline 1
Executable file
src/extraction/v1/product.ts
- Executable scriptline 1
Executable file
src/extraction/v1/recipe.ts
- Executable scriptline 1
Executable file
src/extraction/v1/routed.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/Article.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/CodeSnippet.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/EventListing.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/JobPosting.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/Paper.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/Product.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/Recipe.ts
- Executable scriptline 1
Executable file
src/extraction/v1/schemas/index.ts
- Executable scriptline 1
Executable file
src/extraction/v1/site-extractors.ts
- Executable scriptline 1
Executable file
src/fetch/action-executor.ts
- Executable scriptline 1
Executable file
src/fetch/ai-solve.ts
- Executable scriptline 1
Executable file
src/fetch/auth.ts
- Executable scriptline 1
Executable file
src/fetch/auto-pass.ts
- Executable scriptline 1
Executable file
src/fetch/behavior.ts
- Executable scriptline 1
Executable file
src/fetch/browser-acquire.ts
- Executable scriptline 1
Executable file
src/fetch/browser-pool.ts
src/fetch/browser-probe.ts
- Executable scriptline 1
Executable file
src/fetch/browser-selector.ts
- Executable scriptline 1
Executable file
src/fetch/browser-types.ts
- Executable scriptline 1
Executable file
src/fetch/cdp-client.ts
- Executable scriptline 1
Executable file
src/fetch/cdp-direct.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 3
import { mkdtemp as fsMkdtemp, rm as fsRm } from 'node:fs/promises'; - Network accessline 149
/** Base CDP endpoint (e.g. `http://127.0.0.1:9222`) for target discovery. */ - Dangerous shell operationline 457
* mkdtemp / rm the throwaway profile, open the CDP transport) is behind this so - Network accessline 828
* NOT skip IP literals: that skip is justified only because the caller's literal * guard already vetted the REQUESTED url, and a redirect target was never seen * by it. `http://169.254.169.254/` is exactly the shape a rebind lands on, so - Network accessline 829
* guard already vetted the REQUESTED url, and a redirect target was never seen * by it. `http://169.254.169.254/` is exactly the shape a rebind lands on, so it * gets the literal guard here plus the resolved check for hostnames. - Network accessline 830
* by it. `http://169.254.169.254/` is exactly the shape a rebind lands on, so it - Network accessline 985
const cdpUrl = `http://127.0.0.1:${port}`;
src/fetch/challenge-classify.ts
- Executable scriptline 1
Executable file
src/fetch/challenge-completion.ts
- Executable scriptline 1
Executable file
src/fetch/clearance-reuse.ts
- Executable scriptline 1
Executable file
src/fetch/content-check.ts
- Executable scriptline 1
Executable file
src/fetch/error-describe.ts
- Executable scriptline 1
Executable file
src/fetch/escape-hatch.ts
- Executable scriptline 1
Executable file - Network accessline 39
/** Injectable fetch (tests). Defaults to the global fetch. */ - Network accessline 311
// Reader services conventionally take the target as a path suffix // (`https://reader/<target>`). Percent-encode the target so its own query / - Network accessline 312
// (`https://reader/<target>`). Percent-encode the target so its own query /
src/fetch/http-client.ts
- Executable scriptline 1
Executable file - Network accessline 250
mergedHeaders['If-Modified-Since'] = options.conditionalHeaders.ifModifiedSince; } response = await fetch(currentUrl, { - Network accessline 251
} response = await fetch(currentUrl, { headers: mergedHeaders, - Network accessline 252
response = await fetch(currentUrl, {
src/fetch/human-solve.ts
- Executable scriptline 1
Executable file
src/fetch/hydration-probe.ts
- Executable scriptline 1
Executable file
src/fetch/pinned-dispatcher.ts
- Executable scriptline 1
Executable file - Network accessline 14
* WHY A LOOKUP HOOK RATHER THAN REWRITING THE URL TO THE IP * -------------------------------------------------------- * Rewriting `https://example.com/x` to `https://93.184.216.34/x` would also avoid re-resolution, - Network accessline 15
* -------------------------------------------------------- * Rewriting `https://example.com/x` to `https://93.184.216.34/x` would also avoid re-resolution, * and it would break TLS: the certificate is checked against the name in the URL, - Network accessline 16
* Rewriting `https://example.com/x` to `https://93.184.216.34/x` would also avoid re-resolution,
src/fetch/playwright-tier.ts
- Executable scriptline 1
Executable file
src/fetch/politeness.ts
- Executable scriptline 1
Executable file
src/fetch/proxy-credentials.ts
src/fetch/reddit-api.ts
- Executable scriptline 1
Executable file - Access to secretsline 9
[Credential-related source omitted] - Network accessline 40
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Network accessline 42
const OAUTH_BASE = 'https://oauth.reddit.com'; - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 223
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Access to secretsline 225
[Credential-related source omitted] - Access to secretsline 229
[Credential-related source omitted] - Network accessline 370
for (const p of posts) { const permalink = str(p.permalink); const link = permalink ? `https://www.reddit.com${permalink}` : str(p.url); - Network accessline 371
const permalink = str(p.permalink); const link = permalink ? `https://www.reddit.com${permalink}` : str(p.url); lines.push(`- [${str(p.title, '(untitled)')}](${link}) — ${num(p.score)} points, ${num(p.num_comments)} comments`); - Network accessline 372
const link = permalink ? `https://www.reddit.com${permalink}` : str(p.url);
src/fetch/router.ts
- Executable scriptline 1
Executable file - Network accessline 117
export interface HttpClient { fetch( - Network accessline 118
fetch( - Network accessline 154
/** Force a proxy-free browser launch for this fetch (managed-challenge direct-retry). */ - Network accessline 343
} } const resp = await fetch(current, { ...init, redirect: 'manual', signal: combined.signal }); - Network accessline 344
} const resp = await fetch(current, { ...init, redirect: 'manual', signal: combined.signal }); if (resp.status >= 300 && resp.status < 400) { - Network accessline 345
const resp = await fetch(current, { ...init, redirect: 'manual', signal: combined.signal }); - Network accessline 628
try { host = new URL(url).hostname; } catch { host = null; } const headers = host ? this.withClearanceHeader(host, 'http', opts.headers) : opts.headers; return this.httpClient.fetch(url, { ...opts, headers }); - Network accessline 629
const headers = host ? this.withClearanceHeader(host, 'http', opts.headers) : opts.headers; return this.httpClient.fetch(url, { ...opts, headers }); } - Network accessline 630
return this.httpClient.fetch(url, { ...opts, headers }); - Access to secretsline 731
[Credential-related source omitted] - Access to secretsline 733
[Credential-related source omitted] - Access to secretsline 734
[Credential-related source omitted] - Access to secretsline 741
[Credential-related source omitted] - Network accessline 943
async fetch(url: string, options: RouterFetchOptions & { mode: 'stealth' }): Promise<RawFetchResult | StageError>; - Network accessline 944
async fetch(url: string, options?: RouterFetchOptions): Promise<RawFetchResult>; - Network accessline 945
async fetch(
src/fetch/scraping-browser.ts
- Executable scriptline 1
Executable file
src/fetch/settle.ts
- Executable scriptline 1
Executable file
src/fetch/solve-ladder.ts
- Executable scriptline 1
Executable file
src/fetch/stealth.ts
- Executable scriptline 1
Executable file
src/fetch/tls-tier.ts
- Executable scriptline 1
Executable file - Network accessline 191
/** * Cap on total impersonation attempts per fetch (active profile + rotations). - Network accessline 192
* Cap on total impersonation attempts per fetch (active profile + rotations). - Network accessline 327
? options.headers : stripCookieHeader(options.headers); const resp = await backend.fetch(current, { - Network accessline 328
: stripCookieHeader(options.headers); const resp = await backend.fetch(current, { headers: hopHeaders, - Network accessline 329
const resp = await backend.fetch(current, {
src/index.ts
- Executable scriptline 1
#!/usr/bin/env node
src/instructions.ts
- Executable scriptline 1
Executable file - Access to secretsline 40
[Credential-related source omitted] - Network accessline 115
search({ query: "...", force_refresh: true }) fetch({ url: "...", force_refresh: true }) - Network accessline 116
fetch({ url: "...", force_refresh: true }) - Access to secretsline 169
[Credential-related source omitted]
src/integrations/cloud/llm/anthropic.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/cache.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/custom-backend.ts
- Executable scriptline 1
Executable file - Network accessline 5
// a remote proxy, or Ollama via its raw URL. // - the literal alias `ollama` — resolves to a local Ollama base // (http://localhost:11434, overridable via WIGOLO_LLM_BASE_URL) and flags - Network accessline 6
// - the literal alias `ollama` — resolves to a local Ollama base // (http://localhost:11434, overridable via WIGOLO_LLM_BASE_URL) and flags // isOllama so the runner can auto-pick an installed model from /api/tags. - Network accessline 7
// (http://localhost:11434, overridable via WIGOLO_LLM_BASE_URL) and flags - Network accessline 17
export const DEFAULT_OLLAMA_BASE_URL = 'http://localhost:11434'; - Access to secretsline 48
[Credential-related source omitted] - Network accessline 60
* - http(s):// URL in WIGOLO_LLM_PROVIDER → { url, isOllama: false } * - `ollama` in WIGOLO_LLM_PROVIDER or config.json llmProvider * → { url: WIGOLO_LLM_BASE_URL ?? http://localhost:11434, isOllama: true } - Network accessline 61
* - `ollama` in WIGOLO_LLM_PROVIDER or config.json llmProvider * → { url: WIGOLO_LLM_BASE_URL ?? http://localhost:11434, isOllama: true } * - anything else (provider id, unset) → null - Network accessline 62
* → { url: WIGOLO_LLM_BASE_URL ?? http://localhost:11434, isOllama: true }
src/integrations/cloud/llm/gemini.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/groq.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/hash.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/local-tier.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/model-select.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/openai.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/run.ts
- Executable scriptline 1
Executable file - Network accessline 2
// env (or keystore) and delegates: // - cloud provider name (anthropic/openai/gemini/groq) → SDK adapter // - OpenAI-compatible URL (http://...) → POST /v1/chat/completions - Network accessline 3
// - cloud provider name (anthropic/openai/gemini/groq) → SDK adapter // - OpenAI-compatible URL (http://...) → POST /v1/chat/completions // - Network accessline 4
// - OpenAI-compatible URL (http://...) → POST /v1/chat/completions - Access to secretsline 6
[Credential-related source omitted] - Network accessline 174
return withRetry(`custom:${model}`, async () => { const start = Date.now(); const response = await fetch(endpoint, { - Network accessline 175
const start = Date.now(); const response = await fetch(endpoint, { method: 'POST', - Network accessline 176
const response = await fetch(endpoint, { - Access to secretsline 248
[Credential-related source omitted]
src/integrations/cloud/llm/select.ts
- Executable scriptline 1
Executable file - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted]
src/integrations/cloud/llm/text-adapters.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/types.ts
- Executable scriptline 1
Executable file
src/integrations/cloud/llm/validate.ts
- Executable scriptline 1
Executable file
src/logger.ts
- Executable scriptline 1
Executable file
src/pdf-parse.d.ts
- Executable scriptline 1
Executable file
src/persisted-config.ts
- Executable scriptline 1
Executable file - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted] - Access to secretsline 156
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 205
[Credential-related source omitted] - Access to secretsline 341
[Credential-related source omitted] - Access to secretsline 389
[Credential-related source omitted]
src/plugins/loader.ts
- Executable scriptline 1
Executable file
src/plugins/registry.ts
- Executable scriptline 1
Executable file
src/plugins/validate.ts
- Executable scriptline 1
Executable file
src/providers/embed-provider.ts
- Executable scriptline 1
Executable file
src/providers/extract-provider.ts
- Executable scriptline 1
Executable file
src/providers/idle-unload.ts
- Executable scriptline 1
Executable file
src/providers/rerank-provider.ts
- Executable scriptline 1
Executable file
src/providers/search-provider.ts
- Executable scriptline 1
Executable file
src/providers/vector-store.ts
- Executable scriptline 1
Executable file
src/python-env.ts
src/repl/commands/agent.ts
- Executable scriptline 1
Executable file
src/repl/commands/cache.ts
- Executable scriptline 1
Executable file
src/repl/commands/crawl.ts
- Executable scriptline 1
Executable file
src/repl/commands/diff.ts
- Executable scriptline 1
Executable file
src/repl/commands/extract.ts
- Executable scriptline 1
Executable file
src/repl/commands/fetch.ts
- Executable scriptline 1
Executable file
src/repl/commands/find-similar.ts
- Executable scriptline 1
Executable file
src/repl/commands/research.ts
- Executable scriptline 1
Executable file
src/repl/commands/search.ts
- Executable scriptline 1
Executable file
src/repl/commands/types.ts
- Executable scriptline 1
Executable file
src/repl/commands/watch.ts
src/repl/completer.ts
- Executable scriptline 1
Executable file
src/repl/formatters.ts
- Executable scriptline 1
Executable file
src/repl/parser.ts
- Executable scriptline 1
Executable file
src/repl/shell.ts
src/research/branch-exploration.ts
- Executable scriptline 1
Executable file
src/research/brief.ts
src/research/citation-graph.ts
- Executable scriptline 1
Executable file
src/research/decompose.ts
- Executable scriptline 1
Executable file
src/research/entity-extractor.ts
- Executable scriptline 1
Executable file
src/research/pipeline.ts
- Executable scriptline 1
Executable file - Network accessline 414
try { const raw = await Promise.race([ router.fetch(result.url, { renderJs: 'auto' }), - Network accessline 415
const raw = await Promise.race([ router.fetch(result.url, { renderJs: 'auto' }), new Promise<never>((_, reject) => - Network accessline 416
router.fetch(result.url, { renderJs: 'auto' }),
src/research/render-brief.ts
- Executable scriptline 1
Executable file
src/research/source-validation.ts
- Executable scriptline 1
Executable file
src/research/synthesis-local.ts
src/research/synthesize.ts
- Executable scriptline 1
Executable file
src/search/answer-synthesis.ts
src/search/content-fetch.ts
- Executable scriptline 1
Executable file - Network accessline 155
signal: AbortSignal, ): Promise<string> { const raw = await router.fetch(url, { - Network accessline 156
): Promise<string> { const raw = await router.fetch(url, { renderJs: renderModeFor(ctx), - Network accessline 157
const raw = await router.fetch(url, {
src/search/context-formatter.ts
- Executable scriptline 1
Executable file
src/search/core/brand-collision.ts
- Executable scriptline 1
Executable file
src/search/core/canonical-url.ts
- Executable scriptline 1
Executable file
src/search/core/context-rank.ts
- Executable scriptline 1
Executable file
src/search/core/core-provider.ts
- Executable scriptline 1
Executable file
src/search/core/domain-quality.ts
- Executable scriptline 1
Executable file
src/search/core/engine-base.ts
- Executable scriptline 1
Executable file
src/search/core/engine-health.ts
- Executable scriptline 1
Executable file - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 84
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted]
src/search/core/engine-quality.ts
- Executable scriptline 1
Executable file
src/search/core/engine-warnings.ts
- Executable scriptline 1
Executable file - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted]
src/search/core/error-intent.ts
- Executable scriptline 1
Executable file
src/search/core/favicon.ts
- Executable scriptline 1
Executable file - Network accessline 16
const cached = cache.get(host); if (cached) return cached; const url = `https://www.google.com/s2/favicons?domain=${encodeURIComponent(host)}&sz=64`; - Network accessline 17
if (cached) return cached; const url = `https://www.google.com/s2/favicons?domain=${encodeURIComponent(host)}&sz=64`; cache.set(host, url); - Network accessline 18
const url = `https://www.google.com/s2/favicons?domain=${encodeURIComponent(host)}&sz=64`;
src/search/core/freshness.ts
- Executable scriptline 1
Executable file
src/search/core/intent-router.ts
- Executable scriptline 1
Executable file
src/search/core/lexical-alignment.ts
- Executable scriptline 1
Executable file
src/search/core/orchestrator.ts
- Executable scriptline 1
Executable file
src/search/core/query-expansion.ts
- Executable scriptline 1
Executable file
src/search/core/query-understanding.ts
- Executable scriptline 1
Executable file
src/search/core/rare-terms.ts
- Executable scriptline 1
Executable file
src/search/core/recency-boost.ts
- Executable scriptline 1
Executable file
src/search/core/recent-cache-dedup.ts
src/search/core/rerank-fold.ts
- Executable scriptline 1
Executable file
src/search/core/rss/feed-config.ts
- Executable scriptline 1
Executable file
src/search/core/rss/feed-parser.ts
- Executable scriptline 1
Executable file - Network accessline 102
/** * linkedom treats <link> as an HTML void element (self-closing), so RSS * <link>https://...</link> ends up with the URL as a text node sibling - Network accessline 103
* linkedom treats <link> as an HTML void element (self-closing), so RSS * <link>https://...</link> ends up with the URL as a text node sibling * rather than the link's textContent. Atom uses <link href="..." /> which - Network accessline 104
* <link>https://...</link> ends up with the URL as a text node sibling
src/search/core/rss/feed-poller.ts
- Executable scriptline 1
Executable file
src/search/core/rss/feed-store.ts
- Executable scriptline 1
Executable file
src/search/core/rss/rss-engine.ts
- Executable scriptline 1
Executable file
src/search/core/score-floor.ts
- Executable scriptline 1
Executable file
src/search/core/text-tokenizer.ts
- Executable scriptline 1
Executable file
src/search/core/time-range.ts
- Executable scriptline 1
Executable file
src/search/core/verticals/code.ts
- Executable scriptline 1
Executable file
src/search/core/verticals/docs.ts
- Executable scriptline 1
Executable file
src/search/core/verticals/general.ts
- Executable scriptline 1
Executable file
src/search/core/verticals/images.ts
src/search/core/verticals/news.ts
- Executable scriptline 1
Executable file
src/search/core/verticals/papers.ts
- Executable scriptline 1
Executable file
src/search/dedup.ts
- Executable scriptline 1
Executable file
src/search/engines/arxiv.ts
- Executable scriptline 1
Executable file - Network accessline 23
sortBy: 'relevance', }); const url = `http://export.arxiv.org/api/query?${params}`; - Network accessline 24
}); const url = `http://export.arxiv.org/api/query?${params}`; log.debug('arxiv search', { query }); - Network accessline 25
const url = `http://export.arxiv.org/api/query?${params}`; - Network accessline 28
const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });
src/search/engines/bing-news.ts
src/search/engines/bing.ts
src/search/engines/brave-image.ts
- Executable scriptline 1
Executable file - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Network accessline 68
const url = `https://api.search.brave.com/res/v1/images/search?${params}`; - Network accessline 72
const response = await fetch(url, {
src/search/engines/brave.ts
- Executable scriptline 1
Executable file - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 44
const url = `https://api.search.brave.com/res/v1/web/search?${params}`; - Network accessline 48
const response = await fetch(url, {
src/search/engines/crates-io.ts
- Executable scriptline 1
Executable file - Network accessline 45
const url = `https://crates.io/api/v1/crates?${params}`; - Network accessline 48
const response = await fetch(url, { - Network accessline 49
signal: AbortSignal.timeout(timeoutMs), headers: { 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', - Network accessline 50
headers: { 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', Accept: 'application/json', - Network accessline 51
'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', - Network accessline 76
results.push({ title: name, url: `https://crates.io/crates/${name}`, - Network accessline 77
title: name, url: `https://crates.io/crates/${name}`, snippet, - Network accessline 78
url: `https://crates.io/crates/${name}`,
src/search/engines/dblp.ts
- Executable scriptline 1
Executable file - Network accessline 55
const DBLP_ORIGIN = 'https://dblp.org/'; - Network accessline 92
h: String(maxResults), }); const url = `https://dblp.org/search/publ/api?${params}`; - Network accessline 93
}); const url = `https://dblp.org/search/publ/api?${params}`; log.debug('dblp search', { query }); - Network accessline 94
const url = `https://dblp.org/search/publ/api?${params}`; - Network accessline 97
const response = await fetch(url, {
src/search/engines/ddg-image.ts
- Executable scriptline 1
Executable file - Network accessline 33
// DuckDuckGo image search. Zero-key path: the i.js JSON endpoint needs a // `vqd` token bootstrapped from a regular DDG search page. The flow is: // 1. GET https://duckduckgo.com/?q=<query> → scrape vqd token from HTML - Network accessline 34
// `vqd` token bootstrapped from a regular DDG search page. The flow is: // 1. GET https://duckduckgo.com/?q=<query> → scrape vqd token from HTML // 2. GET https://duckduckgo.com/i.js?q=<query>&vqd=<token>&o=json → JSON - Network accessline 35
// 1. GET https://duckduckgo.com/?q=<query> → scrape vqd token from HTML - Network accessline 36
// 2. GET https://duckduckgo.com/i.js?q=<query>&vqd=<token>&o=json → JSON - Network accessline 49
log.debug('ddg-image: bootstrapping vqd token', { query }); const bootstrapUrl = `https://duckduckgo.com/?q=${encodeURIComponent(query)}&iax=images&ia=images`; const bootstrap = await fetch(bootstrapUrl, { - Network accessline 50
const bootstrapUrl = `https://duckduckgo.com/?q=${encodeURIComponent(query)}&iax=images&ia=images`; const bootstrap = await fetch(bootstrapUrl, { signal: AbortSignal.timeout(timeoutMs), - Network accessline 51
const bootstrap = await fetch(bootstrapUrl, { - Network accessline 63
const region = options.country ? `${options.country.toLowerCase()}-${lang}` : 'us-en'; const ijsUrl = `https://duckduckgo.com/i.js?l=${region}` + - Network accessline 64
const ijsUrl = `https://duckduckgo.com/i.js?l=${region}` + `&o=json&q=${encodeURIComponent(query)}&vqd=${vqd}&f=,,,,,&p=1`; - Network accessline 65
`https://duckduckgo.com/i.js?l=${region}` + - Network accessline 68
log.debug('ddg-image: fetching i.js', { region }); const response = await fetch(ijsUrl, { - Network accessline 69
const response = await fetch(ijsUrl, { - Network accessline 76
'Referer': 'https://duckduckgo.com/',
src/search/engines/devdocs.ts
- Executable scriptline 1
Executable file - Network accessline 62
results.push({ title: doc.title, url: `https://devdocs.io/${doc.slug.split('~')[0]}`, - Network accessline 63
title: doc.title, url: `https://devdocs.io/${doc.slug.split('~')[0]}`, snippet: `${doc.title} — ${doc.type}`, - Network accessline 64
url: `https://devdocs.io/${doc.slug.split('~')[0]}`,
src/search/engines/duckduckgo.ts
- Executable scriptline 1
Executable file - Network accessline 34
params.set('kl', `${options.country.toLowerCase()}-${lang}`); } const url = `https://lite.duckduckgo.com/lite/?${params}`; - Network accessline 36
const url = `https://lite.duckduckgo.com/lite/?${params}`; - Network accessline 40
const response = await fetch(url, {
src/search/engines/github-code.ts
- Executable scriptline 1
Executable file - Network accessline 36
per_page: String(maxResults), }); const url = `https://api.github.com/search/code?${params}`; - Network accessline 37
}); const url = `https://api.github.com/search/code?${params}`; log.debug('github code search', { query }); - Network accessline 38
const url = `https://api.github.com/search/code?${params}`; - Network accessline 54
const response = await fetch(url, {
src/search/engines/hn-algolia.ts
- Executable scriptline 1
Executable file - Network accessline 63
const url = `https://hn.algolia.com/api/v1/search?${params}`; - Network accessline 66
const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) }); - Network accessline 82
const objectID = asString(hit.objectID); const url = asString(hit.url) ?? (objectID ? `https://news.ycombinator.com/item?id=${objectID}` : undefined); - Network accessline 83
const url = asString(hit.url) ?? (objectID ? `https://news.ycombinator.com/item?id=${objectID}` : undefined);
src/search/engines/lobsters.ts
- Executable scriptline 1
Executable file - Network accessline 45
const params = new URLSearchParams({ q: query, what: 'stories' }); const url = `https://lobste.rs/search.json?${params}`; - Network accessline 46
const url = `https://lobste.rs/search.json?${params}`; - Network accessline 54
const response = await fetch(url, { - Network accessline 56
headers: { Accept: 'application/json', 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', - Network accessline 57
Accept: 'application/json', 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', }, - Network accessline 58
'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)',
src/search/engines/marginalia.ts
- Executable scriptline 1
Executable file - Network accessline 22
// queries that S11a is designed to surface. Free JSON API, no key. // // Endpoint shape: `https://api2.marginalia-search.com/search?query=<q>&count=N&dc=N` - Network accessline 23
[Credential-related source omitted] - Network accessline 24
// Endpoint shape: `https://api2.marginalia-search.com/search?query=<q>&count=N&dc=N` - Network accessline 38
const params = new URLSearchParams({ query, count: String(maxResults), dc: '3' }); const url = `https://api2.marginalia-search.com/search?${params}`; - Network accessline 39
const url = `https://api2.marginalia-search.com/search?${params}`; - Network accessline 43
const response = await fetch(url, { - Network accessline 44
signal: AbortSignal.timeout(timeoutMs), headers: { 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', - Network accessline 45
headers: { 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', Accept: 'application/json', - Network accessline 46
'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)',
src/search/engines/mdn.ts
src/search/engines/mojeek.ts
- Executable scriptline 1
Executable file - Network accessline 30
const params = new URLSearchParams({ q: query, safe: '0' }); const url = `https://www.mojeek.com/search?${params}`; - Network accessline 31
const url = `https://www.mojeek.com/search?${params}`; - Network accessline 35
const response = await fetch(url, {
src/search/engines/openalex.ts
- Executable scriptline 1
Executable file - Network accessline 64
per_page: String(maxResults), }); const url = `https://api.openalex.org/works?${params}`; - Network accessline 65
}); const url = `https://api.openalex.org/works?${params}`; log.debug('openalex search', { query }); - Network accessline 66
const url = `https://api.openalex.org/works?${params}`; - Network accessline 69
const response = await fetch(url, {
src/search/engines/openreview.ts
- Executable scriptline 1
Executable file - Network accessline 44
limit: String(maxResults), }); const url = `https://api2.openreview.net/notes/search?${params}`; - Network accessline 45
}); const url = `https://api2.openreview.net/notes/search?${params}`; log.debug('openreview search', { query }); - Network accessline 46
const url = `https://api2.openreview.net/notes/search?${params}`; - Network accessline 49
const response = await fetch(url, { - Network accessline 71
const forum = asString(note.forum); if (!forum) continue; const url = `https://openreview.net/forum?id=${forum}`; - Network accessline 73
const url = `https://openreview.net/forum?id=${forum}`;
src/search/engines/semantic-scholar.ts
src/search/engines/stackoverflow.ts
src/search/engines/user-agents.ts
- Executable scriptline 1
Executable file
src/search/engines/wikipedia.ts
- Executable scriptline 1
Executable file - Network accessline 24
namespace: '0', }); const url = `https://${language}.wikipedia.org/w/api.php?${params}`; - Network accessline 26
const url = `https://${language}.wikipedia.org/w/api.php?${params}`; - Network accessline 30
const response = await fetch(url, { - Network accessline 31
signal: AbortSignal.timeout(timeoutMs), headers: { 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', - Network accessline 32
headers: { 'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)', 'Accept': 'application/json', - Network accessline 33
'User-Agent': 'wigolo/0.1 (https://github.com/KnockOutEZ/wigolo)',
src/search/evidence.ts
- Executable scriptline 1
Executable file
src/search/filters.ts
- Executable scriptline 1
Executable file
src/search/find-similar.ts
- Executable scriptline 1
Executable file - Network accessline 492
try { log.info('fetching URL for signal extraction', { url }); const raw = await router.fetch(url, { renderJs: 'auto' }); - Network accessline 493
log.info('fetching URL for signal extraction', { url }); const raw = await router.fetch(url, { renderJs: 'auto' }); const extractor = await getExtractProvider(); - Network accessline 494
const raw = await router.fetch(url, { renderJs: 'auto' });
src/search/find-similar/crawl-rank.ts
- Executable scriptline 1
Executable file - Network accessline 57
// SSRF guard on the seed before any fetch — the seed is fetched raw via // router.fetch (bypassing handleFetch's guard), so a metadata/private seed - Network accessline 58
// router.fetch (bypassing handleFetch's guard), so a metadata/private seed - Network accessline 70
let seedRaw; try { seedRaw = await router.fetch(seedUrl, { renderJs: 'auto' }); - Network accessline 71
try { seedRaw = await router.fetch(seedUrl, { renderJs: 'auto' }); } catch (err) { - Network accessline 72
seedRaw = await router.fetch(seedUrl, { renderJs: 'auto' }); - Network accessline 286
chunk.map(async u => { const raw = await withTimeout( router.fetch(u, { renderJs: 'auto' }), - Network accessline 287
const raw = await withTimeout( router.fetch(u, { renderJs: 'auto' }), fetchTimeoutMs, - Network accessline 288
router.fetch(u, { renderJs: 'auto' }),
src/search/find-similar/mode.ts
- Executable scriptline 1
Executable file
src/search/highlights.ts
- Executable scriptline 1
Executable file
src/search/hybrid/common-nouns.ts
- Executable scriptline 1
Executable file
src/search/hybrid/merge.ts
- Executable scriptline 1
Executable file
src/search/hybrid/router.ts
- Executable scriptline 1
Executable file
src/search/hybrid/signals.ts
- Executable scriptline 1
Executable file
src/search/language-filter.ts
- Executable scriptline 1
Executable file
src/search/legacy/searxng-orchestrator.ts
- Executable scriptline 1
Executable file
src/search/legacy/searxng-provider.ts
- Executable scriptline 1
Executable file
src/search/multi-query.ts
- Executable scriptline 1
Executable file
src/search/query.ts
- Executable scriptline 1
Executable file
src/search/rerank.ts
- Executable scriptline 1
Executable file
src/search/reranker/authority-boost.ts
- Executable scriptline 1
Executable file
src/search/reranker/consensus-boost.ts
- Executable scriptline 1
Executable file
src/search/reranker/recency-boost.ts
- Executable scriptline 1
Executable file
src/search/reranker/recency.ts
- Executable scriptline 1
Executable file
src/search/reranker/remote-rerank-provider.ts
- Executable scriptline 1
Executable file - Access to secretsline 29
[Credential-related source omitted] - Network accessline 43
let response: Response; try { response = await fetch(this.url, { - Network accessline 44
try { response = await fetch(this.url, { method: 'POST', - Network accessline 45
response = await fetch(this.url, {
src/search/reranker/transformers-rerank-provider.ts
- Executable scriptline 1
Executable file
src/search/rrf.ts
- Executable scriptline 1
Executable file
src/search/sampling.ts
- Executable scriptline 1
Executable file
src/search/searxng.ts
src/search/tokens.ts
- Executable scriptline 1
Executable file
src/search/truncate.ts
- Executable scriptline 1
Executable file
src/search/url-unwrap.ts
- Executable scriptline 1
Executable file
src/search/validator.ts
- Executable scriptline 1
Executable file - Network accessline 20
const checks = batch.map(async (result): Promise<{ result: T; ok: boolean }> => { try { const response = await fetch(result.url, { - Network accessline 21
try { const response = await fetch(result.url, { method: 'HEAD', - Network accessline 22
const response = await fetch(result.url, {
src/searxng/bootstrap.ts
- Executable scriptline 1
Executable file - Network accessline 295
'`podman` binary or its `podman-docker` compatibility shim), or any other CLI providing a ' + '`docker`/`podman` command on PATH all work. ' + 'See https://github.com/searxng/searxng/discussions/4029.', - Network accessline 296
'`docker`/`podman` command on PATH all work. ' + 'See https://github.com/searxng/searxng/discussions/4029.', ); - Network accessline 297
'See https://github.com/searxng/searxng/discussions/4029.', - Network accessline 347
log.info('downloading SearXNG source'); const response = await fetch('https://github.com/searxng/searxng/archive/refs/heads/master.tar.gz'); - Network accessline 348
const response = await fetch('https://github.com/searxng/searxng/archive/refs/heads/master.tar.gz'); - Dangerous shell operationline 379
// and warmup show "run: sudo apt install pythonX.Y-venv" rather than
src/searxng/docker.ts
- Executable scriptline 1
Executable file - Network accessline 74
getUrl(): string | null { return this.port ? `http://127.0.0.1:${this.port}` : null; - Network accessline 75
return this.port ? `http://127.0.0.1:${this.port}` : null; - Network accessline 110
while (Date.now() - start < 15000) { try { const response = await fetch(`${url}/healthz`, { signal: AbortSignal.timeout(2000) }); - Network accessline 111
try { const response = await fetch(`${url}/healthz`, { signal: AbortSignal.timeout(2000) }); if (response.ok) { - Network accessline 112
const response = await fetch(`${url}/healthz`, { signal: AbortSignal.timeout(2000) });
src/searxng/enabled.ts
- Executable scriptline 1
Executable file
src/searxng/process.ts
- Executable scriptline 1
Executable file - Network accessline 108
while (Date.now() - start < timeoutMs) { try { const response = await fetch(`${url}/healthz`, { signal: AbortSignal.timeout(2000) }); - Network accessline 109
try { const response = await fetch(`${url}/healthz`, { signal: AbortSignal.timeout(2000) }); if (response.ok) return true; - Network accessline 110
const response = await fetch(`${url}/healthz`, { signal: AbortSignal.timeout(2000) }); - Network accessline 133
getUrl(): string | null { return this.port ? `http://127.0.0.1:${this.port}` : null; - Network accessline 134
return this.port ? `http://127.0.0.1:${this.port}` : null; - Network accessline 251
if (this.stopped || !this.port) return; try { const r = await fetch(`http://127.0.0.1:${this.port}/healthz`, { signal: AbortSignal.timeout(2000) }); - Network accessline 252
try { const r = await fetch(`http://127.0.0.1:${this.port}/healthz`, { signal: AbortSignal.timeout(2000) }); if (r.ok) { - Network accessline 253
const r = await fetch(`http://127.0.0.1:${this.port}/healthz`, { signal: AbortSignal.timeout(2000) });
src/security/key-crypto.ts
src/security/key-store.ts
- Executable scriptline 1
Executable file - Access to secretsline 2
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 8
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 134
[Credential-related source omitted] - Access to secretsline 158
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Access to secretsline 171
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted] - Access to secretsline 176
[Credential-related source omitted] - Access to secretsline 179
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 203
[Credential-related source omitted] - Access to secretsline 207
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted]
src/security/keychain.ts
- Executable scriptline 1
Executable file - Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted]
src/server.ts
- Executable scriptline 1
Executable file
src/server/backend-status.ts
- Executable scriptline 1
Executable file
src/server/search-response.ts
- Executable scriptline 1
Executable file
src/server/tool-schemas.ts
- Executable scriptline 1
Executable file - Network accessline 482
max_pages: { type: 'number', description: 'Maximum pages to fetch (default 10, max 100)', - Network accessline 483
type: 'number', description: 'Maximum pages to fetch (default 10, max 100)', }, - Network accessline 484
description: 'Maximum pages to fetch (default 10, max 100)',
src/server/warmup-on-start.ts
- Executable scriptline 1
Executable file - Network accessline 26
const ENGINE_WARM_ORIGINS = [ 'https://www.bing.com', - Network accessline 27
'https://www.bing.com', - Network accessline 28
'https://lite.duckduckgo.com', - Network accessline 29
'https://en.wikipedia.org', - Network accessline 30
'https://www.mojeek.com', - Network accessline 31
'https://api2.marginalia-search.com', - Network accessline 49
enginePending = Promise.allSettled( ENGINE_WARM_ORIGINS.map((origin) => fetch(origin, { signal: AbortSignal.timeout(ENGINE_WARM_TIMEOUT_MS) }) - Network accessline 51
fetch(origin, { signal: AbortSignal.timeout(ENGINE_WARM_TIMEOUT_MS) })
src/tools/agent.ts
- Executable scriptline 1
Executable file
src/tools/cache.ts
- Executable scriptline 1
Executable file - Network accessline 53
continue; } const raw = await router.fetch(entry.url, { renderJs: 'auto' }); - Network accessline 54
} const raw = await router.fetch(entry.url, { renderJs: 'auto' }); const extractor = await getExtractProvider(); - Network accessline 55
const raw = await router.fetch(entry.url, { renderJs: 'auto' });
src/tools/crawl.ts
- Executable scriptline 1
Executable file - Network accessline 87
const rawFetchFn = async (url: string) => router.fetch(url, { renderJs: 'never' }); - Network accessline 88
router.fetch(url, { renderJs: 'never' }); - Network accessline 227
): Promise<MapOutput & { crawled: number }> { const httpFetchFn = async (url: string) => { const raw = await router.fetch(url, { renderJs: 'never' }); - Network accessline 228
const httpFetchFn = async (url: string) => { const raw = await router.fetch(url, { renderJs: 'never' }); return { html: raw.html, finalUrl: raw.finalUrl, statusCode: raw.statusCode }; - Network accessline 229
const raw = await router.fetch(url, { renderJs: 'never' });
src/tools/diff.ts
- Executable scriptline 1
Executable file
src/tools/extract.ts
src/tools/fetch.ts
- Executable scriptline 1
Executable file - Network accessline 63
ok: false, reason: `url is not a valid absolute URL: ${JSON.stringify(raw)}`, hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', - Network accessline 64
reason: `url is not a valid absolute URL: ${JSON.stringify(raw)}`, hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', }; - Network accessline 65
hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', - Network accessline 254
const raw = await router.fetch(input.url, { - Network accessline 419
// Solve-ladder provenance from the browser tier when a challenge was // detected on this fetch (e.g. a challenge the ladder cleared to content). - Network accessline 420
// detected on this fetch (e.g. a challenge the ladder cleared to content).
src/tools/find-similar.ts
- Executable scriptline 1
Executable file
src/tools/research.ts
- Executable scriptline 1
Executable file
src/tools/search.ts
- Executable scriptline 1
Executable file
src/tools/watch.ts
- Executable scriptline 1
Executable file
src/types.ts
- Executable scriptline 1
Executable file - Network accessline 765
fetched: boolean; fetch_error?: string; /** Render-completeness label from the fetch (browser tier only). A `shell` - Network accessline 766
fetch_error?: string; /** Render-completeness label from the fetch (browser tier only). A `shell` * level excludes the source from the evidence set before synthesis. */ - Network accessline 767
/** Render-completeness label from the fetch (browser tier only). A `shell`
src/util/abort.ts
- Executable scriptline 1
Executable file
src/util/child-env.ts
src/util/engine-list.ts
- Executable scriptline 1
Executable file
src/util/mode.ts
- Executable scriptline 1
Executable file
src/util/native-abi.ts
- Executable scriptline 1
Executable file
src/util/packaged.ts
- Executable scriptline 1
Executable file
src/util/redact-url.ts
- Executable scriptline 1
Executable file
src/watch/scheduler.ts
- Executable scriptline 1
Executable file - Network accessline 197
// Minimal POST. We rely on the runtime's built-in fetch (Node 20+) so - Network accessline 202
// webhook URL passes the guardUrl check at registration time, but the // target server can return 307/308 redirecting to e.g. // http://127.0.0.1/admin. With the default `redirect: 'follow'`, Node's - Network accessline 203
// target server can return 307/308 redirecting to e.g. // http://127.0.0.1/admin. With the default `redirect: 'follow'`, Node's // fetch would silently re-issue the POST against the loopback target, - Network accessline 204
// http://127.0.0.1/admin. With the default `redirect: 'follow'`, Node's - Network accessline 208
const res = await fetch(webhookUrl, {
src/watch/ssrf.ts
- Executable scriptline 1
Executable file - Network accessline 148
code: SSRF_CODES.INVALID_URL, reason: `${fieldLabel} is not a valid URL`, hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', - Network accessline 149
reason: `${fieldLabel} is not a valid URL`, hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', }; - Network accessline 150
hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', - Network accessline 235
code: SSRF_CODES.INVALID_URL, reason: `${fieldLabel} is not a valid URL`, hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', - Network accessline 236
reason: `${fieldLabel} is not a valid URL`, hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', }; - Network accessline 237
hint: 'Pass a fully qualified http(s) URL (e.g. "https://example.com/path").', - Network accessline 391
* resolved-IP policy is identical to the literal-IP policy — no drift. * * Call this right before the actual fetch (and on each redirect hop) for any - Network accessline 392
* * Call this right before the actual fetch (and on each redirect hop) for any * non-IP-literal host. On success it returns the validated `addresses`; pass them to - Network accessline 393
* Call this right before the actual fetch (and on each redirect hop) for any - Network accessline 443
if (!addresses) return { ok: true }; for (const { address, family } of addresses) { const ipUrl = family === 6 ? `http://[${address}]/` : `http://${address}/`; - Network accessline 444
for (const { address, family } of addresses) { const ipUrl = family === 6 ? `http://[${address}]/` : `http://${address}/`; const res = guardFetchUrl(ipUrl, fieldLabel, { allowPrivate: opts.allowPrivate }); - Network accessline 445
const ipUrl = family === 6 ? `http://[${address}]/` : `http://${address}/`; - Network accessline 473
!opts.bindIsLoopback && process.env.WIGOLO_SERVE_ALLOW_LOCAL_TARGETS !== '1'; for (const { address, family } of addresses) { const ipUrl = family === 6 ? `http://[${address}]/` : `http://${address}/`; - Network accessline 474
for (const { address, family } of addresses) { const ipUrl = family === 6 ? `http://[${address}]/` : `http://${address}/`; const res = guardFetchUrl(ipUrl, fieldLabel, { allowPrivate: opts.allowPrivate }); - Network accessline 475
const ipUrl = family === 6 ? `http://[${address}]/` : `http://${address}/`;
src/watch/store.ts
- Executable scriptline 1
Executable file
tests/e2e/doctor-clean-exit.e2e.test.ts
- Executable scriptline 1
Executable file
tests/e2e/fetch-tool.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
const addr = server.address(); if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); - Network accessline 40
if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); } - Network accessline 41
resolve(`http://localhost:${addr.port}`); - Network accessline 139
it('non-existent URL returns error response without throwing', async () => { const __r_result = await handleFetch( { url: 'http://localhost:1/nonexistent' }, - Network accessline 140
const __r_result = await handleFetch( { url: 'http://localhost:1/nonexistent' }, router, - Network accessline 141
{ url: 'http://localhost:1/nonexistent' },
tests/e2e/init-command.e2e.test.ts
- Executable scriptline 1
Executable file
tests/e2e/mcp-startup.test.ts
- Executable scriptline 1
Executable file
tests/e2e/search-tool.test.ts
- Executable scriptline 1
Executable file - Network accessline 66
name: 'e2e-mock', search: async () => [ { title: 'React Tutorial', url: `http://127.0.0.1:${port}/react`, snippet: 'Learn React', relevance_score: 0.95, engine: 'e2e-mock' }, - Network accessline 67
search: async () => [ { title: 'React Tutorial', url: `http://127.0.0.1:${port}/react`, snippet: 'Learn React', relevance_score: 0.95, engine: 'e2e-mock' }, { title: 'TypeScript Handbook', url: `http://127.0.0.1:${port}/type - Network accessline 68
{ title: 'React Tutorial', url: `http://127.0.0.1:${port}/react`, snippet: 'Learn React', relevance_score: 0.95, engine: 'e2e-mock' }, - Network accessline 69
{ title: 'TypeScript Handbook', url: `http://127.0.0.1:${port}/typescript`, snippet: 'Learn TypeScript', relevance_score: 0.85, engine: 'e2e-mock' }, - Network accessline 139
name: 'mixed', search: async () => [ { title: 'Good', url: `http://127.0.0.1:${contentPort}/react`, snippet: 'OK', relevance_score: 0.9, engine: 'mixed' }, - Network accessline 140
search: async () => [ { title: 'Good', url: `http://127.0.0.1:${contentPort}/react`, snippet: 'OK', relevance_score: 0.9, engine: 'mixed' }, { title: 'Bad', url: 'http://127.0.0.1:1/nonexistent', snippet: 'Fail', relevance_s - Network accessline 141
{ title: 'Good', url: `http://127.0.0.1:${contentPort}/react`, snippet: 'OK', relevance_score: 0.9, engine: 'mixed' }, - Network accessline 142
{ title: 'Bad', url: 'http://127.0.0.1:1/nonexistent', snippet: 'Fail', relevance_score: 0.5, engine: 'mixed' },
tests/e2e/searxng-cold-bootstrap.e2e.test.ts
- Executable scriptline 1
Executable file
tests/fetch/pinned-dispatcher.test.ts
- Executable scriptline 1
Executable file
tests/fetch/pinned-e2e.test.ts
- Executable scriptline 1
Executable file - Network accessline 6
* The unit tests for `createPinnedLookup` prove the hook returns the right address. They do NOT * prove the hook is actually wired into a real request, or that wiring it does not break one — * and every other http-client test fetches an I - Network accessline 7
* prove the hook is actually wired into a real request, or that wiring it does not break one — * and every other http-client test fetches an IP literal (`http://127.0.0.1:PORT/`), which skips * the pinned path completely. - Network accessline 8
* and every other http-client test fetches an IP literal (`http://127.0.0.1:PORT/`), which skips - Network accessline 36
it('fetches successfully by name, not by IP literal', async () => { const res = await httpFetch(`http://localhost:${port}/`); - Network accessline 37
const res = await httpFetch(`http://localhost:${port}/`); - Network accessline 43
it('still fetches by IP literal, where no pinning applies', async () => { const before = hits; const res = await httpFetch(`http://127.0.0.1:${port}/`); - Network accessline 44
const before = hits; const res = await httpFetch(`http://127.0.0.1:${port}/`); expect(res.statusCode).toBe(200); - Network accessline 45
const res = await httpFetch(`http://127.0.0.1:${port}/`);
tests/fetch/pinned-failclosed.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
it('refuses a hostname that produced no validated addresses', async () => { await expect(httpFetch('http://nothing-resolves-here.invalid/')).rejects.toThrow( - Network accessline 32
await expect(httpFetch('http://nothing-resolves-here.invalid/')).rejects.toThrow( - Network accessline 37
it('fails fast on an unresolvable hostname rather than burning the retry budget', async () => { const err = await httpFetch('http://nothing-resolves-here.invalid/').catch((e: unknown) => e); - Network accessline 38
const err = await httpFetch('http://nothing-resolves-here.invalid/').catch((e: unknown) => e); - Network accessline 44
const res = await httpFetch(`http://localhost:${port}/`);
tests/fetch/pinned-rebind.test.ts
- Executable scriptline 1
Executable file - Network accessline 68
if (!bothBound) ctx.skip(); const agent = new Agent({ connect: { lookup: rebindingLookup } as never }); const res = await request(`http://pinned.test:${port}/`, { dispatcher: agent }); - Network accessline 69
const agent = new Agent({ connect: { lookup: rebindingLookup } as never }); const res = await request(`http://pinned.test:${port}/`, { dispatcher: agent }); const body = await res.body.text(); - Network accessline 70
const res = await request(`http://pinned.test:${port}/`, { dispatcher: agent }); - Network accessline 83
} as never, }); const res = await request(`http://pinned.test:${port}/`, { dispatcher: agent }); - Network accessline 84
}); const res = await request(`http://pinned.test:${port}/`, { dispatcher: agent }); const body = await res.body.text(); - Network accessline 85
const res = await request(`http://pinned.test:${port}/`, { dispatcher: agent });
tests/fetch/pinned-redirect-body.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
if (req.url === '/redir') { res.writeHead(302, { location: `http://127.0.0.1:${port}/done`, - Network accessline 40
res.writeHead(302, { location: `http://127.0.0.1:${port}/done`, 'content-type': 'text/plain', - Network accessline 41
location: `http://127.0.0.1:${port}/done`, - Network accessline 77
it('releases the redirect body instead of leaving it in flight', async () => { const started = Date.now(); const res = await httpFetch(`http://localhost:${port}/redir`, { timeoutMs: 2000 }); - Network accessline 78
const started = Date.now(); const res = await httpFetch(`http://localhost:${port}/redir`, { timeoutMs: 2000 }); const elapsed = Date.now() - started; - Network accessline 79
const res = await httpFetch(`http://localhost:${port}/redir`, { timeoutMs: 2000 });
tests/fetch/pinned-redirect.test.ts
- Executable scriptline 1
Executable file - Network accessline 24
seen.push(req.url ?? ''); if (req.url === '/to-literal') { res.writeHead(302, { location: `http://127.0.0.1:${port}/done` }); - Network accessline 25
if (req.url === '/to-literal') { res.writeHead(302, { location: `http://127.0.0.1:${port}/done` }); res.end(); - Network accessline 26
res.writeHead(302, { location: `http://127.0.0.1:${port}/done` }); - Network accessline 29
} if (req.url === '/to-name') { res.writeHead(302, { location: `http://localhost:${port}/done` }); - Network accessline 30
if (req.url === '/to-name') { res.writeHead(302, { location: `http://localhost:${port}/done` }); res.end(); - Network accessline 31
res.writeHead(302, { location: `http://localhost:${port}/done` }); - Network accessline 46
it('name -> IP literal: the literal hop must not inherit the named hop dispatcher', async () => { const res = await httpFetch(`http://localhost:${port}/to-literal`); - Network accessline 47
const res = await httpFetch(`http://localhost:${port}/to-literal`); - Network accessline 48
expect(res.statusCode).toBe(200); expect(res.html).toContain('arrived'); expect(res.finalUrl).toBe(`http://127.0.0.1:${port}/done`); - Network accessline 49
expect(res.html).toContain('arrived'); expect(res.finalUrl).toBe(`http://127.0.0.1:${port}/done`); }, 30000); - Network accessline 50
expect(res.finalUrl).toBe(`http://127.0.0.1:${port}/done`); - Network accessline 53
it('IP literal -> name: the named hop still gets its own pin', async () => { const res = await httpFetch(`http://127.0.0.1:${port}/to-name`); - Network accessline 54
const res = await httpFetch(`http://127.0.0.1:${port}/to-name`); - Network accessline 55
expect(res.statusCode).toBe(200); expect(res.html).toContain('arrived'); expect(res.finalUrl).toBe(`http://localhost:${port}/done`); - Network accessline 56
expect(res.html).toContain('arrived'); expect(res.finalUrl).toBe(`http://localhost:${port}/done`); }, 30000); - Network accessline 57
expect(res.finalUrl).toBe(`http://localhost:${port}/done`);
tests/fixtures/amazon/book.html
- Network accessline 4
<meta charset="utf-8"> <title>The Pragmatic Programmer: 20th Anniversary Edition: Thomas, David, Hunt, Andrew: 9780135957059: Amazon.com: Books</title> <link rel="canonical" href="https://www.amazon.com/dp/0135957052/"> - Network accessline 5
<title>The Pragmatic Programmer: 20th Anniversary Edition: Thomas, David, Hunt, Andrew: 9780135957059: Amazon.com: Books</title> <link rel="canonical" href="https://www.amazon.com/dp/0135957052/"> </head> - Network accessline 6
<link rel="canonical" href="https://www.amazon.com/dp/0135957052/"> - Network accessline 52
<div id="imgTagWrapperId" class="imgTagWrapper"> <img id="landingImage" data-old-hires="https://m.media-amazon.com/images/I/41as+WafrFL._SX381_BO1,204,203,200_.jpg" - Network accessline 53
<img id="landingImage" data-old-hires="https://m.media-amazon.com/images/I/41as+WafrFL._SX381_BO1,204,203,200_.jpg" src="https://m.media-amazon.com/images/I/41as+WafrFL._SX381_BO1,204,203,200_.jpg" - Network accessline 54
data-old-hires="https://m.media-amazon.com/images/I/41as+WafrFL._SX381_BO1,204,203,200_.jpg" - Network accessline 55
src="https://m.media-amazon.com/images/I/41as+WafrFL._SX381_BO1,204,203,200_.jpg"
tests/fixtures/amazon/de-euro.html
- Network accessline 4
<meta charset="utf-8"> <title>Amazon.de: Acme Espresso Maschine ES-200</title> <link rel="canonical" href="https://www.amazon.de/dp/B08N5WRWNW/"> - Network accessline 5
<title>Amazon.de: Acme Espresso Maschine ES-200</title> <link rel="canonical" href="https://www.amazon.de/dp/B08N5WRWNW/"> </head> - Network accessline 6
<link rel="canonical" href="https://www.amazon.de/dp/B08N5WRWNW/"> - Network accessline 45
<div id="rightCol"> <div id="imageBlock"> <img id="landingImage" src="https://m.media-amazon.com/images/I/61espresso-de._AC_SX522_.jpg" alt="Acme Espresso Maschine"> - Network accessline 46
<div id="imageBlock"> <img id="landingImage" src="https://m.media-amazon.com/images/I/61espresso-de._AC_SX522_.jpg" alt="Acme Espresso Maschine"> </div> - Network accessline 47
<img id="landingImage" src="https://m.media-amazon.com/images/I/61espresso-de._AC_SX522_.jpg" alt="Acme Espresso Maschine">
tests/fixtures/amazon/electronics.html
- Network accessline 4
<meta charset="utf-8"> <title>Amazon.com: Acme Wireless Noise-Cancelling Headphones — Black</title> <link rel="canonical" href="https://www.amazon.com/dp/B08N5WRWNW/"> - Network accessline 5
<title>Amazon.com: Acme Wireless Noise-Cancelling Headphones — Black</title> <link rel="canonical" href="https://www.amazon.com/dp/B08N5WRWNW/"> </head> - Network accessline 6
<link rel="canonical" href="https://www.amazon.com/dp/B08N5WRWNW/"> - Network accessline 50
<div id="imgTagWrapperId" class="imgTagWrapper"> <img id="landingImage" data-old-hires="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SL1500_.jpg" - Network accessline 51
<img id="landingImage" data-old-hires="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SL1500_.jpg" src="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SX522_.jpg" - Network accessline 52
data-old-hires="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SL1500_.jpg" - Network accessline 53
src="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SX522_.jpg" - Network accessline 56
<div id="altImages"> <ul> <li class="item itemNo0"><span><img src="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SS40_.jpg" alt=""></span></li> - Network accessline 57
<ul> <li class="item itemNo0"><span><img src="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SS40_.jpg" alt=""></span></li> <li class="item itemNo1"><span><img src="https://images-na.ssl-images-amazon.co - Network accessline 58
<li class="item itemNo0"><span><img src="https://images-na.ssl-images-amazon.com/images/I/61abc1234L._AC_SS40_.jpg" alt=""></span></li> - Network accessline 59
<li class="item itemNo1"><span><img src="https://images-na.ssl-images-amazon.com/images/I/71def5678L._AC_SS40_.jpg" alt=""></span></li> - Network accessline 60
<li class="item itemNo2"><span><img src="https://images-na.ssl-images-amazon.com/images/I/81ghi9012L._AC_SS40_.jpg" alt=""></span></li> - Network accessline 61
<li class="item itemNo3"><span><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" alt="placeholder"></span></li> <li class="item itemTracking"><span><img src="https://m.media-amazon.com/images/G/01/x-locale/trac - Network accessline 62
<li class="item itemTracking"><span><img src="https://m.media-amazon.com/images/G/01/x-locale/tracking/pixel.gif" alt=""></span></li>
tests/fixtures/amazon/grocery.html
- Network accessline 4
<meta charset="utf-8"> <title>Amazon.com: Bob's Red Mill Organic Old Fashioned Rolled Oats, 32 oz (Pack of 4)</title> <link rel="canonical" href="https://www.amazon.com/dp/B0042NS3I8/"> - Network accessline 5
<title>Amazon.com: Bob's Red Mill Organic Old Fashioned Rolled Oats, 32 oz (Pack of 4)</title> <link rel="canonical" href="https://www.amazon.com/dp/B0042NS3I8/"> </head> - Network accessline 6
<link rel="canonical" href="https://www.amazon.com/dp/B0042NS3I8/"> - Network accessline 49
<div id="imgTagWrapperId" class="imgTagWrapper"> <img id="landingImage" data-old-hires="https://m.media-amazon.com/images/I/81QrcAbCdEL._SL1500_.jpg" - Network accessline 50
<img id="landingImage" data-old-hires="https://m.media-amazon.com/images/I/81QrcAbCdEL._SL1500_.jpg" src="https://m.media-amazon.com/images/I/81QrcAbCdEL._SL1500_.jpg" - Network accessline 51
data-old-hires="https://m.media-amazon.com/images/I/81QrcAbCdEL._SL1500_.jpg" - Network accessline 52
src="https://m.media-amazon.com/images/I/81QrcAbCdEL._SL1500_.jpg"
tests/fixtures/amazon/out-of-stock.html
- Network accessline 4
<meta charset="utf-8"> <title>Amazon.com: Limited Edition Collectible Mug</title> <link rel="canonical" href="https://www.amazon.com/dp/B07XYZ1234/"> - Network accessline 5
<title>Amazon.com: Limited Edition Collectible Mug</title> <link rel="canonical" href="https://www.amazon.com/dp/B07XYZ1234/"> </head> - Network accessline 6
<link rel="canonical" href="https://www.amazon.com/dp/B07XYZ1234/"> - Network accessline 35
<div id="imageBlock"> <div id="imgTagWrapperId" class="imgTagWrapper"> <img id="landingImage" src="https://m.media-amazon.com/images/I/71mugmugmug._AC_SL1500_.jpg" alt="Limited Edition Mug"> - Network accessline 36
<div id="imgTagWrapperId" class="imgTagWrapper"> <img id="landingImage" src="https://m.media-amazon.com/images/I/71mugmugmug._AC_SL1500_.jpg" alt="Limited Edition Mug"> </div> - Network accessline 37
<img id="landingImage" src="https://m.media-amazon.com/images/I/71mugmugmug._AC_SL1500_.jpg" alt="Limited Edition Mug">
tests/fixtures/amazon/uk-pound.html
- Network accessline 4
<meta charset="utf-8"> <title>Amazon.co.uk: Acme Smart Kettle 1.7L Stainless Steel</title> <link rel="canonical" href="https://www.amazon.co.uk/dp/B09KETTLE1/"> - Network accessline 5
<title>Amazon.co.uk: Acme Smart Kettle 1.7L Stainless Steel</title> <link rel="canonical" href="https://www.amazon.co.uk/dp/B09KETTLE1/"> </head> - Network accessline 6
<link rel="canonical" href="https://www.amazon.co.uk/dp/B09KETTLE1/"> - Network accessline 46
<div id="rightCol"> <div id="imageBlock"> <img id="landingImage" src="https://m.media-amazon.com/images/I/61kettleuk._AC_SX522_.jpg" alt="Acme Smart Kettle"> - Network accessline 47
<div id="imageBlock"> <img id="landingImage" src="https://m.media-amazon.com/images/I/61kettleuk._AC_SX522_.jpg" alt="Acme Smart Kettle"> </div> - Network accessline 48
<img id="landingImage" src="https://m.media-amazon.com/images/I/61kettleuk._AC_SX522_.jpg" alt="Acme Smart Kettle">
tests/fixtures/bing-tracker-urls.json
- Network accessline 3
{ "description": "react docs homepage via Bing redirect", "encoded": "https://www.bing.com/ck/a?!&&p=abc123&ptn=3&hsh=1&fclid=00000000-0000-0000-0000-000000000000&psq=react&u=a1aHR0cHM6Ly9yZWFjdC5kZXYv", - Network accessline 5
"encoded": "https://www.bing.com/ck/a?!&&p=abc123&ptn=3&hsh=1&fclid=00000000-0000-0000-0000-000000000000&psq=react&u=a1aHR0cHM6Ly9yZWFjdC5kZXYv", - Network accessline 6
"expected": "https://react.dev/" - Network accessline 8
{ "description": "MDN JS reference via Bing redirect", "encoded": "https://www.bing.com/ck/a?!&&u=a1aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdA", - Network accessline 10
"encoded": "https://www.bing.com/ck/a?!&&u=a1aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdA", - Network accessline 11
"expected": "https://developer.mozilla.org/en-US/docs/Web/JavaScript" - Network accessline 13
{ "description": "URL-safe base64 with - (encoded +) requiring conversion", "encoded": "https://www.bing.com/ck/a?&u=a1aHR0cHM6Ly9leGFtcGxlLmNvbS9-dXNlci9maWxl", - Network accessline 15
"encoded": "https://www.bing.com/ck/a?&u=a1aHR0cHM6Ly9leGFtcGxlLmNvbS9-dXNlci9maWxl", - Network accessline 16
"expected": "https://example.com/~user/file"
tests/fixtures/brand/anthropic.html
- Network accessline 7
<meta property="og:title" content="Home \\ Anthropic"> <meta property="og:description" content="Anthropic is an AI safety company. We build reliable, interpretable, steerable AI systems."> <meta property="og:image" content="https://www. - Network accessline 8
<meta property="og:description" content="Anthropic is an AI safety company. We build reliable, interpretable, steerable AI systems."> <meta property="og:image" content="https://www.anthropic.com/_next/image?url=%2Fimages%2Fog%2Fhomepage.p - Network accessline 9
<meta property="og:image" content="https://www.anthropic.com/_next/image?url=%2Fimages%2Fog%2Fhomepage.png&w=1920&q=75"> - Network accessline 14
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 15
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 16
"@context": "https://schema.org", - Network accessline 17
"@type": "Organization", "name": "Anthropic", "url": "https://www.anthropic.com/", - Network accessline 18
"name": "Anthropic", "url": "https://www.anthropic.com/", "logo": "https://www.anthropic.com/images/anthropic-logo.svg", - Network accessline 19
"url": "https://www.anthropic.com/", - Network accessline 20
"logo": "https://www.anthropic.com/images/anthropic-logo.svg", - Network accessline 21
"sameAs": [ "https://twitter.com/AnthropicAI", "https://www.linkedin.com/company/anthropicresearch" - Network accessline 22
"https://twitter.com/AnthropicAI", - Network accessline 23
"https://www.linkedin.com/company/anthropicresearch" - Network accessline 39
</header> <footer> <a href="https://twitter.com/AnthropicAI">Twitter</a> - Network accessline 40
<footer> <a href="https://twitter.com/AnthropicAI">Twitter</a> <a href="https://www.linkedin.com/company/anthropicresearch">LinkedIn</a> - Network accessline 41
<a href="https://twitter.com/AnthropicAI">Twitter</a> - Network accessline 42
<a href="https://www.linkedin.com/company/anthropicresearch">LinkedIn</a>
tests/fixtures/brand/cloudflare.html
- Network accessline 6
<meta property="og:title" content="Cloudflare - The Web Performance & Security Company"> <meta property="og:description" content="Here at Cloudflare, we make the Internet work the way it should. Offering CDN, DNS, DDoS protection and secu - Network accessline 7
<meta property="og:description" content="Here at Cloudflare, we make the Internet work the way it should. Offering CDN, DNS, DDoS protection and security, find out how we can help your site."> <meta property="og:image" content="https://ww - Network accessline 8
<meta property="og:image" content="https://www.cloudflare.com/img/cf-facebook-card-default.png"> - Network accessline 9
<meta name="twitter:site" content="@cloudflare"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" type="image/png" href="https://www.cloudflare.com/favicon.png"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" type="image/png" href="https://www.cloudflare.com/favicon.png"> <link rel="apple-touch-icon" sizes="180x180" href="https://www.cloudflare.com/apple-touch-icon.png - Network accessline 11
<link rel="icon" type="image/png" href="https://www.cloudflare.com/favicon.png"> - Network accessline 12
<link rel="apple-touch-icon" sizes="180x180" href="https://www.cloudflare.com/apple-touch-icon.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Cloudflare", "url": "https://www.cloudflare.com", - Network accessline 17
"name": "Cloudflare", "url": "https://www.cloudflare.com", "logo": "https://www.cloudflare.com/img/cf-logo.svg", - Network accessline 18
"url": "https://www.cloudflare.com", - Network accessline 19
"logo": "https://www.cloudflare.com/img/cf-logo.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/cloudflare", "https://www.linkedin.com/company/cloudflare", - Network accessline 21
"https://twitter.com/cloudflare", - Network accessline 22
"https://www.linkedin.com/company/cloudflare", - Network accessline 23
"https://www.youtube.com/user/CloudflareTV", - Network accessline 24
"https://github.com/cloudflare" - Network accessline 41
</header> <footer> <a href="https://twitter.com/cloudflare">Twitter</a> - Network accessline 42
<footer> <a href="https://twitter.com/cloudflare">Twitter</a> <a href="https://github.com/cloudflare">GitHub</a> - Network accessline 43
<a href="https://twitter.com/cloudflare">Twitter</a> - Network accessline 44
<a href="https://github.com/cloudflare">GitHub</a> - Network accessline 45
<a href="https://www.linkedin.com/company/cloudflare">LinkedIn</a>
tests/fixtures/brand/convex.html
- Network accessline 6
<meta property="og:title" content="Convex | The reactive database for app developers"> <meta property="og:description" content="Convex is the open-source reactive database where queries are TypeScript code running right in the database."> - Network accessline 7
<meta property="og:description" content="Convex is the open-source reactive database where queries are TypeScript code running right in the database."> <meta property="og:image" content="https://convex.dev/og-image.png"> <meta name="twi - Network accessline 8
<meta property="og:image" content="https://convex.dev/og-image.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Convex", "url": "https://convex.dev", - Network accessline 17
"name": "Convex", "url": "https://convex.dev", "logo": "https://convex.dev/img/convex-logo.svg", - Network accessline 18
"url": "https://convex.dev", - Network accessline 19
"logo": "https://convex.dev/img/convex-logo.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/convex_dev", "https://github.com/get-convex", - Network accessline 21
"https://twitter.com/convex_dev", - Network accessline 22
"https://github.com/get-convex", - Network accessline 23
"https://www.linkedin.com/company/convex-dev", - Network accessline 24
"https://discord.gg/convex" - Network accessline 40
</header> <footer> <a href="https://twitter.com/convex_dev">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/convex_dev">Twitter</a> <a href="https://github.com/get-convex">GitHub</a> - Network accessline 42
<a href="https://twitter.com/convex_dev">Twitter</a> - Network accessline 43
<a href="https://github.com/get-convex">GitHub</a> - Network accessline 44
<a href="https://discord.gg/convex">Discord</a>
tests/fixtures/brand/discord.html
- Network accessline 6
<meta property="og:title" content="Discord | Your Place to Talk and Hang Out"> <meta property="og:description" content="Discord is the easiest way to talk over voice, video, and text. Talk, chat, hang out, and stay close with your friends - Network accessline 7
<meta property="og:description" content="Discord is the easiest way to talk over voice, video, and text. Talk, chat, hang out, and stay close with your friends and communities."> <meta property="og:image" content="https://discord.com/asse - Network accessline 8
<meta property="og:image" content="https://discord.com/assets/d2dd6c9aabec22e5e2d50e0c7f0f1eaf.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Discord", "url": "https://discord.com", - Network accessline 17
"name": "Discord", "url": "https://discord.com", "logo": "https://discord.com/assets/847541504914fd33810e70a0ea73177e.svg", - Network accessline 18
"url": "https://discord.com", - Network accessline 19
"logo": "https://discord.com/assets/847541504914fd33810e70a0ea73177e.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/discord", "https://github.com/discord", - Network accessline 21
"https://twitter.com/discord", - Network accessline 22
"https://github.com/discord", - Network accessline 23
"https://www.linkedin.com/company/discord", - Network accessline 24
"https://www.youtube.com/discord" - Network accessline 40
</header> <footer> <a href="https://twitter.com/discord">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/discord">Twitter</a> <a href="https://discord.gg/discord">Discord Invite</a> - Network accessline 42
<a href="https://twitter.com/discord">Twitter</a> - Network accessline 43
<a href="https://discord.gg/discord">Discord Invite</a> - Network accessline 44
<a href="https://github.com/discord">GitHub</a>
tests/fixtures/brand/figma.html
- Network accessline 6
<meta property="og:title" content="Figma: The Collaborative Interface Design Tool"> <meta property="og:description" content="Build better products as a team. Design, prototype, and gather feedback all in one place with Figma."> <meta pr - Network accessline 7
<meta property="og:description" content="Build better products as a team. Design, prototype, and gather feedback all in one place with Figma."> <meta property="og:image" content="https://cdn.sanity.io/images/599r6htc/regionalized/figma-me - Network accessline 8
<meta property="og:image" content="https://cdn.sanity.io/images/599r6htc/regionalized/figma-meta.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Figma", "url": "https://www.figma.com", - Network accessline 17
"name": "Figma", "url": "https://www.figma.com", "logo": "https://static.figma.com/uploads/figma-logo.svg", - Network accessline 18
"url": "https://www.figma.com", - Network accessline 19
"logo": "https://static.figma.com/uploads/figma-logo.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/figma", "https://www.linkedin.com/company/figma", - Network accessline 21
"https://twitter.com/figma", - Network accessline 22
"https://www.linkedin.com/company/figma", - Network accessline 23
"https://www.youtube.com/c/Figmadesign" - Network accessline 39
</header> <footer> <a href="https://twitter.com/figma">Twitter</a> - Network accessline 40
<footer> <a href="https://twitter.com/figma">Twitter</a> <a href="https://www.linkedin.com/company/figma">LinkedIn</a> - Network accessline 41
<a href="https://twitter.com/figma">Twitter</a> - Network accessline 42
<a href="https://www.linkedin.com/company/figma">LinkedIn</a> - Network accessline 43
<a href="https://www.youtube.com/c/Figmadesign">YouTube</a>
tests/fixtures/brand/fly.html
- Network accessline 6
<meta property="og:title" content="Fly.io | The public cloud, reinvented for developers who ship"> <meta property="og:description" content="Fly.io transforms containers into micro-VMs that run on our hardware in 35+ regions on six contine - Network accessline 7
<meta property="og:description" content="Fly.io transforms containers into micro-VMs that run on our hardware in 35+ regions on six continents."> <meta property="og:image" content="https://fly.io/static/images/social-card.png"> <meta na - Network accessline 8
<meta property="og:image" content="https://fly.io/static/images/social-card.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Fly.io", "url": "https://fly.io", - Network accessline 17
"name": "Fly.io", "url": "https://fly.io", "logo": "https://fly.io/static/images/brand/logo-portrait.svg", - Network accessline 18
"url": "https://fly.io", - Network accessline 19
"logo": "https://fly.io/static/images/brand/logo-portrait.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/flydotio", "https://github.com/superfly", - Network accessline 21
"https://twitter.com/flydotio", - Network accessline 22
"https://github.com/superfly", - Network accessline 23
"https://www.linkedin.com/company/fly-io" - Network accessline 39
</header> <footer> <a href="https://twitter.com/flydotio">Twitter</a> - Network accessline 40
<footer> <a href="https://twitter.com/flydotio">Twitter</a> <a href="https://github.com/superfly">GitHub</a> - Network accessline 41
<a href="https://twitter.com/flydotio">Twitter</a> - Network accessline 42
<a href="https://github.com/superfly">GitHub</a> - Network accessline 43
<a href="https://www.linkedin.com/company/fly-io">LinkedIn</a>
tests/fixtures/brand/fonts/linear.html
- Network accessline 5
<meta property="og:site_name" content="Linear"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin> - Network accessline 6
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display= - Network accessline 7
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin> - Network accessline 8
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap">
tests/fixtures/brand/fonts/stripe.html
- Network accessline 5
<meta property="og:site_name" content="Stripe"> <link rel="icon" href="/favicon.ico"> <link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 6
<link rel="icon" href="/favicon.ico"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sohne:wght@400;500;700&display=swap"> - Network accessline 7
<link rel="preconnect" href="https://fonts.googleapis.com"> - Network accessline 8
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Sohne:wght@400;500;700&display=swap">
tests/fixtures/brand/github.html
- Network accessline 7
<meta property="og:title" content="GitHub: Let's build from here"> <meta property="og:description" content="GitHub is where over 100 million developers shape the future of software, together."> <meta property="og:image" content="https:/ - Network accessline 8
<meta property="og:description" content="GitHub is where over 100 million developers shape the future of software, together."> <meta property="og:image" content="https://github.githubassets.com/images/modules/site/social-cards/github-soci - Network accessline 9
<meta property="og:image" content="https://github.githubassets.com/images/modules/site/social-cards/github-social.png"> - Network accessline 10
<meta name="twitter:site" content="@github"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg"> - Network accessline 11
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg"> <link rel="alternate icon" class="js-site-favicon" type= - Network accessline 12
<link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg"> - Network accessline 13
<link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> - Network accessline 14
<link rel="apple-touch-icon" href="https://github.githubassets.com/apple-touch-icon-180x180.png" sizes="180x180"> - Network accessline 15
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 16
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 17
"@context": "https://schema.org", - Network accessline 18
"@type": "Organization", "name": "GitHub", "url": "https://github.com", - Network accessline 19
"name": "GitHub", "url": "https://github.com", "logo": "https://github.com/images/modules/logos_page/GitHub-Mark.png", - Network accessline 20
"url": "https://github.com", - Network accessline 21
"logo": "https://github.com/images/modules/logos_page/GitHub-Mark.png", - Network accessline 22
"sameAs": [ "https://twitter.com/github", "https://www.linkedin.com/company/github", - Network accessline 23
"https://twitter.com/github", - Network accessline 24
"https://www.linkedin.com/company/github", - Network accessline 25
"https://www.youtube.com/github" - Network accessline 40
</header> <footer> <a href="https://twitter.com/github">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/github">Twitter</a> <a href="https://github.com/github">GitHub</a> - Network accessline 42
<a href="https://twitter.com/github">Twitter</a> - Network accessline 43
<a href="https://github.com/github">GitHub</a> - Network accessline 44
<a href="https://www.linkedin.com/company/github">LinkedIn</a>
tests/fixtures/brand/linear.html
- Network accessline 6
<meta property="og:title" content="Linear – A better way to build products"> <meta property="og:description" content="Meet the new standard for modern software development. Streamline issues, sprints, and product roadmaps."> <meta prope - Network accessline 7
<meta property="og:description" content="Meet the new standard for modern software development. Streamline issues, sprints, and product roadmaps."> <meta property="og:image" content="https://linear.app/static/og/home.jpg"> <meta name="t - Network accessline 8
<meta property="og:image" content="https://linear.app/static/og/home.jpg"> - Network accessline 14
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 15
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 16
"@context": "https://schema.org", - Network accessline 17
"@type": "Organization", "name": "Linear", "url": "https://linear.app", - Network accessline 18
"name": "Linear", "url": "https://linear.app", "logo": "https://linear.app/static/logo.png", - Network accessline 19
"url": "https://linear.app", - Network accessline 20
"logo": "https://linear.app/static/logo.png", - Network accessline 21
"sameAs": [ "https://twitter.com/linear", "https://github.com/linear", - Network accessline 22
"https://twitter.com/linear", - Network accessline 23
"https://github.com/linear", - Network accessline 24
"https://www.linkedin.com/company/linear" - Network accessline 42
</header> <footer> <a href="https://twitter.com/linear">Twitter</a> - Network accessline 43
<footer> <a href="https://twitter.com/linear">Twitter</a> <a href="https://github.com/linear">GitHub</a> - Network accessline 44
<a href="https://twitter.com/linear">Twitter</a> - Network accessline 45
<a href="https://github.com/linear">GitHub</a>
tests/fixtures/brand/netlify.html
- Network accessline 6
<meta property="og:title" content="Netlify: Develop & deploy the best web experiences in record time"> <meta property="og:description" content="Netlify is a platform for automating modern web projects. Replace your hosting infrastructure, - Network accessline 7
<meta property="og:description" content="Netlify is a platform for automating modern web projects. Replace your hosting infrastructure, continuous integration, and deployment pipeline with a single workflow."> <meta property="og:image" co - Network accessline 8
<meta property="og:image" content="https://www.netlify.com/v3/img/components/social.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Netlify", "url": "https://www.netlify.com", - Network accessline 17
"name": "Netlify", "url": "https://www.netlify.com", "logo": "https://www.netlify.com/v3/img/components/logomark.png", - Network accessline 18
"url": "https://www.netlify.com", - Network accessline 19
"logo": "https://www.netlify.com/v3/img/components/logomark.png", - Network accessline 20
"sameAs": [ "https://twitter.com/netlify", "https://github.com/netlify", - Network accessline 21
"https://twitter.com/netlify", - Network accessline 22
"https://github.com/netlify", - Network accessline 23
"https://www.linkedin.com/company/netlify", - Network accessline 24
"https://www.youtube.com/c/Netlify" - Network accessline 41
</header> <footer> <a href="https://twitter.com/netlify">Twitter</a> - Network accessline 42
<footer> <a href="https://twitter.com/netlify">Twitter</a> <a href="https://github.com/netlify">GitHub</a> - Network accessline 43
<a href="https://twitter.com/netlify">Twitter</a> - Network accessline 44
<a href="https://github.com/netlify">GitHub</a> - Network accessline 45
<a href="https://www.linkedin.com/company/netlify">LinkedIn</a>
tests/fixtures/brand/nextjs.html
- Network accessline 6
<meta property="og:title" content="Next.js by Vercel - The React Framework"> <meta property="og:description" content="Production grade React applications that scale. The world's leading companies use Next.js by Vercel to build pre-rendere - Network accessline 7
<meta property="og:description" content="Production grade React applications that scale. The world's leading companies use Next.js by Vercel to build pre-rendered applications, static websites, and more."> <meta property="og:image" conten - Network accessline 8
<meta property="og:image" content="https://nextjs.org/og.png"> - Network accessline 9
<meta name="twitter:site" content="@nextjs"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" type="image/svg+xml" href="https://nextjs.org/favicon.ico"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" type="image/svg+xml" href="https://nextjs.org/favicon.ico"> <link rel="apple-touch-icon" sizes="180x180" href="https://nextjs.org/apple-icon.png"> - Network accessline 11
<link rel="icon" type="image/svg+xml" href="https://nextjs.org/favicon.ico"> - Network accessline 12
<link rel="apple-touch-icon" sizes="180x180" href="https://nextjs.org/apple-icon.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Next.js", "url": "https://nextjs.org", - Network accessline 17
"name": "Next.js", "url": "https://nextjs.org", "logo": "https://nextjs.org/static/blog/next-9/twitter-card.png", - Network accessline 18
"url": "https://nextjs.org", - Network accessline 19
"logo": "https://nextjs.org/static/blog/next-9/twitter-card.png", - Network accessline 20
"sameAs": [ "https://twitter.com/nextjs", "https://github.com/vercel/next.js", - Network accessline 21
"https://twitter.com/nextjs", - Network accessline 22
"https://github.com/vercel/next.js", - Network accessline 23
"https://discord.com/invite/bUG2bvbtHy" - Network accessline 39
</header> <footer> <a href="https://twitter.com/nextjs">Twitter</a> - Network accessline 40
<footer> <a href="https://twitter.com/nextjs">Twitter</a> <a href="https://github.com/vercel/next.js">GitHub</a> - Network accessline 41
<a href="https://twitter.com/nextjs">Twitter</a> - Network accessline 42
<a href="https://github.com/vercel/next.js">GitHub</a> - Network accessline 43
<a href="https://discord.com/invite/bUG2bvbtHy">Discord</a>
tests/fixtures/brand/notion.html
- Network accessline 6
<meta property="og:title" content="Notion – One workspace. Every team."> <meta property="og:description" content="We're more than a doc. Or a table. Customize Notion to work the way you do."> <meta property="og:image" content="https://w - Network accessline 7
<meta property="og:description" content="We're more than a doc. Or a table. Customize Notion to work the way you do."> <meta property="og:image" content="https://www.notion.so/cdn-cgi/image/format=auto,width=1200/front-static/meta/default - Network accessline 8
<meta property="og:image" content="https://www.notion.so/cdn-cgi/image/format=auto,width=1200/front-static/meta/default.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Notion", "url": "https://www.notion.so", - Network accessline 17
"name": "Notion", "url": "https://www.notion.so", "logo": "https://www.notion.so/front-static/meta/logo-black.png", - Network accessline 18
"url": "https://www.notion.so", - Network accessline 19
"logo": "https://www.notion.so/front-static/meta/logo-black.png", - Network accessline 20
"sameAs": [ "https://twitter.com/NotionHQ", "https://www.linkedin.com/company/notionhq", - Network accessline 21
"https://twitter.com/NotionHQ", - Network accessline 22
"https://www.linkedin.com/company/notionhq", - Network accessline 23
"https://github.com/makenotion", - Network accessline 24
"https://www.youtube.com/c/Notion" - Network accessline 40
</header> <footer> <a href="https://twitter.com/NotionHQ">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/NotionHQ">Twitter</a> <a href="https://github.com/makenotion">GitHub</a> - Network accessline 42
<a href="https://twitter.com/NotionHQ">Twitter</a> - Network accessline 43
<a href="https://github.com/makenotion">GitHub</a> - Network accessline 44
<a href="https://www.linkedin.com/company/notionhq">LinkedIn</a>
tests/fixtures/brand/openai.html
- Network accessline 6
<meta property="og:title" content="OpenAI"> <meta property="og:description" content="Creating safe AGI that benefits all of humanity."> <meta property="og:image" content="https://images.openai.com/blob/social-card.png"> - Network accessline 7
<meta property="og:description" content="Creating safe AGI that benefits all of humanity."> <meta property="og:image" content="https://images.openai.com/blob/social-card.png"> <meta name="twitter:site" content="@openai"> - Network accessline 8
<meta property="og:image" content="https://images.openai.com/blob/social-card.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "OpenAI", "url": "https://openai.com", - Network accessline 17
"name": "OpenAI", "url": "https://openai.com", "logo": "https://images.openai.com/blob/cf717bdb-0c8c-428a-b82b-3c3add87a600/openai-logo.png", - Network accessline 18
"url": "https://openai.com", - Network accessline 19
"logo": "https://images.openai.com/blob/cf717bdb-0c8c-428a-b82b-3c3add87a600/openai-logo.png", - Network accessline 20
"sameAs": [ "https://twitter.com/OpenAI", "https://www.linkedin.com/company/openai", - Network accessline 21
"https://twitter.com/OpenAI", - Network accessline 22
"https://www.linkedin.com/company/openai", - Network accessline 23
"https://github.com/openai", - Network accessline 24
"https://www.youtube.com/@OpenAI" - Network accessline 40
</header> <footer> <a href="https://twitter.com/OpenAI">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/OpenAI">Twitter</a> <a href="https://github.com/openai">GitHub</a> - Network accessline 42
<a href="https://twitter.com/OpenAI">Twitter</a> - Network accessline 43
<a href="https://github.com/openai">GitHub</a> - Network accessline 44
<a href="https://www.linkedin.com/company/openai">LinkedIn</a>
tests/fixtures/brand/posthog.html
- Network accessline 6
<meta property="og:title" content="PostHog - How developers build successful products"> <meta property="og:description" content="PostHog is the only all-in-one platform for product analytics, feature flags, session replays, A/B testing, a - Network accessline 7
<meta property="og:description" content="PostHog is the only all-in-one platform for product analytics, feature flags, session replays, A/B testing, and surveys that's built for developers."> <meta property="og:image" content="https://pos - Network accessline 8
<meta property="og:image" content="https://posthog.com/brand/posthog-meta.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "PostHog", "url": "https://posthog.com", - Network accessline 17
"name": "PostHog", "url": "https://posthog.com", "logo": "https://posthog.com/brand/posthog-logo.svg", - Network accessline 18
"url": "https://posthog.com", - Network accessline 19
"logo": "https://posthog.com/brand/posthog-logo.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/PostHog", "https://github.com/PostHog", - Network accessline 21
"https://twitter.com/PostHog", - Network accessline 22
"https://github.com/PostHog", - Network accessline 23
"https://www.linkedin.com/company/posthog", - Network accessline 24
"https://www.youtube.com/@PostHog" - Network accessline 41
</header> <footer> <a href="https://twitter.com/PostHog">Twitter</a> - Network accessline 42
<footer> <a href="https://twitter.com/PostHog">Twitter</a> <a href="https://github.com/PostHog">GitHub</a> - Network accessline 43
<a href="https://twitter.com/PostHog">Twitter</a> - Network accessline 44
<a href="https://github.com/PostHog">GitHub</a> - Network accessline 45
<a href="https://www.linkedin.com/company/posthog">LinkedIn</a>
tests/fixtures/brand/railway.html
- Network accessline 6
<meta property="og:title" content="Railway: Bring your code, we'll handle the rest"> <meta property="og:description" content="Made for any language, for projects big and small. Railway is the cloud that takes the complexity out of shippin - Network accessline 7
<meta property="og:description" content="Made for any language, for projects big and small. Railway is the cloud that takes the complexity out of shipping software."> <meta property="og:image" content="https://railway.app/og.png"> <meta - Network accessline 8
<meta property="og:image" content="https://railway.app/og.png"> - Network accessline 9
<meta name="twitter:site" content="@Railway"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" type="image/svg+xml" href="https://railway.app/brand/logo-light.svg"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" type="image/svg+xml" href="https://railway.app/brand/logo-light.svg"> <link rel="apple-touch-icon" href="https://railway.app/apple-touch-icon.png"> - Network accessline 11
<link rel="icon" type="image/svg+xml" href="https://railway.app/brand/logo-light.svg"> - Network accessline 12
<link rel="apple-touch-icon" href="https://railway.app/apple-touch-icon.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Railway", "url": "https://railway.app", - Network accessline 17
"name": "Railway", "url": "https://railway.app", "logo": "https://railway.app/brand/logo-light.svg", - Network accessline 18
"url": "https://railway.app", - Network accessline 19
"logo": "https://railway.app/brand/logo-light.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/Railway", "https://github.com/railwayapp", - Network accessline 21
"https://twitter.com/Railway", - Network accessline 22
"https://github.com/railwayapp", - Network accessline 23
"https://discord.gg/railway" - Network accessline 39
</header> <footer> <a href="https://twitter.com/Railway">Twitter</a> - Network accessline 40
<footer> <a href="https://twitter.com/Railway">Twitter</a> <a href="https://github.com/railwayapp">GitHub</a> - Network accessline 41
<a href="https://twitter.com/Railway">Twitter</a> - Network accessline 42
<a href="https://github.com/railwayapp">GitHub</a> - Network accessline 43
<a href="https://discord.gg/railway">Discord</a>
tests/fixtures/brand/render.html
- Network accessline 6
<meta property="og:title" content="Render · Cloud Application Hosting for Developers"> <meta property="og:description" content="Render is a unified platform to build and run all your apps and websites with free TLS certificates, a global - Network accessline 7
<meta property="og:description" content="Render is a unified platform to build and run all your apps and websites with free TLS certificates, a global CDN, DDoS protection, private networks, and auto deploys from Git."> <meta property="og - Network accessline 8
<meta property="og:image" content="https://render.com/og-image.png"> - Network accessline 14
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 15
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 16
"@context": "https://schema.org", - Network accessline 17
"@type": "Organization", "name": "Render", "url": "https://render.com", - Network accessline 18
"name": "Render", "url": "https://render.com", "logo": "https://render.com/logo.svg", - Network accessline 19
"url": "https://render.com", - Network accessline 20
"logo": "https://render.com/logo.svg", - Network accessline 21
"sameAs": [ "https://twitter.com/render", "https://github.com/renderinc", - Network accessline 22
"https://twitter.com/render", - Network accessline 23
"https://github.com/renderinc", - Network accessline 24
"https://www.linkedin.com/company/render-inc", - Network accessline 25
"https://discord.gg/render" - Network accessline 41
</header> <footer> <a href="https://twitter.com/render">Twitter</a> - Network accessline 42
<footer> <a href="https://twitter.com/render">Twitter</a> <a href="https://github.com/renderinc">GitHub</a> - Network accessline 43
<a href="https://twitter.com/render">Twitter</a> - Network accessline 44
<a href="https://github.com/renderinc">GitHub</a> - Network accessline 45
<a href="https://discord.gg/render">Discord</a>
tests/fixtures/brand/resend.html
- Network accessline 6
<meta property="og:title" content="Resend | Email for developers"> <meta property="og:description" content="The best email platform for developers. Build, test, and send transactional emails at scale."> <meta property="og:image" content - Network accessline 7
<meta property="og:description" content="The best email platform for developers. Build, test, and send transactional emails at scale."> <meta property="og:image" content="https://resend.com/static/og-image.png"> <meta name="twitter:site - Network accessline 8
<meta property="og:image" content="https://resend.com/static/og-image.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Resend", "url": "https://resend.com", - Network accessline 17
"name": "Resend", "url": "https://resend.com", "logo": "https://resend.com/static/brand/resend-icon-black.svg", - Network accessline 18
"url": "https://resend.com", - Network accessline 19
"logo": "https://resend.com/static/brand/resend-icon-black.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/resend", "https://github.com/resend", - Network accessline 21
"https://twitter.com/resend", - Network accessline 22
"https://github.com/resend", - Network accessline 23
"https://www.linkedin.com/company/resendlabs", - Network accessline 24
"https://discord.com/invite/resend" - Network accessline 40
</header> <footer> <a href="https://twitter.com/resend">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/resend">Twitter</a> <a href="https://github.com/resend">GitHub</a> - Network accessline 42
<a href="https://twitter.com/resend">Twitter</a> - Network accessline 43
<a href="https://github.com/resend">GitHub</a> - Network accessline 44
<a href="https://discord.com/invite/resend">Discord</a>
tests/fixtures/brand/slack.html
- Network accessline 6
<meta property="og:title" content="Slack is your productivity platform"> <meta property="og:description" content="Slack is where work happens. It's a digital HQ that brings together your people, tools, customers, and partners."> <meta p - Network accessline 7
<meta property="og:description" content="Slack is where work happens. It's a digital HQ that brings together your people, tools, customers, and partners."> <meta property="og:image" content="https://a.slack-edge.com/80588/marketing/img/me - Network accessline 8
<meta property="og:image" content="https://a.slack-edge.com/80588/marketing/img/meta/slack_hash_128.png"> - Network accessline 9
<meta name="twitter:site" content="@SlackHQ"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" sizes="any" href="https://a.slack-edge.com/cebaa/marketing/img/meta/favicon-32.png"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" sizes="any" href="https://a.slack-edge.com/cebaa/marketing/img/meta/favicon-32.png"> <link rel="apple-touch-icon" sizes="180x180" href="https://a.slack-edge.com/c - Network accessline 11
<link rel="icon" sizes="any" href="https://a.slack-edge.com/cebaa/marketing/img/meta/favicon-32.png"> - Network accessline 12
<link rel="apple-touch-icon" sizes="180x180" href="https://a.slack-edge.com/cebaa/marketing/img/meta/app-icon-180.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Slack", "url": "https://slack.com", - Network accessline 17
"name": "Slack", "url": "https://slack.com", "logo": "https://a.slack-edge.com/80588/marketing/img/meta/slack-logo.png", - Network accessline 18
"url": "https://slack.com", - Network accessline 19
"logo": "https://a.slack-edge.com/80588/marketing/img/meta/slack-logo.png", - Network accessline 20
"sameAs": [ "https://twitter.com/SlackHQ", "https://www.linkedin.com/company/tiny-speck-inc-", - Network accessline 21
"https://twitter.com/SlackHQ", - Network accessline 22
"https://www.linkedin.com/company/tiny-speck-inc-", - Network accessline 23
"https://www.youtube.com/user/SlackHQ" - Network accessline 39
</header> <footer> <a href="https://twitter.com/SlackHQ">Twitter</a> - Network accessline 40
<footer> <a href="https://twitter.com/SlackHQ">Twitter</a> <a href="https://www.linkedin.com/company/tiny-speck-inc-">LinkedIn</a> - Network accessline 41
<a href="https://twitter.com/SlackHQ">Twitter</a> - Network accessline 42
<a href="https://www.linkedin.com/company/tiny-speck-inc-">LinkedIn</a> - Network accessline 43
<a href="https://www.youtube.com/user/SlackHQ">YouTube</a>
tests/fixtures/brand/stripe.html
- Network accessline 6
<meta property="og:title" content="Stripe | Financial infrastructure for the internet"> <meta property="og:description" content="Millions of companies of all sizes use Stripe online and in person to accept payments, send payouts, automate - Network accessline 7
<meta property="og:description" content="Millions of companies of all sizes use Stripe online and in person to accept payments, send payouts, automate financial processes, and ultimately grow revenue."> <meta property="og:image" content=" - Network accessline 8
<meta property="og:image" content="https://images.stripeassets.com/fzn2n1nzq965/HTTOloNPhisV9P4hlMPNA/cacf1bb88b9fc492dfad34378d844280/Stripe_og_image.png"> - Network accessline 12
<link rel="icon" type="image/svg+xml" sizes="any" href="/img/v3/home/social.svg"> <link rel="apple-touch-icon" sizes="180x180" href="/img/v3/home/apple-touch-icon.png"> <link rel="canonical" href="https://stripe.com/"> - Network accessline 13
<link rel="apple-touch-icon" sizes="180x180" href="/img/v3/home/apple-touch-icon.png"> <link rel="canonical" href="https://stripe.com/"> <script type="application/ld+json"> - Network accessline 14
<link rel="canonical" href="https://stripe.com/"> - Network accessline 15
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 16
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 17
"@context": "https://schema.org", - Network accessline 18
"@type": "Organization", "name": "Stripe", "url": "https://stripe.com", - Network accessline 19
"name": "Stripe", "url": "https://stripe.com", "logo": "https://stripe.com/img/v3/home/twitter.png", - Network accessline 20
"url": "https://stripe.com", - Network accessline 21
"logo": "https://stripe.com/img/v3/home/twitter.png", - Network accessline 22
"description": "Online payment processing for internet businesses.", "sameAs": [ "https://twitter.com/stripe", - Network accessline 23
"sameAs": [ "https://twitter.com/stripe", "https://www.linkedin.com/company/stripe", - Network accessline 24
"https://twitter.com/stripe", - Network accessline 25
"https://www.linkedin.com/company/stripe", - Network accessline 26
"https://github.com/stripe" - Network accessline 43
</header> <footer> <a href="https://twitter.com/stripe">Twitter</a> - Network accessline 44
<footer> <a href="https://twitter.com/stripe">Twitter</a> <a href="https://github.com/stripe">GitHub</a> - Network accessline 45
<a href="https://twitter.com/stripe">Twitter</a> - Network accessline 46
<a href="https://github.com/stripe">GitHub</a> - Network accessline 47
<a href="https://www.linkedin.com/company/stripe">LinkedIn</a> - Network accessline 48
<a href="https://www.youtube.com/c/stripe">YouTube</a>
tests/fixtures/brand/supabase.html
- Network accessline 6
<meta property="og:title" content="Supabase | The Open Source Firebase Alternative"> <meta property="og:description" content="Build production-grade applications with a Postgres database, Authentication, Edge Functions, Realtime, Storage, - Network accessline 7
<meta property="og:description" content="Build production-grade applications with a Postgres database, Authentication, Edge Functions, Realtime, Storage, and Vector embeddings. Start for free."> <meta property="og:image" content="https:// - Network accessline 8
<meta property="og:image" content="https://supabase.com/images/og/supabase-og.png"> - Network accessline 9
<meta name="twitter:site" content="@supabase"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" href="https://supabase.com/favicon/favicon.ico"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" href="https://supabase.com/favicon/favicon.ico"> <link rel="apple-touch-icon" sizes="180x180" href="https://supabase.com/favicon/apple-touch-icon.png"> - Network accessline 11
<link rel="icon" href="https://supabase.com/favicon/favicon.ico"> - Network accessline 12
<link rel="apple-touch-icon" sizes="180x180" href="https://supabase.com/favicon/apple-touch-icon.png"> - Network accessline 13
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 14
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 15
"@context": "https://schema.org", - Network accessline 16
"@type": "Organization", "name": "Supabase", "url": "https://supabase.com", - Network accessline 17
"name": "Supabase", "url": "https://supabase.com", "logo": "https://supabase.com/images/supabase-logo-wordmark--dark.svg", - Network accessline 18
"url": "https://supabase.com", - Network accessline 19
"logo": "https://supabase.com/images/supabase-logo-wordmark--dark.svg", - Network accessline 20
"sameAs": [ "https://twitter.com/supabase", "https://github.com/supabase", - Network accessline 21
"https://twitter.com/supabase", - Network accessline 22
"https://github.com/supabase", - Network accessline 23
"https://www.linkedin.com/company/supabase", - Network accessline 24
"https://discord.com/invite/supabase" - Network accessline 40
</header> <footer> <a href="https://twitter.com/supabase">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/supabase">Twitter</a> <a href="https://github.com/supabase">GitHub</a> - Network accessline 42
<a href="https://twitter.com/supabase">Twitter</a> - Network accessline 43
<a href="https://github.com/supabase">GitHub</a> - Network accessline 44
<a href="https://discord.com/invite/supabase">Discord</a>
tests/fixtures/brand/tailwind.html
- Network accessline 6
<meta property="og:title" content="Tailwind CSS - Rapidly build modern websites without ever leaving your HTML."> <meta property="og:description" content="Tailwind CSS is a utility-first CSS framework packed with classes that can be compo - Network accessline 7
<meta property="og:description" content="Tailwind CSS is a utility-first CSS framework packed with classes that can be composed to build any design, directly in your markup."> <meta property="og:image" content="https://tailwindcss.com/api - Network accessline 8
<meta property="og:image" content="https://tailwindcss.com/api/og?path=/"> - Network accessline 9
<meta name="twitter:site" content="@tailwindcss"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" href="https://tailwindcss.com/favicons/favicon-32x32.png" sizes="32x32"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" href="https://tailwindcss.com/favicons/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/svg+xml" href="https://tailwindcss.com/favicons/favicon.svg" - Network accessline 11
<link rel="icon" href="https://tailwindcss.com/favicons/favicon-32x32.png" sizes="32x32"> - Network accessline 12
<link rel="icon" type="image/svg+xml" href="https://tailwindcss.com/favicons/favicon.svg"> - Network accessline 13
<link rel="apple-touch-icon" sizes="180x180" href="https://tailwindcss.com/favicons/apple-touch-icon.png"> - Network accessline 14
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 15
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 16
"@context": "https://schema.org", - Network accessline 17
"@type": "Organization", "name": "Tailwind CSS", "url": "https://tailwindcss.com", - Network accessline 18
"name": "Tailwind CSS", "url": "https://tailwindcss.com", "logo": "https://tailwindcss.com/_next/static/media/tailwindcss-logotype.svg", - Network accessline 19
"url": "https://tailwindcss.com", - Network accessline 20
"logo": "https://tailwindcss.com/_next/static/media/tailwindcss-logotype.svg", - Network accessline 21
"sameAs": [ "https://twitter.com/tailwindcss", "https://github.com/tailwindlabs/tailwindcss", - Network accessline 22
"https://twitter.com/tailwindcss", - Network accessline 23
"https://github.com/tailwindlabs/tailwindcss", - Network accessline 24
"https://discord.gg/7NF8GNe" - Network accessline 40
</header> <footer> <a href="https://twitter.com/tailwindcss">Twitter</a> - Network accessline 41
<footer> <a href="https://twitter.com/tailwindcss">Twitter</a> <a href="https://github.com/tailwindlabs/tailwindcss">GitHub</a> - Network accessline 42
<a href="https://twitter.com/tailwindcss">Twitter</a> - Network accessline 43
<a href="https://github.com/tailwindlabs/tailwindcss">GitHub</a> - Network accessline 44
<a href="https://discord.gg/7NF8GNe">Discord</a>
tests/fixtures/brand/vercel.html
- Network accessline 6
<meta property="og:title" content="Vercel: Develop. Preview. Ship."> <meta property="og:description" content="Vercel is the platform for frontend developers, providing the speed and reliability innovators need to create at the moment of i - Network accessline 7
<meta property="og:description" content="Vercel is the platform for frontend developers, providing the speed and reliability innovators need to create at the moment of inspiration."> <meta property="og:image" content="https://vercel.com/a - Network accessline 8
<meta property="og:image" content="https://vercel.com/api/og?title=Vercel"> - Network accessline 9
<meta name="twitter:site" content="@vercel"> <meta name="twitter:card" content="summary_large_image"> <link rel="icon" href="https://vercel.com/favicon.ico" sizes="48x48"> - Network accessline 10
<meta name="twitter:card" content="summary_large_image"> <link rel="icon" href="https://vercel.com/favicon.ico" sizes="48x48"> <link rel="icon" type="image/svg+xml" sizes="any" href="https://vercel.com/favicon.svg"> - Network accessline 11
<link rel="icon" href="https://vercel.com/favicon.ico" sizes="48x48"> - Network accessline 12
<link rel="icon" type="image/svg+xml" sizes="any" href="https://vercel.com/favicon.svg"> - Network accessline 13
<link rel="apple-touch-icon" href="https://vercel.com/apple-touch-icon.png" sizes="180x180"> - Network accessline 14
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 15
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 16
"@context": "https://schema.org", - Network accessline 17
"@type": "Organization", "name": "Vercel", "logo": "https://assets.vercel.com/image/upload/v1607554385/repositories/next-js/next-logo.png", - Network accessline 18
"name": "Vercel", "logo": "https://assets.vercel.com/image/upload/v1607554385/repositories/next-js/next-logo.png", "url": "https://vercel.com", - Network accessline 19
"logo": "https://assets.vercel.com/image/upload/v1607554385/repositories/next-js/next-logo.png", - Network accessline 20
"url": "https://vercel.com", - Network accessline 21
"sameAs": [ "https://twitter.com/vercel", "https://github.com/vercel", - Network accessline 22
"https://twitter.com/vercel", - Network accessline 23
"https://github.com/vercel", - Network accessline 24
"https://www.linkedin.com/company/vercel" - Network accessline 40
</header> <footer> <a href="https://twitter.com/vercel">𝕏</a> - Network accessline 41
<footer> <a href="https://twitter.com/vercel">𝕏</a> <a href="https://github.com/vercel">GitHub</a> - Network accessline 42
<a href="https://twitter.com/vercel">𝕏</a> - Network accessline 43
<a href="https://github.com/vercel">GitHub</a> - Network accessline 44
<a href="https://www.linkedin.com/company/vercel">LinkedIn</a> - Network accessline 45
<a href="https://www.youtube.com/@VercelHQ">YouTube</a>
tests/fixtures/cdp-json/active-sessions.json
- Network accessline 6
"title": "Google Search", "type": "page", "url": "https://www.google.com/", - Network accessline 7
"type": "page", "url": "https://www.google.com/", "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/ABC123" - Network accessline 8
"url": "https://www.google.com/", - Network accessline 15
"title": "GitHub - octocat/Hello-World", "type": "page", "url": "https://github.com/octocat/Hello-World", - Network accessline 16
"type": "page", "url": "https://github.com/octocat/Hello-World", "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/DEF456" - Network accessline 17
"url": "https://github.com/octocat/Hello-World", - Network accessline 24
"title": "React \u2013 A JavaScript library for building user interfaces", "type": "page", "url": "https://react.dev/", - Network accessline 25
"type": "page", "url": "https://react.dev/", "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/GHI789" - Network accessline 26
"url": "https://react.dev/", - Network accessline 33
"title": "", "type": "service_worker", "url": "https://www.google.com/sw.js", - Network accessline 34
"type": "service_worker", "url": "https://www.google.com/sw.js", "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/SVC001" - Network accessline 35
"url": "https://www.google.com/sw.js",
tests/fixtures/dump_tokens.py
- Executable scriptline 1
#!/usr/bin/env python3
tests/fixtures/extraction/article.html
- Network accessline 55
<a href="https://playwright.dev">Learn more about Playwright</a>
tests/fixtures/extraction/blog-post.html
- Network accessline 26
<div class="ad-block"> <p>Advertisement: Learn Python in 30 days!</p> <a href="https://ads.example.com/python-course">Click here</a> - Network accessline 27
<p>Advertisement: Learn Python in 30 days!</p> <a href="https://ads.example.com/python-course">Click here</a> </div> - Network accessline 28
<a href="https://ads.example.com/python-course">Click here</a>
tests/fixtures/extraction/code-blocks.html
tests/fixtures/extraction/job-listing.html
- Network accessline 6
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 7
{ "@context": "https://schema.org", "@type": "JobPosting", - Network accessline 8
"@context": "https://schema.org", - Network accessline 37
</head> <body> <div class="job-posting" itemscope itemtype="https://schema.org/JobPosting"> - Network accessline 38
<body> <div class="job-posting" itemscope itemtype="https://schema.org/JobPosting"> <h1 class="job-title" itemprop="title">Senior TypeScript Developer</h1> - Network accessline 39
<div class="job-posting" itemscope itemtype="https://schema.org/JobPosting"> - Network accessline 40
<h1 class="job-title" itemprop="title">Senior TypeScript Developer</h1> <div class="company-name" itemprop="hiringOrganization" itemscope itemtype="https://schema.org/Organization"> <span itemprop="name">Acme Corp</span> - Network accessline 41
<div class="company-name" itemprop="hiringOrganization" itemscope itemtype="https://schema.org/Organization">
tests/fixtures/extraction/jsonld-article.html
tests/fixtures/extraction/metadata.html
- Network accessline 8
<meta name="keywords" content="typescript, generics, programming, tutorial"> <meta name="date" content="2025-08-15"> <meta property="og:image" content="https://example.com/images/ts-generics.png"> - Network accessline 9
<meta name="date" content="2025-08-15"> <meta property="og:image" content="https://example.com/images/ts-generics.png"> </head> - Network accessline 10
<meta property="og:image" content="https://example.com/images/ts-generics.png">
tests/fixtures/extraction/news-article.html
- Network accessline 89
<p>The full study is available at <a href="https://example.com/study">the institute's website</a>. The dataset used for benchmarking has also been <a href="https://example.com/dataset">released publicly</a> to encourage reproducible researc
tests/fixtures/extraction/product-page.html
- Network accessline 6
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 7
{ "@context": "https://schema.org", "@type": "Product", - Network accessline 8
"@context": "https://schema.org", - Network accessline 14
"price": "29.99", "priceCurrency": "USD", "availability": "https://schema.org/InStock" - Network accessline 15
"priceCurrency": "USD", "availability": "https://schema.org/InStock" }, - Network accessline 16
"availability": "https://schema.org/InStock" - Network accessline 25
</head> <body> <div class="product" itemscope itemtype="https://schema.org/Product"> - Network accessline 26
<body> <div class="product" itemscope itemtype="https://schema.org/Product"> <h1 class="product-name" itemprop="name">Widget Pro</h1> - Network accessline 27
<div class="product" itemscope itemtype="https://schema.org/Product">
tests/fixtures/extraction/react-managing-state.html
- Network accessline 46
<div class="feedback-widget">Was this helpful? <button>Send</button></div> <a class="edit-page" href="https://github.com/reactjs/react.dev/edit/main/src/content/learn/managing-state.md">Edit this page</a> - Network accessline 47
<a class="edit-page" href="https://github.com/reactjs/react.dev/edit/main/src/content/learn/managing-state.md">Edit this page</a>
tests/fixtures/extraction/react-reference-real.html
- Network accessline 1
<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><script async="" src="https://www.googletagmanager.com/gtag/js?id - Network accessline 10
if (!logShown) { console.log('uwu mode! turn off with ?uwu=0'); console.log('logo credit to @sawaratsuki1004 via https://github.com/SAWARATSUKI/KawaiiLogos'); - Network accessline 11
console.log('uwu mode! turn off with ?uwu=0'); console.log('logo credit to @sawaratsuki1004 via https://github.com/SAWARATSUKI/KawaiiLogos'); logShown = true; - Network accessline 12
console.log('logo credit to @sawaratsuki1004 via https://github.com/SAWARATSUKI/KawaiiLogos'); - Network accessline 97
); })(); </script><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fuwu.png&w=64&q=75 1x, /_next/image?url=%2Fimages%2Fuwu.png&w=128&q=75 2x"/><div id="__next"><div></div> - Network accessline 98
})(); </script><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fuwu.png&w=64&q=75 1x, /_next/image?url=%2Fimages%2Fuwu.png&w=128&q=75 2x"/><div id="__next"><div></div><div class="z-40 st - Network accessline 99
</script><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fuwu.png&w=64&q=75 1x, /_next/image?url=%2Fimages%2Fuwu.png&w=128&q=75 2x"/><div id="__next"><div></div><div class="z-40 sticky top-0"><nav cla - Network accessline 100
<p class="whitespace-pre-wrap my-4">The React reference documentation is broken down into functional subsections:</p> <h2 id="react" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">Rea - Network accessline 101
<h2 id="react" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">React <a href="#react" aria-label="Link for React " title="Link for React " class="mdx-header-anchor inline-block"><svg w - Network accessline 107
<li class="leading-relaxed mb-1"><a class="inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal" href="/reference/rsc/directives">Directives</a> - - Network accessline 108
</ul> <h2 id="react-dom" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">React DOM <a href="#react-dom" aria-label="Link for React DOM " title="Link for React DOM " class="mdx-header-a - Network accessline 109
<h2 id="react-dom" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">React DOM <a href="#react-dom" aria-label="Link for React DOM " title="Link for React DOM " class="mdx-header-anchor - Network accessline 117
<li class="leading-relaxed mb-1"><a class="inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal" href="/reference/react-dom/static">Static APIs</a - Network accessline 118
</ul> <h2 id="react-compiler" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">React Compiler <a href="#react-compiler" aria-label="Link for React Compiler " title="Link for React Compi - Network accessline 119
<h2 id="react-compiler" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">React Compiler <a href="#react-compiler" aria-label="Link for React Compiler " title="Link for React Compiler " - Network accessline 124
<li class="leading-relaxed mb-1"><a class="inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal" href="/reference/react-compiler/compiling-librari - Network accessline 125
</ul> <h2 id="eslint-plugin-react-hooks" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">ESLint Plugin React Hooks <a href="#eslint-plugin-react-hooks" aria-label="Link for ESLint Plug - Network accessline 126
<h2 id="eslint-plugin-react-hooks" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">ESLint Plugin React Hooks <a href="#eslint-plugin-react-hooks" aria-label="Link for ESLint Plugin Rea - Network accessline 129
<li class="leading-relaxed mb-1"><a class="inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal" href="/reference/eslint-plugin-react-hooks">Lints - Network accessline 130
</ul> <h2 id="rules-of-react" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">Rules of React <a href="#rules-of-react" aria-label="Link for Rules of React " title="Link for Rules of Re - Network accessline 131
<h2 id="rules-of-react" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">Rules of React <a href="#rules-of-react" aria-label="Link for Rules of React " title="Link for Rules of React " - Network accessline 136
<li class="leading-relaxed mb-1"><a class="inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal" href="/reference/rules/rules-of-hooks">Rules of H - Network accessline 137
</ul> <h2 id="legacy-apis" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">Legacy APIs <a href="#legacy-apis" aria-label="Link for Legacy APIs " title="Link for Legacy APIs " class="md - Network accessline 138
<h2 id="legacy-apis" class="mdx-heading text-3xl font-display leading-10 text-primary dark:text-primary-dark font-bold my-6">Legacy APIs <a href="#legacy-apis" aria-label="Link for Legacy APIs " title="Link for Legacy APIs " class="mdx-head - Network accessline 139
<ul class="ms-6 my-3 list-disc"> <li class="leading-relaxed mb-1"><a class="inline text-link dark:text-link-dark border-b border-link border-opacity-0 hover:border-opacity-100 duration-100 ease-in transition leading-normal" href="/reference - Network accessline 141
</ul></div></div><div class="grid grid-cols-1 gap-4 py-4 mx-auto max-w-7xl md:grid-cols-2 md:py-12"><div></div><a class="flex gap-x-4 md:gap-x-6 items-center w-full md:min-w-80 md:w-fit md:max-w-md px-4 md:px-5 py-6 border-2 border-transpar
tests/fixtures/extraction/vitepress-guide.html
- Network accessline 8
<body> <div class="VPApp"> <header class="VPNav nav-bar" data-v-693b17db="" data-v-b813b780=""><div class="VPNavBar" data-v-b813b780="" data-v-2d8c36a9=""><div class="container" data-v-2d8c36a9=""><a class="VPNavBarTitle" href="/" data-v- - Network accessline 9
<div class="VPApp"> <header class="VPNav nav-bar" data-v-693b17db="" data-v-b813b780=""><div class="VPNavBar" data-v-b813b780="" data-v-2d8c36a9=""><div class="container" data-v-2d8c36a9=""><a class="VPNavBarTitle" href="/" data-v-2d8c36a9= - Network accessline 10
<header class="VPNav nav-bar" data-v-693b17db="" data-v-b813b780=""><div class="VPNavBar" data-v-b813b780="" data-v-2d8c36a9=""><div class="container" data-v-2d8c36a9=""><a class="VPNavBarTitle" href="/" data-v-2d8c36a9="" data-v-d68c44d8="
tests/fixtures/multi-browser/simple.html
- Network accessline 24
</tbody> </table> <a href="https://example.com/link1">Link 1</a> - Network accessline 25
</table> <a href="https://example.com/link1">Link 1</a> <a href="https://example.com/link2">Link 2</a> - Network accessline 26
<a href="https://example.com/link1">Link 1</a> - Network accessline 27
<a href="https://example.com/link2">Link 2</a>
tests/fixtures/plugins/bad-json/package.json
- Executable scriptline 1
Executable file
tests/fixtures/plugins/invalid-shape/index.mjs
- Executable scriptline 1
Executable file
tests/fixtures/plugins/invalid-shape/package.json
- Executable scriptline 1
Executable file
tests/fixtures/plugins/no-main/package.json
- Executable scriptline 1
Executable file
tests/fixtures/plugins/throws-on-load/index.mjs
- Executable scriptline 1
Executable file
tests/fixtures/plugins/throws-on-load/package.json
- Executable scriptline 1
Executable file
tests/fixtures/plugins/valid-both/index.mjs
- Executable scriptline 1
Executable file - Network accessline 22
{ title: `Both result for ${query}`, url: 'https://both-fixture.example/result', - Network accessline 23
title: `Both result for ${query}`, url: 'https://both-fixture.example/result', snippet: 'A combined plugin result', - Network accessline 24
url: 'https://both-fixture.example/result',
tests/fixtures/plugins/valid-both/package.json
- Executable scriptline 1
Executable file
tests/fixtures/plugins/valid-extractor/index.mjs
- Executable scriptline 1
Executable file
tests/fixtures/plugins/valid-extractor/package.json
- Executable scriptline 1
Executable file
tests/fixtures/plugins/valid-search-engine/index.mjs
- Executable scriptline 1
Executable file - Network accessline 5
{ title: `Test result for ${query}`, url: 'https://test-fixture.example/result', - Network accessline 6
title: `Test result for ${query}`, url: 'https://test-fixture.example/result', snippet: 'A test search result', - Network accessline 7
url: 'https://test-fixture.example/result',
tests/fixtures/plugins/valid-search-engine/package.json
- Executable scriptline 1
Executable file
tests/fixtures/repl/golden/crawl.txt
- Network accessline 1
Crawl: https://docs.example.com (3 pages crawled, 47 found)
tests/fixtures/repl/golden/extract.txt
- Network accessline 1
Extract: https://example.com/pricing (mode: tables)
tests/fixtures/repl/golden/fetch.txt
- Network accessline 1
Fetch: https://react.dev/reference/rsc/server-components
tests/fixtures/search/bing-results.html
- Network accessline 3
<ol id="b_results"> <li class="b_algo"> <h2><a href="https://react.dev/" h="ID=SERP">React</a></h2> - Network accessline 4
<li class="b_algo"> <h2><a href="https://react.dev/" h="ID=SERP">React</a></h2> <div class="b_caption"><p class="b_lineclamp2">React is the library for web and native user interfaces.</p></div> - Network accessline 5
<h2><a href="https://react.dev/" h="ID=SERP">React</a></h2> - Network accessline 7
</li> <li class="b_algo"> <h2><a href="https://legacy.reactjs.org/tutorial/tutorial.html" h="ID=SERP">Tutorial: Intro to React</a></h2> - Network accessline 8
<li class="b_algo"> <h2><a href="https://legacy.reactjs.org/tutorial/tutorial.html" h="ID=SERP">Tutorial: Intro to React</a></h2> <div class="b_caption"><p class="b_lineclamp2">This tutorial doesn't assume any existing React knowled - Network accessline 9
<h2><a href="https://legacy.reactjs.org/tutorial/tutorial.html" h="ID=SERP">Tutorial: Intro to React</a></h2> - Network accessline 11
</li> <li class="b_algo"> <h2><a href="https://www.w3schools.com/react/" h="ID=SERP">React Tutorial - W3Schools</a></h2> - Network accessline 12
<li class="b_algo"> <h2><a href="https://www.w3schools.com/react/" h="ID=SERP">React Tutorial - W3Schools</a></h2> <div class="b_caption"><p class="b_lineclamp2">Well organized and easy to understand React tutorial.</p></div> - Network accessline 13
<h2><a href="https://www.w3schools.com/react/" h="ID=SERP">React Tutorial - W3Schools</a></h2>
tests/fixtures/search/duckduckgo-results.html
- Network accessline 4
<tr> <td> <a rel="nofollow" class="result-link" href="https://react.dev/learn">React – Learn</a> - Network accessline 5
<td> <a rel="nofollow" class="result-link" href="https://react.dev/learn">React – Learn</a> </td> - Network accessline 6
<a rel="nofollow" class="result-link" href="https://react.dev/learn">React – Learn</a> - Network accessline 14
<tr> <td> <a rel="nofollow" class="result-link" href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started">Getting started with React - MDN</a> - Network accessline 15
<td> <a rel="nofollow" class="result-link" href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started">Getting started with React - MDN</a> </td> - Network accessline 16
<a rel="nofollow" class="result-link" href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started">Getting started with React - MDN</a> - Network accessline 24
<tr> <td> <a rel="nofollow" class="result-link" href="https://www.w3schools.com/react/">React Tutorial - W3Schools</a> - Network accessline 25
<td> <a rel="nofollow" class="result-link" href="https://www.w3schools.com/react/">React Tutorial - W3Schools</a> </td> - Network accessline 26
<a rel="nofollow" class="result-link" href="https://www.w3schools.com/react/">React Tutorial - W3Schools</a>
tests/fixtures/search/searxng-response.json
- Network accessline 5
{ "title": "TypeScript: Handbook", "url": "https://www.typescriptlang.org/docs/handbook/", - Network accessline 6
"title": "TypeScript: Handbook", "url": "https://www.typescriptlang.org/docs/handbook/", "content": "The TypeScript Handbook is the definitive guide to the TypeScript language.", - Network accessline 7
"url": "https://www.typescriptlang.org/docs/handbook/", - Network accessline 13
{ "title": "Learn TypeScript - Free Tutorial", "url": "https://www.learn-ts.org/", - Network accessline 14
"title": "Learn TypeScript - Free Tutorial", "url": "https://www.learn-ts.org/", "content": "An interactive TypeScript tutorial for beginners.", - Network accessline 15
"url": "https://www.learn-ts.org/", - Network accessline 22
{ "title": "TypeScript for JavaScript Developers", "url": "https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html", - Network accessline 23
"title": "TypeScript for JavaScript Developers", "url": "https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html", "content": "TypeScript offers all of JavaScript's features with an additional layer.", - Network accessline 24
"url": "https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html",
tests/fixtures/site-extractors/docusaurus-page.html
- Network accessline 70
[Credential-related source omitted] - Network accessline 71
[Credential-related source omitted] - Network accessline 72
baseUrl: 'https://api.example.com', - Network accessline 75
const result = await client.fetch('/endpoint'); - Network accessline 116
<td><code>baseUrl</code></td> <td><code>string</code></td> <td><code>https://api.example.com</code></td> - Network accessline 117
<td><code>string</code></td> <td><code>https://api.example.com</code></td> <td>The base URL for API requests</td> - Network accessline 118
<td><code>https://api.example.com</code></td> <td>The base URL for API requests</td> </tr>
tests/fixtures/site-extractors/github-blob-modern.html
- Network accessline 14
</div> </div> <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobLayoutRoute":{"blob":{"displayName":"index.ts","language":"TypeScript","rawBlobUrl":"https://github.com/sindresorhus/is/raw/refs - Network accessline 15
</div> <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobLayoutRoute":{"blob":{"displayName":"index.ts","language":"TypeScript","rawBlobUrl":"https://github.com/sindresorhus/is/raw/refs/heads/ma - Network accessline 16
<script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobLayoutRoute":{"blob":{"displayName":"index.ts","language":"TypeScript","rawBlobUrl":"https://github.com/sindresorhus/is/raw/refs/heads/main/source
tests/fixtures/site-extractors/github-blob-truncated.html
- Network accessline 9
<div class="react-app"></div> </div> <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobLayoutRoute":{"blob":{"displayName":"big-data.json","language":"JSON","rawBlobUrl":"https://github.com/ac - Network accessline 10
</div> <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobLayoutRoute":{"blob":{"displayName":"big-data.json","language":"JSON","rawBlobUrl":"https://github.com/acme/repo/raw/refs/heads/main/big- - Network accessline 11
<script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobLayoutRoute":{"blob":{"displayName":"big-data.json","language":"JSON","rawBlobUrl":"https://github.com/acme/repo/raw/refs/heads/main/big-data.json
tests/fixtures/site-extractors/github-readme.html
tests/fixtures/site-extractors/mdn-article.html
- Network accessline 153
<tbody> <tr> <td><a href="https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.map">ECMAScript Language Specification<br><small>Array.prototype.map</small></a></td> - Network accessline 154
<tr> <td><a href="https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.map">ECMAScript Language Specification<br><small>Array.prototype.map</small></a></td> </tr> - Network accessline 155
<td><a href="https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.map">ECMAScript Language Specification<br><small>Array.prototype.map</small></a></td> - Network accessline 164
<div class="section-content"> <p class="bc-head"> <a href="https://github.com/mdn/browser-compat-data">BCD tables only load in the browser with JavaScript enabled.</a> - Network accessline 165
<p class="bc-head"> <a href="https://github.com/mdn/browser-compat-data">BCD tables only load in the browser with JavaScript enabled.</a> </p> - Network accessline 166
<a href="https://github.com/mdn/browser-compat-data">BCD tables only load in the browser with JavaScript enabled.</a>
tests/fixtures/site-extractors/youtube-watch-with-captions.html
- Network accessline 8
<body> <script> var ytInitialPlayerResponse = {"responseContext":{},"playabilityStatus":{"status":"OK"},"videoDetails":{"videoId":"dQw4w9WgXcQ","title":"Example Video Title","lengthSeconds":"642","channelId":"UCabcdefg","shortDescription":" - Network accessline 9
<script> var ytInitialPlayerResponse = {"responseContext":{},"playabilityStatus":{"status":"OK"},"videoDetails":{"videoId":"dQw4w9WgXcQ","title":"Example Video Title","lengthSeconds":"642","channelId":"UCabcdefg","shortDescription":"Example - Network accessline 10
var ytInitialPlayerResponse = {"responseContext":{},"playabilityStatus":{"status":"OK"},"videoDetails":{"videoId":"dQw4w9WgXcQ","title":"Example Video Title","lengthSeconds":"642","channelId":"UCabcdefg","shortDescription":"Example descript
tests/fixtures/structured-data/article-jsonld.html
tests/fixtures/structured-data/breadcrumb-microdata.html
- Network accessline 6
</head> <body> <ol itemscope itemtype="https://schema.org/BreadcrumbList"> - Network accessline 7
<body> <ol itemscope itemtype="https://schema.org/BreadcrumbList"> <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> - Network accessline 8
<ol itemscope itemtype="https://schema.org/BreadcrumbList"> - Network accessline 9
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> - Network accessline 13
</a> </li> <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> - Network accessline 14
</li> <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> <meta itemprop="position" content="2" /> - Network accessline 15
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> - Network accessline 19
</a> </li> <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> - Network accessline 20
</li> <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> <meta itemprop="position" content="3" /> - Network accessline 21
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
tests/fixtures/structured-data/organization-rdfa.html
- Network accessline 6
</head> <body> <div vocab="https://schema.org/" typeof="Organization"> - Network accessline 7
<body> <div vocab="https://schema.org/" typeof="Organization"> <h1 property="name">Acme Robotics</h1> - Network accessline 8
<div vocab="https://schema.org/" typeof="Organization"> - Network accessline 9
<h1 property="name">Acme Robotics</h1> <a property="url" href="https://acme-robotics.example.com">acme-robotics.example.com</a> <div property="address" typeof="PostalAddress"> - Network accessline 10
<a property="url" href="https://acme-robotics.example.com">acme-robotics.example.com</a>
tests/fixtures/structured-data/product-jsonld.html
tests/fixtures/structured-data/product-microdata.html
- Network accessline 6
</head> <body> <div itemscope itemtype="https://schema.org/Product"> - Network accessline 7
<body> <div itemscope itemtype="https://schema.org/Product"> <h1 itemprop="name">Stainless Steel French Press</h1> - Network accessline 8
<div itemscope itemtype="https://schema.org/Product"> - Network accessline 9
<h1 itemprop="name">Stainless Steel French Press</h1> <p itemprop="description">A double-walled, 1L French press that keeps coffee hot for hours.</p> <div itemprop="offers" itemscope itemtype="https://schema.org/Offer"> - Network accessline 10
<p itemprop="description">A double-walled, 1L French press that keeps coffee hot for hours.</p> <div itemprop="offers" itemscope itemtype="https://schema.org/Offer"> <span itemprop="price">49.99</span> - Network accessline 11
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer">
tests/fixtures/structured-data/recipe-jsonld.html
tests/helpers/wait-for.ts
- Executable scriptline 1
Executable file
tests/integration/__snapshots__/extract-pipeline-v1.test.ts.snap
- Network accessline 1
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - Network accessline 37
[Learn more about Playwright](https://playwright.dev/) - Network accessline 108
"description": "New study reveals significant performance improvements in AI-powered code analysis tools", "language": "en", "markdown": " - Network accessline 110
"markdown": " - Network accessline 141
The full study is available at [the institute's website](https://example.com/study). The dataset used for benchmarking has also been [released publicly](https://example.com/dataset) to encourage reproducible research.
tests/integration/agent-defaults-token-discipline.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
const manyResults: RawSearchResult[] = Array.from({ length: 7 }, (_, i) => ({ title: `Source ${i}`, url: `https://example.com/source-${i}`, - Network accessline 9
title: `Source ${i}`, url: `https://example.com/source-${i}`, snippet: `Snippet for source ${i} about pricing.`, - Network accessline 10
url: `https://example.com/source-${i}`,
tests/integration/agent-local-tier.test.ts
- Executable scriptline 1
Executable file - Network accessline 28
const RESULTS: RawSearchResult[] = [ { title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'tiers', relevance_score: 0.9, engine: 'integration-stub' }, - Network accessline 29
{ title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'tiers', relevance_score: 0.9, engine: 'integration-stub' }, - Network accessline 37
return { fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', finalUrl: 'https://pgedge.com/pricing', - Network accessline 38
fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', finalUrl: 'https://pgedge.com/pricing', html: '<html><body><h1>pgEdge Pricing</h1><p>Developer $19. Pro $25. Enterprise $35.</p></body></html>', - Network accessline 39
url: 'https://pgedge.com/pricing', finalUrl: 'https://pgedge.com/pricing', - Network accessline 59
it('routes the local tier and returns its synthesis through handleAgent', async () => { vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-i - Network accessline 60
vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto', }); - Network accessline 61
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto', - Network accessline 75
expect(callOpts.backend).toEqual({ url: 'http://localhost:11434', model: 'qwen2.5:7b-instruct' });
tests/integration/agent-top-mcp-servers.test.ts
- Executable scriptline 1
Executable file - Network accessline 7
{ title: 'Microsoft Lists app — track work, organize lists', url: 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 8
title: 'Microsoft Lists app — track work, organize lists', url: 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', snippet: 'Create lists, share, and track tasks across your team.', - Network accessline 9
url: 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 14
{ title: 'Stars - NASA Science', url: 'https://science.nasa.gov/universe/stars/', - Network accessline 15
title: 'Stars - NASA Science', url: 'https://science.nasa.gov/universe/stars/', snippet: 'Learn about stars across the universe and stellar evolution.', - Network accessline 16
url: 'https://science.nasa.gov/universe/stars/', - Network accessline 21
{ title: 'modelcontextprotocol/servers — official MCP server implementations', url: 'https://github.com/modelcontextprotocol/servers', - Network accessline 22
title: 'modelcontextprotocol/servers — official MCP server implementations', url: 'https://github.com/modelcontextprotocol/servers', snippet: - Network accessline 23
url: 'https://github.com/modelcontextprotocol/servers', - Network accessline 29
{ title: 'punkpeye/awesome-mcp-servers — curated MCP server list', url: 'https://github.com/punkpeye/awesome-mcp-servers', - Network accessline 30
title: 'punkpeye/awesome-mcp-servers — curated MCP server list', url: 'https://github.com/punkpeye/awesome-mcp-servers', snippet: 'A curated open-source list of Model Context Protocol servers.', - Network accessline 31
url: 'https://github.com/punkpeye/awesome-mcp-servers', - Network accessline 47
const htmlPages: Record<string, string> = { 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists': htmlFor( - Network accessline 48
'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists': htmlFor( - Network accessline 50
'Create lists, share, track tasks across your team.', ), 'https://science.nasa.gov/universe/stars/': htmlFor( - Network accessline 51
), 'https://science.nasa.gov/universe/stars/': htmlFor( 'Stars - NASA Science', - Network accessline 52
'https://science.nasa.gov/universe/stars/': htmlFor( - Network accessline 54
'Learn about stars across the universe and stellar evolution.', ), 'https://github.com/modelcontextprotocol/servers': htmlFor( - Network accessline 55
), 'https://github.com/modelcontextprotocol/servers': htmlFor( 'modelcontextprotocol/servers', - Network accessline 56
'https://github.com/modelcontextprotocol/servers': htmlFor( - Network accessline 58
'Open-source Model Context Protocol servers with language adapters and commit history.', ), 'https://github.com/punkpeye/awesome-mcp-servers': htmlFor( - Network accessline 59
), 'https://github.com/punkpeye/awesome-mcp-servers': htmlFor( 'punkpeye/awesome-mcp-servers', - Network accessline 60
'https://github.com/punkpeye/awesome-mcp-servers': htmlFor( - Network accessline 95
const fetchedUrls = result.sources.map((s: { url: string }) => s.url); expect(fetchedUrls).not.toContain( 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 96
expect(fetchedUrls).not.toContain( 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', ); - Network accessline 97
'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 98
); expect(fetchedUrls).toEqual( expect.arrayContaining(['https://github.com/modelcontextprotocol/servers']), - Network accessline 99
expect(fetchedUrls).toEqual( expect.arrayContaining(['https://github.com/modelcontextprotocol/servers']), ); - Network accessline 100
expect.arrayContaining(['https://github.com/modelcontextprotocol/servers']), - Network accessline 101
); expect(fetchedUrls).toEqual( expect.arrayContaining(['https://github.com/punkpeye/awesome-mcp-servers']), - Network accessline 102
expect(fetchedUrls).toEqual( expect.arrayContaining(['https://github.com/punkpeye/awesome-mcp-servers']), ); - Network accessline 103
expect.arrayContaining(['https://github.com/punkpeye/awesome-mcp-servers']),
tests/integration/agent.test.ts
- Executable scriptline 1
Executable file - Network accessline 7
{ title: 'Salesforce Pricing 2025', url: 'https://salesforce.com/pricing', - Network accessline 8
title: 'Salesforce Pricing 2025', url: 'https://salesforce.com/pricing', snippet: 'Salesforce offers plans from $25 to $300 per user per month.', - Network accessline 9
url: 'https://salesforce.com/pricing', - Network accessline 14
{ title: 'HubSpot CRM Pricing', url: 'https://hubspot.com/pricing', - Network accessline 15
title: 'HubSpot CRM Pricing', url: 'https://hubspot.com/pricing', snippet: 'HubSpot offers a free tier and paid plans starting at $45/month.', - Network accessline 16
url: 'https://hubspot.com/pricing', - Network accessline 21
{ title: 'Zoho CRM Plans', url: 'https://zoho.com/crm/pricing', - Network accessline 22
title: 'Zoho CRM Plans', url: 'https://zoho.com/crm/pricing', snippet: 'Zoho CRM starts at $14 per user per month.', - Network accessline 23
url: 'https://zoho.com/crm/pricing', - Network accessline 35
const htmlPages: Record<string, string> = { 'https://salesforce.com/pricing': '<html><head><title>Salesforce Pricing</title></head><body><h1>Salesforce Pricing</h1><p class="price">$25-$300/user/month</p><span class="name">Salesforce CRM< - Network accessline 36
'https://salesforce.com/pricing': '<html><head><title>Salesforce Pricing</title></head><body><h1>Salesforce Pricing</h1><p class="price">$25-$300/user/month</p><span class="name">Salesforce CRM</span></body></html>', - Network accessline 37
'https://hubspot.com/pricing': '<html><head><title>HubSpot Pricing</title></head><body><h1>HubSpot Pricing</h1><p class="price">Free - $3600/month</p><span class="name">HubSpot CRM</span></body></html>', - Network accessline 38
'https://zoho.com/crm/pricing': '<html><head><title>Zoho CRM</title></head><body><h1>Zoho CRM</h1><p class="price">$14/user/month</p><span class="name">Zoho CRM</span></body></html>', - Network accessline 150
const input: AgentInput = { prompt: 'Compare pricing', urls: ['https://salesforce.com/pricing', 'https://hubspot.com/pricing'], - Network accessline 151
prompt: 'Compare pricing', urls: ['https://salesforce.com/pricing', 'https://hubspot.com/pricing'], }; - Network accessline 152
urls: ['https://salesforce.com/pricing', 'https://hubspot.com/pricing'], - Network accessline 159
expect(result.sources.length).toBeGreaterThanOrEqual(2); const urls = result.sources.map((s) => s.url); expect(urls).toContain('https://salesforce.com/pricing'); - Network accessline 160
const urls = result.sources.map((s) => s.url); expect(urls).toContain('https://salesforce.com/pricing'); expect(urls).toContain('https://hubspot.com/pricing'); - Network accessline 161
expect(urls).toContain('https://salesforce.com/pricing'); - Network accessline 162
expect(urls).toContain('https://hubspot.com/pricing'); - Network accessline 298
return { fetch: vi.fn().mockResolvedValue({ url: 'https://vendor.example/pricing', - Network accessline 299
fetch: vi.fn().mockResolvedValue({ url: 'https://vendor.example/pricing', finalUrl: 'https://vendor.example/pricing', - Network accessline 300
url: 'https://vendor.example/pricing', - Network accessline 301
finalUrl: 'https://vendor.example/pricing', - Network accessline 319
const input: AgentInput = { prompt: 'Extract the pricing tiers', urls: ['https://vendor.example/pricing'], - Network accessline 320
prompt: 'Extract the pricing tiers', urls: ['https://vendor.example/pricing'], schema: tiersSchema, - Network accessline 321
urls: ['https://vendor.example/pricing'], - Network accessline 339
const input: AgentInput = { prompt: 'Extract the pricing tiers', urls: ['https://vendor.example/pricing'], - Network accessline 340
prompt: 'Extract the pricing tiers', urls: ['https://vendor.example/pricing'], schema: tiersSchema, - Network accessline 341
urls: ['https://vendor.example/pricing'],
tests/integration/browser-actions.test.ts
- Executable scriptline 1
Executable file - Network accessline 83
it('dismisses cookie banner then extracts content', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/cookie-banner.html`, - Network accessline 84
const input: FetchInput = { url: `http://127.0.0.1:${port}/cookie-banner.html`, include_full_markdown: true, - Network accessline 85
url: `http://127.0.0.1:${port}/cookie-banner.html`, - Network accessline 106
it('fills form and captures result', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/form-page.html`, - Network accessline 107
const input: FetchInput = { url: `http://127.0.0.1:${port}/form-page.html`, include_full_markdown: true, - Network accessline 108
url: `http://127.0.0.1:${port}/form-page.html`, - Network accessline 130
it('clicks Load More button to reveal additional content', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/load-more.html`, - Network accessline 131
const input: FetchInput = { url: `http://127.0.0.1:${port}/load-more.html`, include_full_markdown: true, - Network accessline 132
url: `http://127.0.0.1:${port}/load-more.html`, - Network accessline 151
it('captures mid-flow screenshot', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/cookie-banner.html`, - Network accessline 152
const input: FetchInput = { url: `http://127.0.0.1:${port}/cookie-banner.html`, actions: [ - Network accessline 153
url: `http://127.0.0.1:${port}/cookie-banner.html`, - Network accessline 173
it('handles action on nonexistent selector without crashing', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/cookie-banner.html`, - Network accessline 174
const input: FetchInput = { url: `http://127.0.0.1:${port}/cookie-banner.html`, actions: [ - Network accessline 175
url: `http://127.0.0.1:${port}/cookie-banner.html`, - Network accessline 192
it('performs scroll action', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/load-more.html`, - Network accessline 193
const input: FetchInput = { url: `http://127.0.0.1:${port}/load-more.html`, actions: [ - Network accessline 194
url: `http://127.0.0.1:${port}/load-more.html`, - Network accessline 209
it('handles empty actions array identically to no actions', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/load-more.html`, - Network accessline 210
const input: FetchInput = { url: `http://127.0.0.1:${port}/load-more.html`, include_full_markdown: true, - Network accessline 211
url: `http://127.0.0.1:${port}/load-more.html`, - Network accessline 225
it('complex multi-step flow: dismiss, type, scroll, screenshot', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/form-page.html`, - Network accessline 226
const input: FetchInput = { url: `http://127.0.0.1:${port}/form-page.html`, include_full_markdown: true, - Network accessline 227
url: `http://127.0.0.1:${port}/form-page.html`,
tests/integration/build-output.test.ts
- Executable scriptline 1
Executable file
tests/integration/cache-defaults-token-discipline.test.ts
- Executable scriptline 1
Executable file - Network accessline 46
for (let i = 0; i < 12; i++) { cacheContent( makeRaw(`https://example.com/typescript-${i}`), - Network accessline 47
cacheContent( makeRaw(`https://example.com/typescript-${i}`), makeExtraction({ - Network accessline 48
makeRaw(`https://example.com/typescript-${i}`), - Network accessline 63
for (let i = 0; i < 12; i++) { cacheContent( makeRaw(`https://example.com/typescript-${i}`), - Network accessline 64
cacheContent( makeRaw(`https://example.com/typescript-${i}`), makeExtraction({ - Network accessline 65
makeRaw(`https://example.com/typescript-${i}`),
tests/integration/cache-tool.test.ts
- Executable scriptline 1
Executable file - Network accessline 43
it('populates cache and queries via cache tool', async () => { cacheContent( makeRaw('https://example.com/ts-guide'), - Network accessline 44
cacheContent( makeRaw('https://example.com/ts-guide'), makeExtraction({ title: 'TypeScript Guide', markdown: '# TypeScript\n\nLearn TypeScript.' }), - Network accessline 45
makeRaw('https://example.com/ts-guide'), - Network accessline 47
); cacheContent( makeRaw('https://example.com/react'), - Network accessline 48
cacheContent( makeRaw('https://example.com/react'), makeExtraction({ title: 'React Tutorial', markdown: '# React\n\nLearn React hooks.' }), - Network accessline 49
makeRaw('https://example.com/react'), - Network accessline 55
expect(result.results).toHaveLength(1); expect(result.results![0].title).toBe('TypeScript Guide'); expect(result.results![0].url).toBe('https://example.com/ts-guide'); - Network accessline 56
expect(result.results![0].title).toBe('TypeScript Guide'); expect(result.results![0].url).toBe('https://example.com/ts-guide'); expect(result.results![0].markdown).toContain('Learn TypeScript'); - Network accessline 57
expect(result.results![0].url).toBe('https://example.com/ts-guide'); - Network accessline 61
it('filters by URL pattern', async () => { cacheContent(makeRaw('https://docs.example.com/api'), makeExtraction({ title: 'API Docs' })); - Network accessline 62
cacheContent(makeRaw('https://docs.example.com/api'), makeExtraction({ title: 'API Docs' })); - Network accessline 63
cacheContent(makeRaw('https://blog.example.com/post'), makeExtraction({ title: 'Blog Post' })); - Network accessline 71
it('returns stats', async () => { cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'Content A' })); - Network accessline 72
cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'Content A' })); - Network accessline 73
cacheContent(makeRaw('https://example.com/b'), makeExtraction({ markdown: 'Content B' })); - Network accessline 87
it('stats.newest matches fetched_at of the most recent cache search result (M19)', async () => { cacheContent(makeRaw('https://example.com/m19'), makeExtraction({ title: 'M19', markdown: 'Hello world content for M19' })); - Network accessline 88
cacheContent(makeRaw('https://example.com/m19'), makeExtraction({ title: 'M19', markdown: 'Hello world content for M19' })); - Network accessline 98
it('clears matching entries and returns count', async () => { cacheContent(makeRaw('https://example.com/a'), makeExtraction({})); - Network accessline 99
cacheContent(makeRaw('https://example.com/a'), makeExtraction({})); - Network accessline 100
cacheContent(makeRaw('https://other.com/b'), makeExtraction({})); - Network accessline 106
const remaining = await handleCache({}); expect(remaining.results).toHaveLength(1); expect(remaining.results![0].url).toBe('https://other.com/b'); - Network accessline 107
expect(remaining.results).toHaveLength(1); expect(remaining.results![0].url).toBe('https://other.com/b'); }); - Network accessline 108
expect(remaining.results![0].url).toBe('https://other.com/b'); - Network accessline 111
it('combines query + url_pattern', async () => { cacheContent( makeRaw('https://example.com/ts'), - Network accessline 112
cacheContent( makeRaw('https://example.com/ts'), makeExtraction({ title: 'TS', markdown: 'TypeScript guide' }), - Network accessline 113
makeRaw('https://example.com/ts'), - Network accessline 115
); cacheContent( makeRaw('https://other.com/ts'), - Network accessline 116
cacheContent( makeRaw('https://other.com/ts'), makeExtraction({ title: 'Other TS', markdown: 'TypeScript other' }), - Network accessline 117
makeRaw('https://other.com/ts'), - Network accessline 119
); cacheContent( makeRaw('https://example.com/py'), - Network accessline 120
cacheContent( makeRaw('https://example.com/py'), makeExtraction({ title: 'Python', markdown: 'Python guide' }), - Network accessline 121
makeRaw('https://example.com/py'),
tests/integration/cdp-discovery.test.ts
- Executable scriptline 1
Executable file - Network accessline 85
it('discovers sessions from a live mock CDP endpoint', async () => { const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 86
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 94
it('isCDPReachable returns true for live endpoint', async () => { const reachable = await isCDPReachable(`http://127.0.0.1:${cdpPort}`); - Network accessline 95
const reachable = await isCDPReachable(`http://127.0.0.1:${cdpPort}`); - Network accessline 99
it('isCDPReachable returns false for dead port', async () => { const reachable = await isCDPReachable('http://127.0.0.1:19876'); - Network accessline 100
const reachable = await isCDPReachable('http://127.0.0.1:19876'); - Network accessline 104
it('listSessions integrates with CDP endpoint via config', async () => { process.env.WIGOLO_CDP_URL = `http://127.0.0.1:${cdpPort}`; - Network accessline 105
process.env.WIGOLO_CDP_URL = `http://127.0.0.1:${cdpPort}`; - Network accessline 124
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 131
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 139
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 143
it('filters page-type sessions when requested', async () => { const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`, { filterPages: true }); - Network accessline 144
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`, { filterPages: true }); - Network accessline 150
it('includes all session types when not filtering', async () => { const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 151
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 156
it('session objects have correct CDPSession shape', async () => { const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 157
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 167
it('handles unicode in session titles from real endpoint', async () => { const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 168
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`); - Network accessline 174
it('concurrent discovery calls do not interfere', async () => { const results = await Promise.all([ discoverSessions(`http://127.0.0.1:${cdpPort}`), - Network accessline 175
const results = await Promise.all([ discoverSessions(`http://127.0.0.1:${cdpPort}`), discoverSessions(`http://127.0.0.1:${cdpPort}`), - Network accessline 176
discoverSessions(`http://127.0.0.1:${cdpPort}`), - Network accessline 177
discoverSessions(`http://127.0.0.1:${cdpPort}`), - Network accessline 178
discoverSessions(`http://127.0.0.1:${cdpPort}`), - Network accessline 186
it('discovery with very short timeout handles gracefully', async () => { const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`, { timeoutMs: 1 }); - Network accessline 187
const sessions = await discoverSessions(`http://127.0.0.1:${cdpPort}`, { timeoutMs: 1 });
tests/integration/change-detection.test.ts
- Executable scriptline 1
Executable file - Network accessline 76
it('first fetch returns no change detection fields', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/doc`, - Network accessline 77
const input: FetchInput = { url: `http://127.0.0.1:${port}/doc`, render_js: 'never', - Network accessline 78
url: `http://127.0.0.1:${port}/doc`, - Network accessline 94
it('second fetch of same content returns no change', async () => { const input: FetchInput = { url: `http://127.0.0.1:${port}/doc`, - Network accessline 95
const input: FetchInput = { url: `http://127.0.0.1:${port}/doc`, render_js: 'never', - Network accessline 96
url: `http://127.0.0.1:${port}/doc`, - Network accessline 111
it('section fetch preserves the canonical full-page cache and does not create a false deletion diff', async () => { const url = `http://127.0.0.1:${port}/doc`; - Network accessline 112
const url = `http://127.0.0.1:${port}/doc`; - Network accessline 159
it('detects change when page content is updated', async () => { const url = `http://127.0.0.1:${port}/doc`; - Network accessline 160
const url = `http://127.0.0.1:${port}/doc`; - Network accessline 182
it('cache check_changes reports changes for matching URLs', async () => { const url = `http://127.0.0.1:${port}/doc`; - Network accessline 183
const url = `http://127.0.0.1:${port}/doc`; - Network accessline 208
it('change detection works with normalized URLs', async () => { const url = `http://127.0.0.1:${port}/doc?utm_source=test`; - Network accessline 209
const url = `http://127.0.0.1:${port}/doc?utm_source=test`; - Network accessline 219
const url2 = `http://127.0.0.1:${port}/doc?utm_source=other`; - Network accessline 227
it('diff summary contains meaningful information', async () => { const url = `http://127.0.0.1:${port}/doc`; - Network accessline 228
const url = `http://127.0.0.1:${port}/doc`; - Network accessline 242
it('handles rapid successive fetches without corruption', async () => { const url = `http://127.0.0.1:${port}/doc`; - Network accessline 243
const url = `http://127.0.0.1:${port}/doc`;
tests/integration/citation-id-stability.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
const stubResults: RawSearchResult[] = [ { title: 'Rust Async Guide', url: 'https://rust-lang.org/async', snippet: 'Async returns lazy futures.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 40
{ title: 'Rust Async Guide', url: 'https://rust-lang.org/async', snippet: 'Async returns lazy futures.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 41
{ title: 'Tokio Runtime', url: 'https://tokio.rs/', snippet: 'Tokio is an async runtime.', relevance_score: 0.90, engine: 'stub' }, - Network accessline 42
{ title: 'Futures Crate', url: 'https://docs.rs/futures', snippet: 'Future trait for async.', relevance_score: 0.85, engine: 'stub' }, - Network accessline 43
{ title: 'Async Book', url: 'https://rust-lang.github.io/async-book', snippet: 'Comprehensive async guide.', relevance_score: 0.80, engine: 'stub' }, - Network accessline 44
{ title: 'Pin and Unpin', url: 'https://doc.rust-lang.org/std/pin/index.html', snippet: 'Pinning explained.', relevance_score: 0.75, engine: 'stub' }, - Network accessline 45
{ title: 'Select macro', url: 'https://docs.rs/tokio/latest/tokio/macro.select.html', snippet: 'Race futures.', relevance_score: 0.70, engine: 'stub' }, - Network accessline 46
{ title: 'JoinSet API', url: 'https://docs.rs/tokio/latest/tokio/task/struct.JoinSet.html', snippet: 'Group of tasks.', relevance_score: 0.65, engine: 'stub' }, - Network accessline 47
{ title: 'Async traits', url: 'https://blog.rust-lang.org/inside-rust/2022/11/17/async-fn-in-trait.html', snippet: 'Async trait support.', relevance_score: 0.60, engine: 'stub' }, - Network accessline 48
{ title: 'Cancellation', url: 'https://tokio.rs/tokio/topics/cancellation', snippet: 'Cancel futures.', relevance_score: 0.55, engine: 'stub' }, - Network accessline 49
{ title: 'Tracing console', url: 'https://github.com/tokio-rs/console', snippet: 'Diagnostics for async.', relevance_score: 0.50, engine: 'stub' },
tests/integration/config-writer-fs.test.ts
- Executable scriptline 1
Executable file - Network accessline 89
"theme": "system", "mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 90
"mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, "wigolo": { "type": "local", "command": "npx", "args": ["-y", "wigolo"] }, - Network accessline 91
"other": { "type": "remote", "url": "https://example.com/mcp" },
tests/integration/crawl-index-latency.test.ts
- Executable scriptline 1
Executable file - Network accessline 112
const seedUrls = [ 'https://example.com/a', - Network accessline 113
'https://example.com/a', - Network accessline 114
'https://example.com/b', - Network accessline 115
'https://example.com/c', - Network accessline 116
'https://example.com/d', - Network accessline 117
'https://example.com/e', - Network accessline 168
const t0 = Date.now(); await crawler.crawl({ url: 'https://sync.example/a', - Network accessline 169
await crawler.crawl({ url: 'https://sync.example/a', strategy: 'bfs', - Network accessline 170
url: 'https://sync.example/a',
tests/integration/crawl-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 61
if (url === 'https://docs.test.com') { - Network accessline 68
metadata: {}, links: [ 'https://docs.test.com/getting-started', - Network accessline 69
links: [ 'https://docs.test.com/getting-started', 'https://docs.test.com/api-reference', - Network accessline 70
'https://docs.test.com/getting-started', - Network accessline 71
'https://docs.test.com/api-reference', - Network accessline 72
'https://docs.test.com/changelog', - Network accessline 73
'https://external.com/link', - Network accessline 81
if (url === 'https://docs.test.com/getting-started') { - Network accessline 87
markdown: `# Getting Started\n\nFollow these steps.\n\n${sharedNav}`, metadata: {}, links: ['https://docs.test.com/api-reference'], - Network accessline 88
metadata: {}, links: ['https://docs.test.com/api-reference'], images: [], - Network accessline 89
links: ['https://docs.test.com/api-reference'], - Network accessline 96
if (url === 'https://docs.test.com/api-reference') { - Network accessline 111
if (url === 'https://docs.test.com/changelog') { - Network accessline 176
const router = mockRouter(); const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10, include_full_markdown: true }, - Network accessline 177
const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10, include_full_markdown: true }, router as any, - Network accessline 178
{ url: 'https://docs.test.com', max_depth: 1, max_pages: 10, include_full_markdown: true }, - Network accessline 191
const homeContent = result.pages.find((p) => p.url === 'https://docs.test.com'); - Network accessline 196
const router = mockRouter(); const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10, max_total_chars: 100 }, - Network accessline 197
const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10, max_total_chars: 100 }, router as any, - Network accessline 198
{ url: 'https://docs.test.com', max_depth: 1, max_pages: 10, max_total_chars: 100 }, - Network accessline 209
const result = await handleCrawl( { url: 'https://docs.test.com', - Network accessline 210
{ url: 'https://docs.test.com', max_depth: 1, - Network accessline 211
url: 'https://docs.test.com', - Network accessline 219
const urls = result.pages.map((p) => p.url); expect(urls).not.toContain('https://docs.test.com/changelog'); - Network accessline 220
expect(urls).not.toContain('https://docs.test.com/changelog'); - Network accessline 228
const router = mockRouter(); const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10 }, - Network accessline 229
const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10 }, router as any, - Network accessline 230
{ url: 'https://docs.test.com', max_depth: 1, max_pages: 10 }, - Network accessline 242
const home = result.pages.find((p) => p.url === 'https://docs.test.com'); - Network accessline 248
const result = await handleCrawl( { url: 'https://docs.test.com', - Network accessline 249
{ url: 'https://docs.test.com', max_depth: 1, - Network accessline 250
url: 'https://docs.test.com', - Network accessline 251
max_depth: 1, max_pages: 10, include_patterns: ['/getting-started', '^https://docs\\.test\\.com$'], - Network accessline 252
max_pages: 10, include_patterns: ['/getting-started', '^https://docs\\.test\\.com$'], }, - Network accessline 253
include_patterns: ['/getting-started', '^https://docs\\.test\\.com$'], - Network accessline 266
const sitemapXml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 267
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 268
<url><loc>https://docs.test.com/getting-started</loc></url> - Network accessline 269
<url><loc>https://docs.test.com/api-reference</loc></url> - Network accessline 306
}; const result = await handleCrawl( { url: 'https://docs.test.com', strategy: 'sitemap', max_pages: 10 }, - Network accessline 307
const result = await handleCrawl( { url: 'https://docs.test.com', strategy: 'sitemap', max_pages: 10 }, router as any, - Network accessline 308
{ url: 'https://docs.test.com', strategy: 'sitemap', max_pages: 10 }, - Network accessline 323
vi.mocked(handleFetch).mockImplementation(async (input) => { const url = input.url; if (url === 'https://docs.test.com') { - Network accessline 324
const url = input.url; if (url === 'https://docs.test.com') { return { - Network accessline 325
if (url === 'https://docs.test.com') { - Network accessline 331
markdown: '# Home\n\nReal content here.', metadata: {}, links: ['https://docs.test.com/missing', 'https://docs.test.com/api-reference'], - Network accessline 332
metadata: {}, links: ['https://docs.test.com/missing', 'https://docs.test.com/api-reference'], images: [], - Network accessline 333
links: ['https://docs.test.com/missing', 'https://docs.test.com/api-reference'], - Network accessline 337
}; } if (url === 'https://docs.test.com/api-reference') { - Network accessline 338
} if (url === 'https://docs.test.com/api-reference') { return { - Network accessline 339
if (url === 'https://docs.test.com/api-reference') { - Network accessline 361
const router = mockRouter(); const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10 }, - Network accessline 362
const result = await handleCrawl( { url: 'https://docs.test.com', max_depth: 1, max_pages: 10 }, router as any, - Network accessline 363
{ url: 'https://docs.test.com', max_depth: 1, max_pages: 10 }, - Network accessline 367
const urls = result.pages.map((p) => p.url); expect(urls).toContain('https://docs.test.com'); - Network accessline 368
expect(urls).toContain('https://docs.test.com'); - Network accessline 369
expect(urls).toContain('https://docs.test.com/api-reference'); - Network accessline 372
expect(urls).not.toContain('https://docs.test.com/missing');
tests/integration/crawl/nav-dedupe.test.ts
- Executable scriptline 1
Executable file - Network accessline 13
'utf8', ); const r = await extractContent(html, `https://example.com/docs/page-${i}`); - Network accessline 14
); const r = await extractContent(html, `https://example.com/docs/page-${i}`); pages.push({ url: `https://example.com/docs/page-${i}`, markdown: r.markdown }); - Network accessline 15
const r = await extractContent(html, `https://example.com/docs/page-${i}`); - Network accessline 16
pages.push({ url: `https://example.com/docs/page-${i}`, markdown: r.markdown });
tests/integration/daemon-mode.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 46
[Credential-related source omitted] - Network accessline 61
it('health endpoint responds with JSON', async () => { const resp = await fetch(`${daemonUrl}/health`); - Network accessline 62
const resp = await fetch(`${daemonUrl}/health`); - Network accessline 72
it('health status is not "down" after startup', async () => { const resp = await fetch(`${daemonUrl}/health`); - Network accessline 73
const resp = await fetch(`${daemonUrl}/health`); - Network accessline 96
it('MCP endpoint responds to POST (not 404)', async () => { const resp = await fetch(`${daemonUrl}/mcp`, { - Network accessline 97
const resp = await fetch(`${daemonUrl}/mcp`, { - Network accessline 133
it('unknown path returns 404', async () => { const resp = await fetch(`${daemonUrl}/nonexistent`); - Network accessline 134
const resp = await fetch(`${daemonUrl}/nonexistent`); - Network accessline 139
const results = await Promise.all( Array.from({ length: 10 }, () => fetch(`${daemonUrl}/health`).then(r => r.json()), - Network accessline 140
Array.from({ length: 10 }, () => fetch(`${daemonUrl}/health`).then(r => r.json()), ), - Network accessline 141
fetch(`${daemonUrl}/health`).then(r => r.json()), - Network accessline 161
it('cache status is active', async () => { const resp = await fetch(`${daemonUrl}/health`); - Network accessline 162
const resp = await fetch(`${daemonUrl}/health`);
tests/integration/embedding-cache-fastembed.test.ts
- Executable scriptline 1
Executable file - Network accessline 57
it('returns cache miss when stored modelId differs from current', () => { seedPage('https://example.com/a', 'page a'); - Network accessline 58
seedPage('https://example.com/a', 'page a'); - Network accessline 60
const legacyVec = Buffer.from(new Float32Array(384).fill(0.1).buffer); updateCacheEmbedding('https://example.com/a', legacyVec, 'sentence-transformers/all-MiniLM-L6-v2', 384); - Network accessline 61
updateCacheEmbedding('https://example.com/a', legacyVec, 'sentence-transformers/all-MiniLM-L6-v2', 384); - Network accessline 64
const miss = getEmbeddingForUrl('https://example.com/a', 'BGE-small-en-v1.5'); - Network accessline 68
const unfiltered = getEmbeddingForUrl('https://example.com/a'); - Network accessline 73
it('returns hit when stored modelId matches current', () => { seedPage('https://example.com/b', 'page b'); - Network accessline 74
seedPage('https://example.com/b', 'page b'); - Network accessline 76
updateCacheEmbedding('https://example.com/b', vec, 'BGE-small-en-v1.5', 384); - Network accessline 78
const hit = getEmbeddingForUrl('https://example.com/b', 'BGE-small-en-v1.5'); - Network accessline 84
it('getAllEmbeddings filters by modelId when provided', () => { seedPage('https://example.com/legacy', 'legacy page'); - Network accessline 85
seedPage('https://example.com/legacy', 'legacy page'); - Network accessline 86
seedPage('https://example.com/new', 'new page'); - Network accessline 87
updateCacheEmbedding( 'https://example.com/legacy', Buffer.from(new Float32Array(384).fill(0.1).buffer), - Network accessline 88
'https://example.com/legacy', - Network accessline 92
); updateCacheEmbedding( 'https://example.com/new', - Network accessline 93
updateCacheEmbedding( 'https://example.com/new', Buffer.from(new Float32Array(384).fill(0.2).buffer), - Network accessline 94
'https://example.com/new',
tests/integration/embedding.test.ts
- Executable scriptline 1
Executable file - Network accessline 82
const dims = 384; const urls = [ 'https://react.dev/hooks', - Network accessline 83
const urls = [ 'https://react.dev/hooks', 'https://vuejs.org/composition', - Network accessline 84
'https://react.dev/hooks', - Network accessline 85
'https://vuejs.org/composition', - Network accessline 86
'https://svelte.dev/stores', - Network accessline 129
const store = await getVectorStore(); await store.upsert([{ id: 'https://mutable.com', - Network accessline 130
await store.upsert([{ id: 'https://mutable.com', vector: generateVector(dims, 1), - Network accessline 131
id: 'https://mutable.com', - Network accessline 132
vector: generateVector(dims, 1), metadata: { url: 'https://mutable.com', contentHash: 'h1', modelId: 'model-a' }, }]); - Network accessline 133
metadata: { url: 'https://mutable.com', contentHash: 'h1', modelId: 'model-a' }, - Network accessline 134
}]); await store.upsert([{ id: 'https://mutable.com', - Network accessline 135
await store.upsert([{ id: 'https://mutable.com', vector: generateVector(dims, 2), - Network accessline 136
id: 'https://mutable.com', - Network accessline 137
vector: generateVector(dims, 2), metadata: { url: 'https://mutable.com', contentHash: 'h2', modelId: 'model-b' }, }]); - Network accessline 138
metadata: { url: 'https://mutable.com', contentHash: 'h2', modelId: 'model-b' }, - Network accessline 143
const r = await store.search(generateVector(dims, 2), 1); expect(r[0].id).toBe('https://mutable.com'); - Network accessline 144
expect(r[0].id).toBe('https://mutable.com'); - Network accessline 151
await store.upsert([ { id: 'https://a.com', - Network accessline 152
{ id: 'https://a.com', vector: generateVector(dims, 1), - Network accessline 153
id: 'https://a.com', - Network accessline 154
vector: generateVector(dims, 1), metadata: { url: 'https://a.com', contentHash: 'h', modelId: 'model-1' }, }, - Network accessline 155
metadata: { url: 'https://a.com', contentHash: 'h', modelId: 'model-1' }, - Network accessline 156
}, { id: 'https://b.com', - Network accessline 157
{ id: 'https://b.com', vector: generateVector(dims, 1), - Network accessline 158
id: 'https://b.com', - Network accessline 159
vector: generateVector(dims, 1), metadata: { url: 'https://b.com', contentHash: 'h', modelId: 'model-2' }, }, - Network accessline 160
metadata: { url: 'https://b.com', contentHash: 'h', modelId: 'model-2' }, - Network accessline 164
const r = await store.search(generateVector(dims, 1), 10, { modelId: 'model-1' }); expect(r.map(x => x.id)).toEqual(['https://a.com']); - Network accessline 165
expect(r.map(x => x.id)).toEqual(['https://a.com']); - Network accessline 168
it('pages without embeddings are excluded from getAllEmbeddings', () => { seedPage('https://embedded.com', 'Has embedding'); - Network accessline 169
seedPage('https://embedded.com', 'Has embedding'); - Network accessline 170
seedPage('https://plain.com', 'No embedding'); - Network accessline 172
const dims = 384; const vector = generateVector(dims, 1); updateCacheEmbedding('https://embedded.com', Buffer.from(vector.buffer), 'model', dims); - Network accessline 174
updateCacheEmbedding('https://embedded.com', Buffer.from(vector.buffer), 'model', dims); - Network accessline 186
const records = Array.from({ length: count }, (_, i) => ({ id: `https://page${i}.com`, - Network accessline 187
id: `https://page${i}.com`, - Network accessline 188
vector: generateVector(dims, i + 1), metadata: { url: `https://page${i}.com`, - Network accessline 189
metadata: { url: `https://page${i}.com`, contentHash: '', - Network accessline 190
url: `https://page${i}.com`, - Network accessline 207
it('handles concurrent embedding updates without corruption', async () => { const dims = 384; seedPage('https://concurrent.com', 'Concurrent test'); - Network accessline 209
seedPage('https://concurrent.com', 'Concurrent test'); - Network accessline 213
return Promise.resolve( updateCacheEmbedding( 'https://concurrent.com', - Network accessline 214
updateCacheEmbedding( 'https://concurrent.com', Buffer.from(v.buffer), - Network accessline 215
'https://concurrent.com', - Network accessline 225
const emb = getEmbeddingForUrl('https://concurrent.com');
tests/integration/extract-pipeline-v1.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
// Real served HTML for https://react.dev/reference/react (captured live). Unlike - Network accessline 32
// Real served HTML for https://vuejs.org/guide/introduction (captured live, body - Network accessline 46
function recipeFixture(): string { const recipe = { '@context': 'https://schema.org', - Network accessline 47
const recipe = { '@context': 'https://schema.org', '@type': 'Recipe', - Network accessline 48
'@context': 'https://schema.org', - Network accessline 73
function productFixture(): string { const product = { '@context': 'https://schema.org', - Network accessline 74
const product = { '@context': 'https://schema.org', '@type': 'Product', - Network accessline 75
'@context': 'https://schema.org', - Network accessline 109
const result = await provider.extract( articleFixture, 'https://example.com/blog/scrapers', - Network accessline 110
articleFixture, 'https://example.com/blog/scrapers', ); - Network accessline 111
'https://example.com/blog/scrapers', - Network accessline 123
it('extracts a recipe fixture and emits site-specific markdown', async () => { const provider = await getExtractProvider(); const result = await provider.extract(recipeFixture(), 'https://example.com/cookies'); - Network accessline 125
const result = await provider.extract(recipeFixture(), 'https://example.com/cookies'); - Network accessline 133
it('extracts a product fixture and emits price and brand', async () => { const provider = await getExtractProvider(); const result = await provider.extract(productFixture(), 'https://example.com/widget'); - Network accessline 135
const result = await provider.extract(productFixture(), 'https://example.com/widget'); - Network accessline 149
</article>`, ); const result = await provider.extract(html, 'https://example.com/random'); - Network accessline 151
const result = await provider.extract(html, 'https://example.com/random'); - Network accessline 161
const result = await provider.extract( articleFixture, 'https://example.com/blog/scrapers', - Network accessline 162
articleFixture, 'https://example.com/blog/scrapers', { maxChars: 200 }, - Network accessline 163
'https://example.com/blog/scrapers', - Network accessline 171
const result = await provider.extract( articleFixture, 'https://example.com/blog/scrapers', - Network accessline 172
articleFixture, 'https://example.com/blog/scrapers', ); - Network accessline 173
'https://example.com/blog/scrapers', - Network accessline 179
it('SPA reference page → main content at small char cap, not nav-only', async () => { const provider = await getExtractProvider(); const result = await provider.extract(reactShell, 'https://react.dev/reference/react', { - Network accessline 180
const provider = await getExtractProvider(); const result = await provider.extract(reactShell, 'https://react.dev/reference/react', { maxChars: 1200, - Network accessline 181
const result = await provider.extract(reactShell, 'https://react.dev/reference/react', { - Network accessline 194
const result = await provider.extract( reactReferenceReal, 'https://react.dev/reference/react', - Network accessline 195
reactReferenceReal, 'https://react.dev/reference/react', ); - Network accessline 196
'https://react.dev/reference/react', - Network accessline 210
const result = await provider.extract( vitepressGuide, 'https://vuejs.org/guide/introduction', - Network accessline 211
vitepressGuide, 'https://vuejs.org/guide/introduction', ); - Network accessline 212
'https://vuejs.org/guide/introduction', - Network accessline 244
); const provider = await getExtractProvider(); const result = await provider.extract(html, 'https://example.com/post'); - Network accessline 245
const provider = await getExtractProvider(); const result = await provider.extract(html, 'https://example.com/post'); expect({ - Network accessline 246
const result = await provider.extract(html, 'https://example.com/post');
tests/integration/extract-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
const addr = server.address(); if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); - Network accessline 40
if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); } - Network accessline 41
resolve(`http://localhost:${addr.port}`); - Network accessline 84
expect(data.date).toBe('2025-08-15'); expect(data.keywords).toEqual(['typescript', 'generics', 'programming', 'tutorial']); expect(data.og_image).toBe('https://example.com/images/ts-generics.png'); - Network accessline 85
expect(data.keywords).toEqual(['typescript', 'generics', 'programming', 'tutorial']); expect(data.og_image).toBe('https://example.com/images/ts-generics.png'); }); - Network accessline 86
expect(data.og_image).toBe('https://example.com/images/ts-generics.png');
tests/integration/extract-schema-evidence-only.test.ts
- Executable scriptline 1
Executable file - Network accessline 44
const TIER: LocalModelTier = { available: true, endpoint: 'http://localhost:11434', - Network accessline 45
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', - Network accessline 46
endpoint: 'http://localhost:11434', - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted]
tests/integration/extract-structured.test.ts
- Executable scriptline 1
Executable file
tests/integration/extract-tables-truncation.test.ts
- Executable scriptline 1
Executable file
tests/integration/extract-wikipedia-chrome.test.ts
- Executable scriptline 1
Executable file
tests/integration/extraction-pipeline-structured-data.test.ts
- Executable scriptline 1
Executable file
tests/integration/extraction/markdown-post-process.test.ts
tests/integration/extras-prompt-roundtrip.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted]
tests/integration/fetch-cache-completeness-gate.test.ts
- Executable scriptline 1
Executable file - Network accessline 76
it('shell-cached row is NOT served from cache → exactly ONE live refetch (no loop)', async () => { const url = 'https://example.com/shell'; - Network accessline 77
const url = 'https://example.com/shell'; - Network accessline 94
it('full-cached row is served from cache (no refetch)', async () => { const url = 'https://example.com/full'; - Network accessline 95
const url = 'https://example.com/full'; - Network accessline 107
it('partial-cached row is served from cache (no refetch)', async () => { const url = 'https://example.com/partial'; - Network accessline 108
const url = 'https://example.com/partial'; - Network accessline 121
const url = 'https://example.com/thin'; - Network accessline 133
it('force_refresh bypasses the cache entirely (one live fetch regardless of label)', async () => { const url = 'https://example.com/full-forced'; - Network accessline 134
const url = 'https://example.com/full-forced'; - Network accessline 143
it('mode:cache serves a SHELL-cached row LABELED (no live path in cache-only mode)', async () => { const url = 'https://example.com/shell-cache-only'; - Network accessline 144
const url = 'https://example.com/shell-cache-only';
tests/integration/fetch-cache-miss.test.ts
tests/integration/fetch-method-visibility.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
function makeHttpResult(): Awaited<ReturnType<HttpClient['fetch']>> { return { url: 'https://method-test.example/page', - Network accessline 19
return { url: 'https://method-test.example/page', finalUrl: 'https://method-test.example/page', - Network accessline 20
url: 'https://method-test.example/page', - Network accessline 21
finalUrl: 'https://method-test.example/page', - Network accessline 29
function makeBrowserResult(url = 'https://method-test.example/page'): RawFetchResult { - Network accessline 58
const url = 'https://method-test.example/page'; - Network accessline 72
const url = 'https://method-test.example/page'; - Network accessline 78
// Second fetch (no force_refresh) should hit cache - Network accessline 95
const url = 'https://method-test.example/page';
tests/integration/fetch-pdf.test.ts
- Executable scriptline 1
Executable file - Network accessline 76
it('returns extracted PDF text on an arxiv-style PDF URL', async () => { const url = 'https://arxiv.org/pdf/2301.00001v1'; - Network accessline 77
const url = 'https://arxiv.org/pdf/2301.00001v1'; - Network accessline 96
const url = 'https://react.dev/papers/hooks.pdf';
tests/integration/fetch-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 37
const addr = server.address(); if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); - Network accessline 38
if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); } - Network accessline 39
resolve(`http://localhost:${addr.port}`); - Network accessline 197
const result = await handleFetch({ url: 'https://blocked.example/' }, router); - Network accessline 235
const result = await handleFetch({ url: 'https://news.example/how-challenges-work' }, router);
tests/integration/fetch-router-tuning.test.ts
- Executable scriptline 1
Executable file - Network accessline 60
it('does not escalate to Playwright when SSR body is substantive even though <noscript> warns about JavaScript', async () => { const url = 'https://ssr-with-noscript.example/article'; - Network accessline 61
const url = 'https://ssr-with-noscript.example/article'; const httpClient: HttpClient = { fetch: vi.fn(async () => ({ - Network accessline 87
it('passes a 429 + Retry-After response through the tool boundary without paying Playwright cold-start', async () => { const url = 'https://rate-limited.example/api'; - Network accessline 88
const url = 'https://rate-limited.example/api'; const httpClient: HttpClient = { fetch: vi.fn(async () => ({ - Network accessline 136
const httpFetcher: HttpFetcher = vi.fn(async (_url, opts) => { stealthSignal = opts?.signal; return { url: 'https://stealth.example/x', html: '<html><body>' + 'a'.repeat(2000) + '</body></html>', text: 'a'.repeat(2000) }; - Network accessline 137
stealthSignal = opts?.signal; return { url: 'https://stealth.example/x', html: '<html><body>' + 'a'.repeat(2000) + '</body></html>', text: 'a'.repeat(2000) }; }); - Network accessline 138
return { url: 'https://stealth.example/x', html: '<html><body>' + 'a'.repeat(2000) + '</body></html>', text: 'a'.repeat(2000) }; - Network accessline 139
}); const router = new SmartRouter({ httpFetcher }); await router.fetch('https://stealth.example/x', { mode: 'stealth', signal: controller.signal }); - Network accessline 141
await router.fetch('https://stealth.example/x', { mode: 'stealth', signal: controller.signal }); - Network accessline 165
}; const router = new SmartRouter({ httpClient, tlsFetcher }); await router.fetch('https://stackoverflow.com/questions/1/x', { signal: controller.signal }); - Network accessline 167
await router.fetch('https://stackoverflow.com/questions/1/x', { signal: controller.signal }); - Network accessline 180
const httpFetcher: HttpFetcher = vi.fn(async (_url, opts) => { observed = opts?.signal; return { url: 'https://stealth2.example/x', html: '<html></html>', text: 'tiny' }; - Network accessline 181
observed = opts?.signal; return { url: 'https://stealth2.example/x', html: '<html></html>', text: 'tiny' }; }); - Network accessline 182
return { url: 'https://stealth2.example/x', html: '<html></html>', text: 'tiny' }; - Network accessline 187
})); const router = new SmartRouter({ httpFetcher, playwrightFetcher: playwrightFetcher as never }); await router.fetch('https://stealth2.example/x', { mode: 'stealth', signal: controller.signal }); - Network accessline 188
const router = new SmartRouter({ httpFetcher, playwrightFetcher: playwrightFetcher as never }); await router.fetch('https://stealth2.example/x', { mode: 'stealth', signal: controller.signal }); expect(observed).toBe(controller.signa - Network accessline 189
await router.fetch('https://stealth2.example/x', { mode: 'stealth', signal: controller.signal });
tests/integration/fetch-site-data.test.ts
- Network accessline 1
// Integration test for P1: site-extractor structured-JSON passthrough on fetch(). - Executable scriptline 1
Executable file - Network accessline 4
// but the structured `SiteExtractionResult` shape (Reddit `comments[]`, YouTube // `caption_tracks[]`, Amazon `asin`/`price`) was getting flattened into the // markdown body of the `fetch()` response — never reaching callers as a JSON - Network accessline 5
// `caption_tracks[]`, Amazon `asin`/`price`) was getting flattened into the // markdown body of the `fetch()` response — never reaching callers as a JSON // field. This file asserts the passthrough at the `handleFetch` boundary, the - Network accessline 6
// markdown body of the `fetch()` response — never reaching callers as a JSON - Network accessline 52
const html = load(siteFixturesDir, 'reddit-thread.html'); const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 53
const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; const router = makeRouter(url, html); - Network accessline 54
'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 94
const html = load(siteFixturesDir, 'reddit-thread.html'); const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 95
const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; const router = makeRouter(url, html); - Network accessline 96
'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 119
it('returns site_data with video_id / caption_tracks / chapters for a youtube watch URL', async () => { const html = load(siteFixturesDir, 'youtube-watch-with-captions.html'); const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ - Network accessline 120
const html = load(siteFixturesDir, 'youtube-watch-with-captions.html'); const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; const router = makeRouter(url, html); - Network accessline 121
const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 179
const html = load(amazonFixturesDir, 'electronics.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 180
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 225
const html = load(siteFixturesDir, 'reddit-blocked.html'); const url = 'https://old.reddit.com/r/programming/comments/abc123/blocked/'; - Network accessline 226
const url = 'https://old.reddit.com/r/programming/comments/abc123/blocked/'; const router = makeRouter(url, html); - Network accessline 227
'https://old.reddit.com/r/programming/comments/abc123/blocked/'; - Network accessline 238
const html = load(siteFixturesDir, 'reddit-blocked.html'); const url = 'https://old.reddit.com/r/programming/comments/abc123/blocked/'; - Network accessline 239
const url = 'https://old.reddit.com/r/programming/comments/abc123/blocked/'; const router = makeRouter(url, html); - Network accessline 240
'https://old.reddit.com/r/programming/comments/abc123/blocked/'; - Network accessline 251
const html = load(siteFixturesDir, 'reddit-thread.html'); const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 252
const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; const router = makeRouter(url, html); - Network accessline 253
'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 276
it('returns NO site_data on an Amazon Page Not Found body (amazon pretending success)', async () => { const html = load(amazonFixturesDir, 'blocked.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 277
const html = load(amazonFixturesDir, 'blocked.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; const router = makeRouter(url, html); - Network accessline 278
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 288
it('surfaces fetch_failed="blocked" on the envelope (amazon honest failure)', async () => { const html = load(amazonFixturesDir, 'blocked.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 289
const html = load(amazonFixturesDir, 'blocked.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; const router = makeRouter(url, html); - Network accessline 290
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 300
it('does NOT set fetch_failed on a real Amazon product page (no regression)', async () => { const html = load(amazonFixturesDir, 'electronics.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 301
const html = load(amazonFixturesDir, 'electronics.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; const router = makeRouter(url, html); - Network accessline 302
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 327
<p>${'Some body content used to satisfy extractor thresholds. '.repeat(20)}</p> </article></body></html>`; const url = 'https://example.com/article'; - Network accessline 328
</article></body></html>`; const url = 'https://example.com/article'; const router = makeRouter(url, html); - Network accessline 329
const url = 'https://example.com/article';
tests/integration/fetch-vs-extract-metadata.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
<title>pgEdge — Postgres You Control</title> <meta name="description" content="Bring your own cloud account"> <meta property="og:image" content="https://pgedge.com/og.png"> - Network accessline 15
<meta name="description" content="Bring your own cloud account"> <meta property="og:image" content="https://pgedge.com/og.png"> <meta property="og:type" content="website"> - Network accessline 16
<meta property="og:image" content="https://pgedge.com/og.png"> - Network accessline 17
<meta property="og:type" content="website"> <meta name="twitter:image" content="https://pgedge.com/tw.png"> <meta name="keywords" content="postgres, distributed, multi-master"> - Network accessline 18
<meta name="twitter:image" content="https://pgedge.com/tw.png"> - Network accessline 19
<meta name="keywords" content="postgres, distributed, multi-master"> <link rel="canonical" href="https://pgedge.com/"> </head> - Network accessline 20
<link rel="canonical" href="https://pgedge.com/"> - Network accessline 43
const html = ` <html><head> <meta name="twitter:image" content="https://example.com/tw.png"> - Network accessline 44
<html><head> <meta name="twitter:image" content="https://example.com/tw.png"> </head><body></body></html> - Network accessline 45
<meta name="twitter:image" content="https://example.com/tw.png"> - Network accessline 52
expect(direct.og_image).toBe('https://example.com/tw.png'); - Network accessline 53
expect(merged.og_image).toBe('https://example.com/tw.png');
tests/integration/fetch/browser-pool.test.ts
- Executable scriptline 1
Executable file - Network accessline 146
pool = new BrowserPool(); const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 147
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 166
pool = new BrowserPool(); const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 167
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 259
pool = new BrowserPool({ browserType: 'chromium' }); const url = `http://127.0.0.1:${getPort(testServer)}/`; - Network accessline 260
const url = `http://127.0.0.1:${getPort(testServer)}/`;
tests/integration/fetch/no-lightpanda.test.ts
- Executable scriptline 1
Executable file - Network accessline 75
it('BrowserPool.fetchWithBrowser routes to Chromium even when WIGOLO_LIGHTPANDA_ENABLED is set', async () => { process.env.WIGOLO_LIGHTPANDA_ENABLED = 'true'; process.env.WIGOLO_LIGHTPANDA_URL = 'http://localhost:9222'; - Network accessline 76
process.env.WIGOLO_LIGHTPANDA_ENABLED = 'true'; process.env.WIGOLO_LIGHTPANDA_URL = 'http://localhost:9222'; process.env.MAX_BROWSERS = '3'; - Network accessline 77
process.env.WIGOLO_LIGHTPANDA_URL = 'http://localhost:9222'; - Network accessline 88
pool = new BrowserPool(); const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 89
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 112
pool = new BrowserPool(); const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 113
const url = `http://127.0.0.1:${getPort(server)}/`;
tests/integration/fetch/playwright-tier.test.ts
- Executable scriptline 1
Executable file - Network accessline 67
const addr = server.address(); if (typeof addr === 'object' && addr) { baseUrl = `http://127.0.0.1:${addr.port}`; - Network accessline 68
if (typeof addr === 'object' && addr) { baseUrl = `http://127.0.0.1:${addr.port}`; canBind = true; - Network accessline 69
baseUrl = `http://127.0.0.1:${addr.port}`; - Network accessline 140
const port = typeof addr === 'object' && addr ? addr.port : 0; try { const result = await fetchWithPlaywright(`http://127.0.0.1:${port}/nav-shell`); - Network accessline 141
try { const result = await fetchWithPlaywright(`http://127.0.0.1:${port}/nav-shell`); expect(result.html).toContain('Real Article'); - Network accessline 142
const result = await fetchWithPlaywright(`http://127.0.0.1:${port}/nav-shell`);
tests/integration/fetch/spa-settle-corpus.test.ts
- Executable scriptline 1
Executable file
tests/integration/fetch/spa-settle-corpus/fixtures.ts
- Executable scriptline 1
Executable file - Network accessline 51
<main>${ARTICLE_HTML}</main> <script> setInterval(() => { fetch('/beacon?t=' + Date.now()).catch(() => {}); }, 250); - Network accessline 52
<script> setInterval(() => { fetch('/beacon?t=' + Date.now()).catch(() => {}); }, 250); </script></body></html>`; - Network accessline 53
setInterval(() => { fetch('/beacon?t=' + Date.now()).catch(() => {}); }, 250);
tests/integration/fetch/spa-settle-corpus/server.ts
- Executable scriptline 1
Executable file - Network accessline 11
return new Promise((resolve) => { const server = http.createServer((req, res) => { const url = new URL(req.url ?? '/', 'http://localhost'); - Network accessline 12
const server = http.createServer((req, res) => { const url = new URL(req.url ?? '/', 'http://localhost'); const route = url.pathname; - Network accessline 13
const url = new URL(req.url ?? '/', 'http://localhost'); - Network accessline 40
const port = (server.address() as AddressInfo).port; resolve({ baseUrl: `http://127.0.0.1:${port}`, - Network accessline 41
resolve({ baseUrl: `http://127.0.0.1:${port}`, close: () => new Promise<void>((r, j) => server.close((e) => (e ? j(e) : r()))), - Network accessline 42
baseUrl: `http://127.0.0.1:${port}`,
tests/integration/filter-enforcement.test.ts
- Executable scriptline 1
Executable file - Network accessline 115
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 116
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 117
url: 'https://example.com', - Network accessline 118
finalUrl: 'https://example.com', - Network accessline 167
verticalState.general = [ makeEntry('engine-a', [ makeResult('engine-a', 'https://react.dev/learn', 'React Learn', 'Learn React'), - Network accessline 168
makeEntry('engine-a', [ makeResult('engine-a', 'https://react.dev/learn', 'React Learn', 'Learn React'), makeResult('engine-a', 'https://medium.com/x', 'Medium x', 'snippet'), - Network accessline 169
makeResult('engine-a', 'https://react.dev/learn', 'React Learn', 'Learn React'), - Network accessline 170
makeResult('engine-a', 'https://medium.com/x', 'Medium x', 'snippet'), - Network accessline 171
makeResult('engine-a', 'https://blog.example.com/y', 'Blog y', 'snippet'), - Network accessline 172
makeResult('engine-a', 'https://stackoverflow.com/q/1', 'SO', 'snippet'), - Network accessline 195
verticalState.general = [ makeEntry('engine-a', [ makeResult('engine-a', 'https://keep.com/a', 'Keep', 'k'), - Network accessline 196
makeEntry('engine-a', [ makeResult('engine-a', 'https://keep.com/a', 'Keep', 'k'), makeResult('engine-a', 'https://spam.com/x', 'Spam', 's'), - Network accessline 197
makeResult('engine-a', 'https://keep.com/a', 'Keep', 'k'), - Network accessline 198
makeResult('engine-a', 'https://spam.com/x', 'Spam', 's'), - Network accessline 223
makeResult( 'engine-a', 'https://react.dev/reference/react/useState', - Network accessline 224
'engine-a', 'https://react.dev/reference/react/useState', 'React Reference', - Network accessline 225
'https://react.dev/reference/react/useState', - Network accessline 231
makeResult( 'engine-b', 'https://react.dev/reference/react/useState', - Network accessline 232
'engine-b', 'https://react.dev/reference/react/useState', 'useState hook reference', - Network accessline 233
'https://react.dev/reference/react/useState', - Network accessline 250
if (!r.ok) return; const urls = r.data.results.map((res) => res.url); expect(urls).toContain('https://react.dev/reference/react/useState'); - Network accessline 251
const urls = r.data.results.map((res) => res.url); expect(urls).toContain('https://react.dev/reference/react/useState'); }); - Network accessline 252
expect(urls).toContain('https://react.dev/reference/react/useState'); - Network accessline 257
for (let i = 0; i < 5; i++) { seedCache( `https://noise-${i}.example`, - Network accessline 258
seedCache( `https://noise-${i}.example`, `Framework Note ${i}`, - Network accessline 259
`https://noise-${i}.example`, - Network accessline 284
it('H8: find_similar threshold:0 returns the same set as omitting threshold', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 285
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 286
'https://react.dev/hooks',
tests/integration/find-similar.test.ts
- Executable scriptline 1
Executable file - Network accessline 55
{ title: 'React Patterns', url: 'https://patterns.dev/react', - Network accessline 56
title: 'React Patterns', url: 'https://patterns.dev/react', snippet: 'Common React design patterns and best practices.', - Network accessline 57
url: 'https://patterns.dev/react', - Network accessline 62
{ title: 'State Management Guide', url: 'https://blog.example.com/state-management', - Network accessline 63
title: 'State Management Guide', url: 'https://blog.example.com/state-management', snippet: 'A comprehensive guide to state management in React.', - Network accessline 64
url: 'https://blog.example.com/state-management', - Network accessline 72
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev/hooks', - Network accessline 73
fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev/hooks', finalUrl: 'https://react.dev/hooks', - Network accessline 74
url: 'https://react.dev/hooks', - Network accessline 75
finalUrl: 'https://react.dev/hooks', - Network accessline 101
it('end-to-end: concept search with cache + web fallback', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 102
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 103
'https://react.dev/hooks', - Network accessline 106
); seedCache( 'https://react.dev/components', - Network accessline 107
seedCache( 'https://react.dev/components', 'React Components', - Network accessline 108
'https://react.dev/components', - Network accessline 130
it('end-to-end: URL-based similarity with cache', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 131
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 132
'https://react.dev/hooks', - Network accessline 135
); seedCache( 'https://react.dev/context', - Network accessline 136
seedCache( 'https://react.dev/context', 'React Context', - Network accessline 137
'https://react.dev/context', - Network accessline 140
); seedCache( 'https://react.dev/reducer', - Network accessline 141
seedCache( 'https://react.dev/reducer', 'React useReducer', - Network accessline 142
'https://react.dev/reducer', - Network accessline 147
const __r_result = await handleFindSimilar( { url: 'https://react.dev/hooks', - Network accessline 148
{ url: 'https://react.dev/hooks', include_web: false, - Network accessline 149
url: 'https://react.dev/hooks', - Network accessline 157
expect(result.error).toBeUndefined(); const urls = result.results.map(r => r.url); expect(urls).not.toContain('https://react.dev/hooks'); - Network accessline 158
const urls = result.results.map(r => r.url); expect(urls).not.toContain('https://react.dev/hooks'); expect(result.cache_hits).toBeGreaterThan(0); - Network accessline 159
expect(urls).not.toContain('https://react.dev/hooks'); - Network accessline 164
it('end-to-end: domain filtering works across both sources', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 165
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 166
'https://react.dev/hooks', - Network accessline 169
); seedCache( 'https://angular.dev/guide', - Network accessline 170
seedCache( 'https://angular.dev/guide', 'Angular Guide', - Network accessline 171
'https://angular.dev/guide', - Network accessline 220
it('end-to-end: results have valid match_signals', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 221
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 222
'https://react.dev/hooks', - Network accessline 253
const __r_result = await handleFindSimilar( { url: 'https://nonexistent.example.com/page' }, - Network accessline 254
{ url: 'https://nonexistent.example.com/page' }, - Network accessline 266
for (let i = 0; i < 25; i++) { seedCache( `https://example.com/react-page-${i}`, - Network accessline 267
seedCache( `https://example.com/react-page-${i}`, `React Tutorial ${i}`, - Network accessline 268
`https://example.com/react-page-${i}`, - Network accessline 285
it('end-to-end: results are sorted by relevance descending', async () => { seedCache( 'https://a.com/hooks', - Network accessline 286
seedCache( 'https://a.com/hooks', 'React Hooks Deep Dive', - Network accessline 287
'https://a.com/hooks', - Network accessline 290
); seedCache( 'https://b.com/intro', - Network accessline 291
seedCache( 'https://b.com/intro', 'React Introduction', - Network accessline 292
'https://b.com/intro', - Network accessline 311
it('end-to-end: concurrent requests do not interfere', async () => { seedCache('https://a.com', 'Topic A', '# Topic A\n\n**State** management.'); - Network accessline 312
seedCache('https://a.com', 'Topic A', '# Topic A\n\n**State** management.'); - Network accessline 313
seedCache('https://b.com', 'Topic B', '# Topic B\n\n**Routing** patterns.'); - Network accessline 338
seedCache( 'https://example.com/deployment', - Network accessline 339
'https://example.com/deployment', - Network accessline 343
for (let i = 0; i < 4; i++) { seedCache( `https://unrelated-${i}.example`, - Network accessline 344
seedCache( `https://unrelated-${i}.example`, `Unrelated ${i}`, - Network accessline 345
`https://unrelated-${i}.example`, - Network accessline 369
it('end-to-end M10: ranking_debug is OMITTED by default', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 370
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 371
'https://react.dev/hooks', - Network accessline 389
it('end-to-end M10: ranking_debug is EMITTED per result when include_ranking_debug=true', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 390
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 391
'https://react.dev/hooks',
tests/integration/hybrid-mode.test.ts
- Executable scriptline 1
Executable file - Network accessline 82
process.env.SEARXNG_URL = 'http://sidecar.test:8888'; - Network accessline 103
makeResult( 'Next | Online Shopping Clothes Shoes Bags', 'https://next.co.uk/', - Network accessline 104
'Next | Online Shopping Clothes Shoes Bags', 'https://next.co.uk/', 1.0, - Network accessline 105
'https://next.co.uk/', - Network accessline 111
impls.searxng = async () => ok({ results: [makeResult('Next.js', 'https://nextjs.org/', 0.9)], - Network accessline 112
ok({ results: [makeResult('Next.js', 'https://nextjs.org/', 0.9)], engines_used: ['searxng:google'], - Network accessline 113
results: [makeResult('Next.js', 'https://nextjs.org/', 0.9)], - Network accessline 134
ok({ results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 135
results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 136
makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 137
makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 138
makeResult('OpenShift Operators', 'https://openshift.com/operators', 0.6), - Network accessline 159
ok({ results: [ makeResult('A', 'https://example.com/a'), - Network accessline 160
results: [ makeResult('A', 'https://example.com/a'), makeResult('B', 'https://example.com/b'), - Network accessline 161
makeResult('A', 'https://example.com/a'), - Network accessline 162
makeResult('B', 'https://example.com/b'), - Network accessline 163
makeResult('C', 'https://example.com/c'), - Network accessline 181
impls.core = async () => ok({ results: [makeResult('A', 'https://niche.example.com/a', 0.8)], - Network accessline 182
ok({ results: [makeResult('A', 'https://niche.example.com/a', 0.8)], engines_used: ['bing'], - Network accessline 183
results: [makeResult('A', 'https://niche.example.com/a', 0.8)], - Network accessline 187
ok({ results: [ makeResult('B', 'https://niche.example.com/b', 0.6), - Network accessline 188
results: [ makeResult('B', 'https://niche.example.com/b', 0.6), makeResult('C', 'https://niche.example.com/c', 0.5), - Network accessline 189
makeResult('B', 'https://niche.example.com/b', 0.6), - Network accessline 190
makeResult('C', 'https://niche.example.com/c', 0.5), - Network accessline 221
impls.core = async () => ok({ results: [makeResult('only', 'https://niche.example.com/a', 0.8)], - Network accessline 222
ok({ results: [makeResult('only', 'https://niche.example.com/a', 0.8)], engines_used: ['bing'], - Network accessline 223
results: [makeResult('only', 'https://niche.example.com/a', 0.8)], - Network accessline 227
impls.searxng = async () => ok({ results: [makeResult('B', 'https://niche.example.com/b', 0.6)] }); - Network accessline 228
ok({ results: [makeResult('B', 'https://niche.example.com/b', 0.6)] }); - Network accessline 244
expect(out.data.results.map((r) => r.url)).toEqual(['https://niche.example.com/a']);
tests/integration/instructions-v3.test.ts
- Executable scriptline 1
Executable file
tests/integration/llm-fallback-e2e.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Access to secretsline 145
[Credential-related source omitted] - Access to secretsline 146
[Credential-related source omitted] - Access to secretsline 147
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 152
[Credential-related source omitted]
tests/integration/llm-fallback-schema.test.ts
tests/integration/map-mode.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
// Multi-page site structure: // // / (home) -> /docs, /about, /blog, https://external.com - Network accessline 9
// // / (home) -> /docs, /about, /blog, https://external.com // /docs -> /docs/getting-started, /docs/api-reference - Network accessline 10
// / (home) -> /docs, /about, /blog, https://external.com - Network accessline 24
<a href="/about">About</a> <a href="/blog">Blog</a> <a href="https://external.com">External</a> - Network accessline 25
<a href="/blog">Blog</a> <a href="https://external.com">External</a> <a href="javascript:void(0)">JS Link</a> - Network accessline 26
<a href="https://external.com">External</a> - Network accessline 97
const SITEMAP_XML = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 98
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 137
async function createFetchFn() { return async (url: string) => { const resp = await fetch(url); - Network accessline 138
return async (url: string) => { const resp = await fetch(url); const html = await resp.text(); - Network accessline 139
const resp = await fetch(url); - Network accessline 150
const addr = server.address(); if (addr && typeof addr === 'object') { baseUrl = `http://127.0.0.1:${addr.port}`; - Network accessline 151
if (addr && typeof addr === 'object') { baseUrl = `http://127.0.0.1:${addr.port}`; } - Network accessline 152
baseUrl = `http://127.0.0.1:${addr.port}`;
tests/integration/mode-deep.test.ts
- Executable scriptline 1
Executable file - Network accessline 44
name: 'eng', search: vi.fn().mockResolvedValue([{ title: 't', url: 'https://x.test/', snippet: 's', - Network accessline 45
search: vi.fn().mockResolvedValue([{ title: 't', url: 'https://x.test/', snippet: 's', relevance_score: 0.5, engine: 'eng', - Network accessline 46
title: 't', url: 'https://x.test/', snippet: 's', - Network accessline 50
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://x.test/', finalUrl: 'https://x.test/', - Network accessline 51
fetch: vi.fn().mockResolvedValue({ url: 'https://x.test/', finalUrl: 'https://x.test/', html: '<html><body><p>full body</p></body></html>', - Network accessline 52
url: 'https://x.test/', finalUrl: 'https://x.test/', - Network accessline 77
search: vi.fn().mockResolvedValue( Array.from({ length: 8 }, (_, i) => ({ title: `t${i}`, url: `https://x.test/${i}`, snippet: 'snippet', - Network accessline 78
Array.from({ length: 8 }, (_, i) => ({ title: `t${i}`, url: `https://x.test/${i}`, snippet: 'snippet', relevance_score: 1 - i * 0.1, engine: 'e', - Network accessline 79
title: `t${i}`, url: `https://x.test/${i}`, snippet: 'snippet',
tests/integration/multi-browser.test.ts
- Executable scriptline 1
Executable file
tests/integration/multi-query.test.ts
- Executable scriptline 1
Executable file - Network accessline 77
const engine = makeEngine({ 'react hooks': [ { title: 'React Hooks Guide', url: `http://127.0.0.1:${serverPort}/react`, snippet: 'Learn hooks', relevance_score: 0.95, engine: 'integration-mock' }, - Network accessline 78
'react hooks': [ { title: 'React Hooks Guide', url: `http://127.0.0.1:${serverPort}/react`, snippet: 'Learn hooks', relevance_score: 0.95, engine: 'integration-mock' }, { title: 'Shared Page', url: `http://127.0.0.1:${server - Network accessline 79
{ title: 'React Hooks Guide', url: `http://127.0.0.1:${serverPort}/react`, snippet: 'Learn hooks', relevance_score: 0.95, engine: 'integration-mock' }, - Network accessline 80
{ title: 'Shared Page', url: `http://127.0.0.1:${serverPort}/shared`, snippet: 'Shared', relevance_score: 0.8, engine: 'integration-mock' }, - Network accessline 81
], 'vue composition api': [ { title: 'Vue Composition', url: `http://127.0.0.1:${serverPort}/vue`, snippet: 'Composition API', relevance_score: 0.9, engine: 'integration-mock' }, - Network accessline 82
'vue composition api': [ { title: 'Vue Composition', url: `http://127.0.0.1:${serverPort}/vue`, snippet: 'Composition API', relevance_score: 0.9, engine: 'integration-mock' }, { title: 'Shared Page', url: `http://127.0.0.1:$ - Network accessline 83
{ title: 'Vue Composition', url: `http://127.0.0.1:${serverPort}/vue`, snippet: 'Composition API', relevance_score: 0.9, engine: 'integration-mock' }, - Network accessline 84
{ title: 'Shared Page', url: `http://127.0.0.1:${serverPort}/shared`, snippet: 'Also shared', relevance_score: 0.85, engine: 'integration-mock' }, - Network accessline 108
const engine = makeEngine({ 'simple test': [ { title: 'Simple', url: `http://127.0.0.1:${serverPort}/simple`, snippet: 'Simple result', relevance_score: 0.9, engine: 'integration-mock' }, - Network accessline 109
'simple test': [ { title: 'Simple', url: `http://127.0.0.1:${serverPort}/simple`, snippet: 'Simple result', relevance_score: 0.9, engine: 'integration-mock' }, ], - Network accessline 110
{ title: 'Simple', url: `http://127.0.0.1:${serverPort}/simple`, snippet: 'Simple result', relevance_score: 0.9, engine: 'integration-mock' }, - Network accessline 133
const engine = makeEngine({ 'q1': [{ title: 'R1', url: `http://127.0.0.1:${serverPort}/1`, snippet: 's1', relevance_score: 0.9, engine: 'integration-mock' }], - Network accessline 134
'q1': [{ title: 'R1', url: `http://127.0.0.1:${serverPort}/1`, snippet: 's1', relevance_score: 0.9, engine: 'integration-mock' }], - Network accessline 135
'q2': [{ title: 'R2', url: `http://127.0.0.1:${serverPort}/2`, snippet: 's2', relevance_score: 0.8, engine: 'integration-mock' }], - Network accessline 136
'q3': [{ title: 'R3', url: `http://127.0.0.1:${serverPort}/3`, snippet: 's3', relevance_score: 0.7, engine: 'integration-mock' }],
tests/integration/onnx-rerank-e2e.test.ts
- Executable scriptline 1
Executable file - Network accessline 41
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 42
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 43
url: 'https://example.com', - Network accessline 44
finalUrl: 'https://example.com', - Network accessline 73
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'A', url: 'https://a.com', snippet: 'a', relevance_score: 0.5, engine: 'mock' }, - Network accessline 74
search: vi.fn().mockResolvedValue([ { title: 'A', url: 'https://a.com', snippet: 'a', relevance_score: 0.5, engine: 'mock' }, { title: 'B', url: 'https://b.com', snippet: 'b', relevance_score: 0.5, engine: 'mock' }, - Network accessline 75
{ title: 'A', url: 'https://a.com', snippet: 'a', relevance_score: 0.5, engine: 'mock' }, - Network accessline 76
{ title: 'B', url: 'https://b.com', snippet: 'b', relevance_score: 0.5, engine: 'mock' }, - Network accessline 77
{ title: 'C', url: 'https://c.com', snippet: 'c', relevance_score: 0.5, engine: 'mock' },
tests/integration/pipeline-success-criteria.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
const baseRouter = (impl?: () => Promise<unknown>): SmartRouter => ({ fetch: vi.fn(impl ?? (async () => ({ url: 'https://example.com', - Network accessline 34
fetch: vi.fn(impl ?? (async () => ({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 35
url: 'https://example.com', - Network accessline 36
finalUrl: 'https://example.com', - Network accessline 66
it('SC-1: cache + array query never returns non-English results', async () => { const engine = baseEngine([ { title: 'PostgreSQL replication', url: 'https://example.com/a', snippet: 'Configuring streaming WAL replication for high - Network accessline 67
const engine = baseEngine([ { title: 'PostgreSQL replication', url: 'https://example.com/a', snippet: 'Configuring streaming WAL replication for high availability databases.', relevance_score: 0.9, engine: 'mock' }, { title: '深度 - Network accessline 68
{ title: 'PostgreSQL replication', url: 'https://example.com/a', snippet: 'Configuring streaming WAL replication for high availability databases.', relevance_score: 0.9, engine: 'mock' }, - Network accessline 69
{ title: '深度学习教程', url: 'https://baidu.com/x', snippet: '本文详细介绍人工智能与神经网络的实现细节及训练方法。', relevance_score: 0.8, engine: 'mock' }, - Network accessline 70
{ title: '人工智能', url: 'https://baidu.com/y', snippet: '机器学习算法和深度学习框架的核心概念与应用案例分析。', relevance_score: 0.7, engine: 'mock' }, - Network accessline 124
} as unknown as SmartRouter; const r = await handleFetch( { url: 'https://example.com', mode: 'stealth' }, - Network accessline 125
const r = await handleFetch( { url: 'https://example.com', mode: 'stealth' }, stealthRouter, - Network accessline 126
{ url: 'https://example.com', mode: 'stealth' }, - Network accessline 136
it('SC-8: extract on no-tables page returns no_tables_detected with hint', async () => { const router = baseRouter(async () => ({ url: 'https://example.com', - Network accessline 137
const router = baseRouter(async () => ({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 138
url: 'https://example.com', - Network accessline 139
finalUrl: 'https://example.com', - Network accessline 145
})); const r = await handleExtract( { url: 'https://example.com', mode: 'tables' }, - Network accessline 146
const r = await handleExtract( { url: 'https://example.com', mode: 'tables' }, router, - Network accessline 147
{ url: 'https://example.com', mode: 'tables' },
tests/integration/plugins/plugin-lifecycle.test.ts
- Executable scriptline 1
Executable file - Network accessline 80
return [{ title: 'Result for ' + query, url: 'https://${name}.example/result', - Network accessline 81
title: 'Result for ' + query, url: 'https://${name}.example/result', snippet: 'Search result', - Network accessline 82
url: 'https://${name}.example/result', - Network accessline 102
const ext = result.extractors[0] as Extractor; expect(ext.canHandle('https://test-site.example/page')).toBe(true); - Network accessline 103
expect(ext.canHandle('https://test-site.example/page')).toBe(true); - Network accessline 104
expect(ext.canHandle('https://other.example/page')).toBe(false); - Network accessline 106
const extracted = ext.extract('<html><body>Hello world from plugin</body></html>', 'https://test-site.example/page'); - Network accessline 121
name: 'test-search-eng', async search(query) { return [{ title: 'Result: ' + query, url: 'https://example.com', snippet: 'test', relevance_score: 0.8, engine: 'test-search-eng' }]; - Network accessline 122
async search(query) { return [{ title: 'Result: ' + query, url: 'https://example.com', snippet: 'test', relevance_score: 0.8, engine: 'test-search-eng' }]; }, - Network accessline 123
return [{ title: 'Result: ' + query, url: 'https://example.com', snippet: 'test', relevance_score: 0.8, engine: 'test-search-eng' }];
tests/integration/remote-rerank-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 10
const originalEnv = process.env; const results: MergedSearchResult[] = [ { title: 'First', url: 'https://first.example', snippet: 'one', relevance_score: 0.8, engines: ['test'] }, - Network accessline 11
const results: MergedSearchResult[] = [ { title: 'First', url: 'https://first.example', snippet: 'one', relevance_score: 0.8, engines: ['test'] }, { title: 'Second', url: 'https://second.example', snippet: 'two', relevance_score: 0.2, e - Network accessline 12
{ title: 'First', url: 'https://first.example', snippet: 'one', relevance_score: 0.8, engines: ['test'] }, - Network accessline 13
{ title: 'Second', url: 'https://second.example', snippet: 'two', relevance_score: 0.2, engines: ['test'] }, - Network accessline 21
WIGOLO_CONFIG_PATH: join(dir, 'config.json'), WIGOLO_RERANKER: 'remote', WIGOLO_RERANK_API_BASE: 'http://127.0.0.1:8082/v1', - Network accessline 22
WIGOLO_RERANKER: 'remote', WIGOLO_RERANK_API_BASE: 'http://127.0.0.1:8082/v1', WIGOLO_RERANKER_MODEL: 'test-model', - Network accessline 23
WIGOLO_RERANK_API_BASE: 'http://127.0.0.1:8082/v1',
tests/integration/repl-e2e.test.ts
- Executable scriptline 1
Executable file
tests/integration/rerank-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 28
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 29
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 30
url: 'https://example.com', - Network accessline 31
finalUrl: 'https://example.com', - Network accessline 58
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'A', url: 'https://a.com', snippet: 'first', relevance_score: 0.9, engine: 'mock' }, - Network accessline 59
search: vi.fn().mockResolvedValue([ { title: 'A', url: 'https://a.com', snippet: 'first', relevance_score: 0.9, engine: 'mock' }, { title: 'B', url: 'https://b.com', snippet: 'second', relevance_score: 0.7, engine: 'mock' }, - Network accessline 60
{ title: 'A', url: 'https://a.com', snippet: 'first', relevance_score: 0.9, engine: 'mock' }, - Network accessline 61
{ title: 'B', url: 'https://b.com', snippet: 'second', relevance_score: 0.7, engine: 'mock' }, - Network accessline 62
{ title: 'C', url: 'https://c.com', snippet: 'third', relevance_score: 0.5, engine: 'mock' }, - Network accessline 78
name: 'engine1', search: vi.fn().mockResolvedValue([ { title: 'E1-A', url: 'https://e1a.com', snippet: 'e1a', relevance_score: 0.95, engine: 'engine1' }, - Network accessline 79
search: vi.fn().mockResolvedValue([ { title: 'E1-A', url: 'https://e1a.com', snippet: 'e1a', relevance_score: 0.95, engine: 'engine1' }, { title: 'E1-B', url: 'https://e1b.com', snippet: 'e1b', relevance_score: 0.60, engine: - Network accessline 80
{ title: 'E1-A', url: 'https://e1a.com', snippet: 'e1a', relevance_score: 0.95, engine: 'engine1' }, - Network accessline 81
{ title: 'E1-B', url: 'https://e1b.com', snippet: 'e1b', relevance_score: 0.60, engine: 'engine1' }, - Network accessline 85
name: 'engine2', search: vi.fn().mockResolvedValue([ { title: 'E2-A', url: 'https://e2a.com', snippet: 'e2a', relevance_score: 0.80, engine: 'engine2' }, - Network accessline 86
search: vi.fn().mockResolvedValue([ { title: 'E2-A', url: 'https://e2a.com', snippet: 'e2a', relevance_score: 0.80, engine: 'engine2' }, ]), - Network accessline 87
{ title: 'E2-A', url: 'https://e2a.com', snippet: 'e2a', relevance_score: 0.80, engine: 'engine2' }, - Network accessline 104
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'With Content', url: 'https://content.com', snippet: 'has content', relevance_score: 0.9, engine: 'mock' }, - Network accessline 105
search: vi.fn().mockResolvedValue([ { title: 'With Content', url: 'https://content.com', snippet: 'has content', relevance_score: 0.9, engine: 'mock' }, ] satisfies RawSearchResult[]), - Network accessline 106
{ title: 'With Content', url: 'https://content.com', snippet: 'has content', relevance_score: 0.9, engine: 'mock' }, - Network accessline 121
name: 'e1', search: vi.fn().mockResolvedValue([ { title: 'Overlap', url: 'https://overlap.com', snippet: 'from e1', relevance_score: 0.7, engine: 'e1' }, - Network accessline 122
search: vi.fn().mockResolvedValue([ { title: 'Overlap', url: 'https://overlap.com', snippet: 'from e1', relevance_score: 0.7, engine: 'e1' }, { title: 'Unique E1', url: 'https://e1only.com', snippet: 'e1 only', relevance_sco - Network accessline 123
{ title: 'Overlap', url: 'https://overlap.com', snippet: 'from e1', relevance_score: 0.7, engine: 'e1' }, - Network accessline 124
{ title: 'Unique E1', url: 'https://e1only.com', snippet: 'e1 only', relevance_score: 0.6, engine: 'e1' }, - Network accessline 128
name: 'e2', search: vi.fn().mockResolvedValue([ { title: 'Overlap Better', url: 'https://overlap.com', snippet: 'from e2 better', relevance_score: 0.9, engine: 'e2' }, - Network accessline 129
search: vi.fn().mockResolvedValue([ { title: 'Overlap Better', url: 'https://overlap.com', snippet: 'from e2 better', relevance_score: 0.9, engine: 'e2' }, ]), - Network accessline 130
{ title: 'Overlap Better', url: 'https://overlap.com', snippet: 'from e2 better', relevance_score: 0.9, engine: 'e2' },
tests/integration/research-local-tier.test.ts
- Executable scriptline 1
Executable file - Network accessline 69
const RESULTS: RawSearchResult[] = [ { title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'hooks', relevance_score: 0.95, engine: 'integration-stub' }, - Network accessline 70
{ title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'hooks', relevance_score: 0.95, engine: 'integration-stub' }, - Network accessline 71
{ title: 'Vue Composition API', url: 'https://vuejs.org/guide', snippet: 'vue', relevance_score: 0.88, engine: 'integration-stub' }, - Network accessline 87
it('returns a local-synthesized report with aligned [n] citations through handleResearch', async () => { vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', mod - Network accessline 88
vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto', }); - Network accessline 89
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto',
tests/integration/research.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
{ title: 'TypeScript Handbook - Generics', url: 'https://typescriptlang.org/docs/handbook/generics.html', - Network accessline 31
title: 'TypeScript Handbook - Generics', url: 'https://typescriptlang.org/docs/handbook/generics.html', snippet: 'Generics allow creating reusable components that work with multiple types.', - Network accessline 32
url: 'https://typescriptlang.org/docs/handbook/generics.html', - Network accessline 37
{ title: 'Understanding TypeScript Generics', url: 'https://blog.example.com/ts-generics', - Network accessline 38
title: 'Understanding TypeScript Generics', url: 'https://blog.example.com/ts-generics', snippet: 'A deep dive into TypeScript generics with practical examples.', - Network accessline 39
url: 'https://blog.example.com/ts-generics', - Network accessline 44
{ title: 'Advanced TypeScript Patterns', url: 'https://patterns.dev/typescript', - Network accessline 45
title: 'Advanced TypeScript Patterns', url: 'https://patterns.dev/typescript', snippet: 'Advanced patterns including conditional types and mapped types.', - Network accessline 46
url: 'https://patterns.dev/typescript', - Network accessline 51
{ title: 'TypeScript vs Flow', url: 'https://comparison.dev/ts-flow', - Network accessline 52
title: 'TypeScript vs Flow', url: 'https://comparison.dev/ts-flow', snippet: 'Comparing TypeScript and Flow type systems.', - Network accessline 53
url: 'https://comparison.dev/ts-flow', - Network accessline 58
{ title: 'TypeScript Performance Tips', url: 'https://perf.dev/typescript', - Network accessline 59
title: 'TypeScript Performance Tips', url: 'https://perf.dev/typescript', snippet: 'How to write performant TypeScript code.', - Network accessline 60
url: 'https://perf.dev/typescript', - Network accessline 170
} return Promise.resolve({ url: 'https://example.com', - Network accessline 171
return Promise.resolve({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 172
url: 'https://example.com', - Network accessline 173
finalUrl: 'https://example.com',
tests/integration/rest-api.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Network accessline 94
it('fetch happy path → 200 with documented top-level fields', async () => { const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }); - Network accessline 95
const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }); - Network accessline 129
it('oversized body → 413', async () => { process.env.WIGOLO_SERVE_MAX_BODY_BYTES = '20'; const r = await post(port, '/v1/fetch', { url: 'https://example.com/some/long/enough/path/to/exceed' }); - Network accessline 130
process.env.WIGOLO_SERVE_MAX_BODY_BYTES = '20'; const r = await post(port, '/v1/fetch', { url: 'https://example.com/some/long/enough/path/to/exceed' }); expect(r.status).toBe(413); - Network accessline 131
const r = await post(port, '/v1/fetch', { url: 'https://example.com/some/long/enough/path/to/exceed' }); - Network accessline 147
it('bad Host → 403', async () => { const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'evil.example.com' }); - Network accessline 148
const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'evil.example.com' }); - Network accessline 152
it('Origin header → 403 (before body eval)', async () => { const r = await request({ port, method: 'POST', path: '/v1/fetch', headers: { 'Content-Type': 'application/json', Origin: 'https://evil.com' }, body: '{bad json' }); - Network accessline 153
const r = await request({ port, method: 'POST', path: '/v1/fetch', headers: { 'Content-Type': 'application/json', Origin: 'https://evil.com' }, body: '{bad json' }); - Network accessline 201
it('no bearer on /v1 → 401', async () => { const r = await post(port, '/v1/fetch', { url: 'https://example.com' }); - Network accessline 202
const r = await post(port, '/v1/fetch', { url: 'https://example.com' }); - Network accessline 206
[Credential-related source omitted] - Network accessline 207
[Credential-related source omitted] - Network accessline 226
[Credential-related source omitted] - Network accessline 227
[Credential-related source omitted] - Access to secretsline 257
[Credential-related source omitted] - Network accessline 276
process.env.WIGOLO_SERVE_ALLOW_LOCAL_TARGETS = '1'; try { const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Network accessline 277
try { const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); expect(r.status).toBe(200); - Network accessline 278
const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Network accessline 285
it('Origin header still rejected in override mode → 403', async () => { const r = await post(port, '/v1/fetch', { url: 'https://example.com' }, { Host: 'my.remote.host', Origin: 'https://evil.com' }); - Network accessline 286
const r = await post(port, '/v1/fetch', { url: 'https://example.com' }, { Host: 'my.remote.host', Origin: 'https://evil.com' }); - Network accessline 290
it('serve-mode target guard: loopback target under non-loopback bind → 400', async () => { const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Network accessline 291
const r = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Access to secretsline 301
[Credential-related source omitted] - Network accessline 316
const slow = post(port, '/v1/search', { query: 'hold the slot open for a moment', search_depth: 'balanced' }); await new Promise((r) => setTimeout(r, 30)); const second = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${orig - Network accessline 318
const second = await post(port, '/v1/fetch', { url: `http://127.0.0.1:${originPort}/` });
tests/integration/rest-firecrawl-compat.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Network accessline 94
it('scrape → 404 when the flag is off', async () => { const r = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${originPort}/` }); - Network accessline 95
const r = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${originPort}/` }); - Network accessline 104
it('map → 404 when the flag is off', async () => { const r = await post(port, `${PREFIX}/v1/map`, { url: 'https://example.com' }); - Network accessline 105
const r = await post(port, `${PREFIX}/v1/map`, { url: 'https://example.com' }); - Network accessline 109
it('crawl → 404 when the flag is off', async () => { const r = await post(port, `${PREFIX}/v1/crawl`, { url: 'https://example.com' }); - Network accessline 110
const r = await post(port, `${PREFIX}/v1/crawl`, { url: 'https://example.com' }); - Access to secretsline 121
[Credential-related source omitted] - Network accessline 132
it('scrape → {success:true, data:{markdown, metadata:{sourceURL}}}', async () => { const r = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${originPort}/`, formats: ['markdown'] }, {}, 30000); - Network accessline 133
const r = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${originPort}/`, formats: ['markdown'] }, {}, 30000); - Network accessline 151
it('crawl lifecycle: POST → id, GET → status', async () => { const start = await post(port, `${PREFIX}/v1/crawl`, { url: `http://127.0.0.1:${originPort}/`, limit: 2 }, {}, 30000); - Network accessline 152
const start = await post(port, `${PREFIX}/v1/crawl`, { url: `http://127.0.0.1:${originPort}/`, limit: 2 }, {}, 30000); - Network accessline 176
it('crawl limit over-cap → 400 {success:false} with cap message', async () => { const r = await post(port, `${PREFIX}/v1/crawl`, { url: 'https://example.com', limit: 9999 }); - Network accessline 177
const r = await post(port, `${PREFIX}/v1/crawl`, { url: 'https://example.com', limit: 9999 }); - Network accessline 201
it('no bearer on shim scrape → 401 (auth runs before the shim)', async () => { const r = await post(port, `${PREFIX}/v1/scrape`, { url: 'https://example.com' }); - Network accessline 202
const r = await post(port, `${PREFIX}/v1/scrape`, { url: 'https://example.com' }); - Network accessline 206
[Credential-related source omitted] - Network accessline 207
[Credential-related source omitted] - Access to secretsline 232
[Credential-related source omitted] - Network accessline 256
const inflight = [ post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${slowPort}/a` }, {}, 30000), - Network accessline 257
post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${slowPort}/a` }, {}, 30000), - Network accessline 258
post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${slowPort}/b` }, {}, 30000), - Network accessline 264
const over = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${slowPort}/c` }, {}, 30000); - Network accessline 273
const after = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${slowPort}/d` }, {}, 30000); - Access to secretsline 292
[Credential-related source omitted] - Network accessline 310
it('slow shim scrape → 504 route_timeout; slot stays held (next request → 429)', async () => { const first = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${hangPort}/hang` }, {}, 30000); - Network accessline 311
const first = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${hangPort}/hang` }, {}, 30000); - Network accessline 316
const second = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${hangPort}/hang2` }, {}, 30000); - Access to secretsline 327
[Credential-related source omitted] - Network accessline 346
it('loopback-target scrape under a non-loopback bind → 400 {success:false}', async () => { const r = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Network accessline 347
const r = await post(port, `${PREFIX}/v1/scrape`, { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' });
tests/integration/rest-tools.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Network accessline 99
it('crawl → 200 with pages[]', async () => { const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 3, max_depth: 1 }, {}, 60000); - Network accessline 100
const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 3, max_depth: 1 }, {}, 60000); - Network accessline 125
it('extract → 200 with data + warnings surface', async () => { const r = await post(port, '/v1/extract', { url: `http://127.0.0.1:${originPort}/`, mode: 'metadata' }, {}, 40000); - Network accessline 126
const r = await post(port, '/v1/extract', { url: `http://127.0.0.1:${originPort}/`, mode: 'metadata' }, {}, 40000); - Network accessline 157
it('agent → 200 with steps[]', async () => { const r = await post(port, '/v1/agent', { prompt: 'summarize the origin page', urls: [`http://127.0.0.1:${originPort}/`], max_time_ms: 20000, max_pages: 2 }, {}, 60000); - Network accessline 158
const r = await post(port, '/v1/agent', { prompt: 'summarize the origin page', urls: [`http://127.0.0.1:${originPort}/`], max_time_ms: 20000, max_pages: 2 }, {}, 60000); - Network accessline 176
const r = await post(port, '/v1/watch', { action: 'create', url: 'https://example.com/watched', interval_seconds: 3600 }, {}, 40000); - Access to secretsline 196
[Credential-related source omitted] - Network accessline 205
it('crawl SSRF-refused seed (metadata) → 400 (in-band-error adapter path)', async () => { const r = await post(port, '/v1/crawl', { url: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 206
const r = await post(port, '/v1/crawl', { url: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 216
it('extract metadata-IP target → 400', async () => { const r = await post(port, '/v1/extract', { url: 'http://169.254.169.254/', mode: 'metadata' }); - Network accessline 217
const r = await post(port, '/v1/extract', { url: 'http://169.254.169.254/', mode: 'metadata' }); - Network accessline 226
it('watch metadata url → 400', async () => { const r = await post(port, '/v1/watch', { action: 'create', url: 'http://169.254.169.254/' }); - Network accessline 227
const r = await post(port, '/v1/watch', { action: 'create', url: 'http://169.254.169.254/' }); - Network accessline 231
it('find_similar metadata url → 400', async () => { const r = await post(port, '/v1/find_similar', { url: 'http://169.254.169.254/latest/' }); - Network accessline 232
const r = await post(port, '/v1/find_similar', { url: 'http://169.254.169.254/latest/' }); - Access to secretsline 242
[Credential-related source omitted] - Network accessline 251
it('crawl max_pages=201 (over cap 200) → 400 with cap in hint', async () => { const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 201 }); - Network accessline 252
const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 201 }); - Network accessline 262
const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 200, max_depth: 1 }, {}, 60000); - Access to secretsline 272
[Credential-related source omitted] - Network accessline 286
it('crawl loopback target under non-loopback bind → 400', async () => { const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Network accessline 287
const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/` }, { Host: 'my.remote.host' }); - Network accessline 292
process.env.WIGOLO_SERVE_ALLOW_LOCAL_TARGETS = '1'; try { const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 2, max_depth: 1 }, { Host: 'my.remote.host' }, 60000); - Network accessline 293
try { const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 2, max_depth: 1 }, { Host: 'my.remote.host' }, 60000); expect(r.status).toBe(200); - Network accessline 294
const r = await post(port, '/v1/crawl', { url: `http://127.0.0.1:${originPort}/`, max_pages: 2, max_depth: 1 }, { Host: 'my.remote.host' }, 60000);
tests/integration/router-stealth.test.ts
- Executable scriptline 1
Executable file - Network accessline 4
describe('SmartRouter stealth mode', () => { it('escalates to Playwright when static fetch returns < 500 chars', async () => { const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); - Network accessline 5
it('escalates to Playwright when static fetch returns < 500 chars', async () => { const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); const fakePw = vi.fn(async () => ({ html: '<html><b - Network accessline 6
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); - Network accessline 7
const fakePw = vi.fn(async () => ({ html: '<html><body>'.padEnd(2000, 'x') + '</body></html>', text: 'x'.repeat(2000) })); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = - Network accessline 8
const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' }); expect(fakePw).toHaveBeenCalledOnce(); - Network accessline 9
const out = await r.fetch('https://x', { mode: 'stealth' }); - Network accessline 14
it('returns playwright_not_installed StageError when stealth requested but missing', async () => { const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); - Network accessline 15
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); - Network accessline 16
const fakePw = vi.fn(async () => { const e = new Error('playwright_not_installed') as any; e.hint = 'npx playwright install chromium'; throw e; }); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as - Network accessline 17
const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' }); expect((out as any).error).toBe('playwright_not_installed'); - Network accessline 18
const out = await r.fetch('https://x', { mode: 'stealth' }); - Network accessline 23
it('does NOT escalate when static body is substantial (shouldEscalate=false)', async () => { const fakeStatic = vi.fn(async () => ({ url: 'https://x', - Network accessline 24
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html><body>' + 'a'.repeat(2000) + '</body></html>', - Network accessline 25
url: 'https://x', - Network accessline 29
const fakePw = vi.fn(async () => ({ html: 'should-not-be-called', text: 'should-not-be-called' })); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https:// - Network accessline 30
const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' }); expect(fakePw).not.toHaveBeenCalled(); - Network accessline 31
const out = await r.fetch('https://x', { mode: 'stealth' }); - Network accessline 36
it('returns playwright_fetch_failed StageError when playwright throws non-install error', async () => { const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); - Network accessline 37
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: '<html></html>', text: 'tiny' })); - Network accessline 38
const fakePw = vi.fn(async () => { throw new Error('navigation_timeout'); }); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' - Network accessline 39
const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' }); expect((out as any).error).toBe('playwright_fetch_failed'); - Network accessline 40
const out = await r.fetch('https://x', { mode: 'stealth' }); - Network accessline 50
'<div class="dd-loader"></div>Please enable JavaScript to continue.' + 'x'.repeat(1000) + '</body></html>'; const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text: 'Please enable JavaScript to continue. ' + 'x - Network accessline 51
'x'.repeat(1000) + '</body></html>'; const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text: 'Please enable JavaScript to continue. ' + 'x'.repeat(1000) })); const fakePw = vi.fn(async () => ({ html: '<html><bod - Network accessline 52
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text: 'Please enable JavaScript to continue. ' + 'x'.repeat(1000) })); - Network accessline 53
const fakePw = vi.fn(async () => ({ html: '<html><body>' + 'real content '.repeat(200) + '</body></html>', text: 'real content '.repeat(200) })); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as a - Network accessline 54
const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' }); expect(fakePw).toHaveBeenCalledOnce(); - Network accessline 55
const out = await r.fetch('https://x', { mode: 'stealth' }); - Network accessline 69
const text = 'Just a moment while we verify your browser. '.repeat(20); const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text })); - Network accessline 70
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text })); - Network accessline 71
const fakePw = vi.fn(async () => ({ html: '<html><body>' + 'real content '.repeat(200) + '</body></html>', text: 'real content '.repeat(200) })); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as a - Network accessline 72
const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await r.fetch('https://x', { mode: 'stealth' }); expect(fakePw).toHaveBeenCalledOnce(); - Network accessline 73
const out = await r.fetch('https://x', { mode: 'stealth' }); - Network accessline 81
const shell = '<html><head><title>Just a moment...</title></head><body>' + '<div class="cf-browser-verification"></div></body></html>'; const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text: 'Just a moment... - Network accessline 82
'<div class="cf-browser-verification"></div></body></html>'; const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text: 'Just a moment...' })); const fakePw = vi.fn(async () => { const e = new Error('playwright_not - Network accessline 83
const fakeStatic = vi.fn(async () => ({ url: 'https://x', html: shell, text: 'Just a moment...' })); - Network accessline 84
const fakePw = vi.fn(async () => { const e = new Error('playwright_not_installed') as any; e.hint = 'x'; throw e; }); const r = new SmartRouter({ httpFetcher: fakeStatic as any, playwrightFetcher: fakePw as any }); const out = await - Network accessline 86
const out = await r.fetch('https://x', { mode: 'stealth' });
tests/integration/schema-extract-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 49
const addr = server.address(); if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); - Network accessline 50
if (typeof addr === 'object' && addr) { resolve(`http://localhost:${addr.port}`); } - Network accessline 51
resolve(`http://localhost:${addr.port}`);
tests/integration/search-adapter-quality.test.ts
- Executable scriptline 1
Executable file - Network accessline 101
const { calls, restore } = installFetch([ { match: (u) => u.startsWith('https://lobste.rs/search.json'), body: [] }, - Network accessline 102
{ match: (u) => u.startsWith('https://lobste.rs/search.json'), body: [] }, - Network accessline 105
{ match: (u) => u.startsWith('https://hn.algolia.com/'), body: { hits: [] } }, - Network accessline 106
{ match: (u) => u.startsWith('https://www.bing.com/search'), text: '<html></html>' }, - Network accessline 119
const lobstersCall = calls.find((c) => c.url.startsWith('https://lobste.rs/search.json')); - Access to secretsline 127
[Credential-related source omitted] - Network accessline 130
const { calls, restore } = installFetch([ { match: (u) => u.startsWith('https://api.github.com/search/code'), body: { items: [] } }, - Network accessline 131
{ match: (u) => u.startsWith('https://api.github.com/search/code'), body: { items: [] } }, - Network accessline 133
{ match: (u) => u.startsWith('https://api.stackexchange.com/'), body: { items: [] } }, - Network accessline 134
{ match: (u) => u.startsWith('https://developer.mozilla.org/api/v1/search'), body: { documents: [] } }, - Network accessline 135
{ match: (u) => u.startsWith('https://lite.duckduckgo.com/'), text: '<html></html>' }, - Network accessline 148
const ghCall = calls.find((c) => c.url.startsWith('https://api.github.com/search/code'));
tests/integration/search-answer.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
{ title: 'React Server Components', url: 'https://react.dev/reference/rsc/server-components', - Network accessline 54
title: 'React Server Components', url: 'https://react.dev/reference/rsc/server-components', snippet: 'React Server Components render ahead of time.', - Network accessline 55
url: 'https://react.dev/reference/rsc/server-components', - Network accessline 60
{ title: 'Understanding RSC', url: 'https://vercel.com/blog/understanding-rsc', - Network accessline 61
title: 'Understanding RSC', url: 'https://vercel.com/blog/understanding-rsc', snippet: 'RSC enables a new mental model for React apps.', - Network accessline 62
url: 'https://vercel.com/blog/understanding-rsc', - Network accessline 67
{ title: 'RSC Deep Dive', url: 'https://blog.example.com/rsc-deep-dive', - Network accessline 68
title: 'RSC Deep Dive', url: 'https://blog.example.com/rsc-deep-dive', snippet: 'Comprehensive deep dive into RSC architecture.', - Network accessline 69
url: 'https://blog.example.com/rsc-deep-dive', - Network accessline 77
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev', - Network accessline 78
fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev', finalUrl: 'https://react.dev', - Network accessline 79
url: 'https://react.dev', - Network accessline 80
finalUrl: 'https://react.dev', - Network accessline 216
if (citationUrls.length >= 1) { expect(citationUrls[0]).toBe('https://react.dev/reference/rsc/server-components'); - Network accessline 217
expect(citationUrls[0]).toBe('https://react.dev/reference/rsc/server-components'); - Network accessline 218
} if (citationUrls.length >= 2) { expect(citationUrls[1]).toBe('https://vercel.com/blog/understanding-rsc'); - Network accessline 219
if (citationUrls.length >= 2) { expect(citationUrls[1]).toBe('https://vercel.com/blog/understanding-rsc'); } - Network accessline 220
expect(citationUrls[1]).toBe('https://vercel.com/blog/understanding-rsc');
tests/integration/search-depth.test.ts
- Executable scriptline 1
Executable file - Network accessline 71
it('ultra-fast on cache miss returns empty results with notice and does not call engines', async () => { const spy = vi.fn(async (_q: string, _opts?: SearchEngineOptions) => [ makeResult('bing', 'https://example.com/a'), - Network accessline 72
const spy = vi.fn(async (_q: string, _opts?: SearchEngineOptions) => [ makeResult('bing', 'https://example.com/a'), ]); - Network accessline 73
makeResult('bing', 'https://example.com/a'), - Network accessline 88
it('fast skips content fetch even when ctx.router is present', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 89
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 90
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 104
it('balanced is the default behaviour (no special branch)', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 105
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 106
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]),
tests/integration/search-evidence-default.test.ts
- Executable scriptline 1
Executable file - Network accessline 38
{ title: 'Rust Async Guide', url: 'https://rust-lang.org/async', - Network accessline 39
title: 'Rust Async Guide', url: 'https://rust-lang.org/async', snippet: 'Rust async functions return futures evaluated lazily.', - Network accessline 40
url: 'https://rust-lang.org/async', - Network accessline 45
{ title: 'Tokio Runtime', url: 'https://tokio.rs/', - Network accessline 46
title: 'Tokio Runtime', url: 'https://tokio.rs/', snippet: 'Tokio is an async runtime for the Rust programming language.', - Network accessline 47
url: 'https://tokio.rs/', - Network accessline 55
const stubRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://rust-lang.org/async', - Network accessline 56
fetch: vi.fn().mockResolvedValue({ url: 'https://rust-lang.org/async', finalUrl: 'https://rust-lang.org/async', - Network accessline 57
url: 'https://rust-lang.org/async', - Network accessline 58
finalUrl: 'https://rust-lang.org/async',
tests/integration/search-filtering-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 120
const searxng = makeEntry('searxng', [ makeResult('searxng', 'https://react.dev/learn', 0.95), - Network accessline 121
makeResult('searxng', 'https://react.dev/learn', 0.95), - Network accessline 122
makeResult('searxng', 'https://react.dev/blog', 0.85), - Network accessline 123
makeResult('searxng', 'https://medium.com/react', 0.8), - Network accessline 124
makeResult('searxng', 'https://github.com/facebook/react', 0.75), - Network accessline 125
makeResult('searxng', 'https://stackoverflow.com/q/react', 0.7), - Network accessline 126
]); const ddg = makeEntry('duckduckgo', [ makeResult('duckduckgo', 'https://react.dev/learn', 0.9), - Network accessline 127
const ddg = makeEntry('duckduckgo', [ makeResult('duckduckgo', 'https://react.dev/learn', 0.9), makeResult('duckduckgo', 'https://w3schools.com/react', 0.65), - Network accessline 128
makeResult('duckduckgo', 'https://react.dev/learn', 0.9), - Network accessline 129
makeResult('duckduckgo', 'https://w3schools.com/react', 0.65), - Network accessline 130
makeResult('duckduckgo', 'https://dev.to/react-guide', 0.6), - Network accessline 172
it('full pipeline: exclude_domains removes results after dedup', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/a', 0.9), - Network accessline 173
const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/a', 0.9), makeResult('bing', 'https://medium.com/b', 0.8), - Network accessline 174
makeResult('bing', 'https://react.dev/a', 0.9), - Network accessline 175
makeResult('bing', 'https://medium.com/b', 0.8), - Network accessline 176
makeResult('bing', 'https://medium.com/c', 0.7), - Network accessline 177
makeResult('bing', 'https://github.com/d', 0.6), - Network accessline 192
it('full pipeline: combined include + date filters keep subdomain matches', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://docs.react.dev/a', 0.9), - Network accessline 193
const eng = makeEntry('bing', [ makeResult('bing', 'https://docs.react.dev/a', 0.9), makeResult('bing', 'https://blog.react.dev/b', 0.8), - Network accessline 194
makeResult('bing', 'https://docs.react.dev/a', 0.9), - Network accessline 195
makeResult('bing', 'https://blog.react.dev/b', 0.8), - Network accessline 196
makeResult('bing', 'https://stackoverflow.com/c', 0.7), - Network accessline 228
it('full pipeline: no filters applied preserves all results', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/a', 0.9), - Network accessline 229
const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/a', 0.9), makeResult('bing', 'https://medium.com/b', 0.8), - Network accessline 230
makeResult('bing', 'https://react.dev/a', 0.9), - Network accessline 231
makeResult('bing', 'https://medium.com/b', 0.8), - Network accessline 232
makeResult('bing', 'https://github.com/c', 0.7), - Network accessline 253
const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/1', 0.9), - Network accessline 254
makeResult('bing', 'https://react.dev/1', 0.9), - Network accessline 255
makeResult('bing', 'https://react.dev/2', 0.85), - Network accessline 256
makeResult('bing', 'https://react.dev/3', 0.8), - Network accessline 257
makeResult('bing', 'https://react.dev/4', 0.75), - Network accessline 258
makeResult('bing', 'https://medium.com/x', 0.7),
tests/integration/search-format-answer-empty.test.ts
- Executable scriptline 1
Executable file
tests/integration/search-format-answer-slim.test.ts
- Executable scriptline 1
Executable file - Network accessline 46
{ title: 'React Server Components', url: 'https://react.dev/reference/rsc/server-components', - Network accessline 47
title: 'React Server Components', url: 'https://react.dev/reference/rsc/server-components', snippet: 'React Server Components render ahead of time.', - Network accessline 48
url: 'https://react.dev/reference/rsc/server-components', - Network accessline 53
{ title: 'Understanding RSC', url: 'https://vercel.com/blog/understanding-rsc', - Network accessline 54
title: 'Understanding RSC', url: 'https://vercel.com/blog/understanding-rsc', snippet: 'RSC enables a new mental model for React apps.', - Network accessline 55
url: 'https://vercel.com/blog/understanding-rsc', - Network accessline 63
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev', - Network accessline 64
fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev', finalUrl: 'https://react.dev', - Network accessline 65
url: 'https://react.dev', - Network accessline 66
finalUrl: 'https://react.dev',
tests/integration/search-language-filter.test.ts
- Executable scriptline 1
Executable file - Network accessline 11
fanOutSearch: vi.fn(async () => ({ results: [ { url: 'https://example.com/a', title: 'PostgreSQL replication', snippet: 'WAL streaming guide', engine: 'bing' }, - Network accessline 12
results: [ { url: 'https://example.com/a', title: 'PostgreSQL replication', snippet: 'WAL streaming guide', engine: 'bing' }, { url: 'https://baidu.com/x', title: '人工智能教程', snippet: '本文介绍人工智能基础', engine: 'bing' }, - Network accessline 13
{ url: 'https://example.com/a', title: 'PostgreSQL replication', snippet: 'WAL streaming guide', engine: 'bing' }, - Network accessline 14
{ url: 'https://baidu.com/x', title: '人工智能教程', snippet: '本文介绍人工智能基础', engine: 'bing' }, - Network accessline 15
{ url: 'https://baidu.com/y', title: '深度学习', snippet: '神经网络的实现细节', engine: 'bing' }, - Network accessline 16
{ url: 'https://baidu.com/z', title: '机器学习入门', snippet: '基础算法和模型详解', engine: 'bing' },
tests/integration/search-legacy-parity.test.ts
- Executable scriptline 1
Executable file
tests/integration/search-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 45
name: 'test-engine', search: async () => [ { title: 'Test', url: `http://127.0.0.1:${contentPort}/page1`, snippet: 'A test page', relevance_score: 0.9, engine: 'test-engine' }, - Network accessline 46
search: async () => [ { title: 'Test', url: `http://127.0.0.1:${contentPort}/page1`, snippet: 'A test page', relevance_score: 0.9, engine: 'test-engine' }, { title: 'Test 2', url: `http://127.0.0.1:${contentPort}/page2`, sni - Network accessline 47
{ title: 'Test', url: `http://127.0.0.1:${contentPort}/page1`, snippet: 'A test page', relevance_score: 0.9, engine: 'test-engine' }, - Network accessline 48
{ title: 'Test 2', url: `http://127.0.0.1:${contentPort}/page2`, snippet: 'Another page', relevance_score: 0.7, engine: 'test-engine' }, - Network accessline 76
name: 'e1', search: async () => [ { title: 'Same Page', url: `http://127.0.0.1:${contentPort}/shared`, snippet: 'From engine 1', relevance_score: 0.8, engine: 'e1' }, - Network accessline 77
search: async () => [ { title: 'Same Page', url: `http://127.0.0.1:${contentPort}/shared`, snippet: 'From engine 1', relevance_score: 0.8, engine: 'e1' }, ], - Network accessline 78
{ title: 'Same Page', url: `http://127.0.0.1:${contentPort}/shared`, snippet: 'From engine 1', relevance_score: 0.8, engine: 'e1' }, - Network accessline 82
name: 'e2', search: async () => [ { title: 'Same Page', url: `http://127.0.0.1:${contentPort}/shared`, snippet: 'From engine 2', relevance_score: 0.6, engine: 'e2' }, - Network accessline 83
search: async () => [ { title: 'Same Page', url: `http://127.0.0.1:${contentPort}/shared`, snippet: 'From engine 2', relevance_score: 0.6, engine: 'e2' }, ], - Network accessline 84
{ title: 'Same Page', url: `http://127.0.0.1:${contentPort}/shared`, snippet: 'From engine 2', relevance_score: 0.6, engine: 'e2' }, - Network accessline 113
name: 'good', search: async () => [ { title: 'OK', url: `http://127.0.0.1:${contentPort}/ok`, snippet: 'Works', relevance_score: 0.9, engine: 'good' }, - Network accessline 114
search: async () => [ { title: 'OK', url: `http://127.0.0.1:${contentPort}/ok`, snippet: 'Works', relevance_score: 0.9, engine: 'good' }, ], - Network accessline 115
{ title: 'OK', url: `http://127.0.0.1:${contentPort}/ok`, snippet: 'Works', relevance_score: 0.9, engine: 'good' },
tests/integration/search-rerank-fold.test.ts
- Executable scriptline 1
Executable file - Network accessline 72
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://off.example.com', 'OFFTOPIC uniqq', 'unrelated filler uniqq'), - Network accessline 73
makeEntry('bing', [ makeResult('bing', 'https://off.example.com', 'OFFTOPIC uniqq', 'unrelated filler uniqq'), makeResult('bing', 'https://on.example.com', 'ONTOPIC uniqq', 'the actual answer uniqq'), - Network accessline 74
makeResult('bing', 'https://off.example.com', 'OFFTOPIC uniqq', 'unrelated filler uniqq'), - Network accessline 75
makeResult('bing', 'https://on.example.com', 'ONTOPIC uniqq', 'the actual answer uniqq'), - Network accessline 115
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://junk.example/jp', 'driving school reservation lessons', 'pricing and hours'), - Network accessline 116
makeEntry('bing', [ makeResult('bing', 'https://junk.example/jp', 'driving school reservation lessons', 'pricing and hours'), ]), - Network accessline 117
makeResult('bing', 'https://junk.example/jp', 'driving school reservation lessons', 'pricing and hours'), - Network accessline 143
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://k8s.example/ingress', 'kubernetes ingress controller setup', 'configure kubernetes ingress controller'), - Network accessline 144
makeEntry('bing', [ makeResult('bing', 'https://k8s.example/ingress', 'kubernetes ingress controller setup', 'configure kubernetes ingress controller'), ]), - Network accessline 145
makeResult('bing', 'https://k8s.example/ingress', 'kubernetes ingress controller setup', 'configure kubernetes ingress controller'), - Network accessline 158
expect(out.ok).toBe(true); if (!out.ok) return; expect(out.data.results.map((r) => r.url)).toContain('https://k8s.example/ingress'); - Network accessline 159
if (!out.ok) return; expect(out.data.results.map((r) => r.url)).toContain('https://k8s.example/ingress'); expect(out.data.engine_pool?.reasons ?? []).not.toContain('no_lexical_match'); - Network accessline 160
expect(out.data.results.map((r) => r.url)).toContain('https://k8s.example/ingress'); - Network accessline 167
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://junk.example/jp', 'driving school reservation lessons', 'pricing and hours'), - Network accessline 168
makeEntry('bing', [ makeResult('bing', 'https://junk.example/jp', 'driving school reservation lessons', 'pricing and hours'), ]), - Network accessline 169
makeResult('bing', 'https://junk.example/jp', 'driving school reservation lessons', 'pricing and hours'), - Network accessline 170
]), makeEntry('ddg', [ makeResult('ddg', 'https://other.example/y', 'unrelated topic page here', 'more filler'), - Network accessline 171
makeEntry('ddg', [ makeResult('ddg', 'https://other.example/y', 'unrelated topic page here', 'more filler'), ]), - Network accessline 172
makeResult('ddg', 'https://other.example/y', 'unrelated topic page here', 'more filler'), - Network accessline 199
expect(out.ok).toBe(true); if (!out.ok) return; expect(out.data.results[0].url).toBe('https://on.example.com'); // fold flipped it to top - Network accessline 200
if (!out.ok) return; expect(out.data.results[0].url).toBe('https://on.example.com'); // fold flipped it to top expect(out.data.results[0].evidence_score?.components.cross_encoder).toBeDefined(); - Network accessline 201
expect(out.data.results[0].url).toBe('https://on.example.com'); // fold flipped it to top - Network accessline 211
expect(out.ok).toBe(true); if (!out.ok) return; expect(out.data.results[0].url).toBe('https://off.example.com'); // composite order preserved - Network accessline 212
if (!out.ok) return; expect(out.data.results[0].url).toBe('https://off.example.com'); // composite order preserved for (const r of out.data.results) { - Network accessline 213
expect(out.data.results[0].url).toBe('https://off.example.com'); // composite order preserved - Network accessline 226
expect(out.ok).toBe(true); if (!out.ok) return; expect(out.data.results[0].url).toBe('https://off.example.com'); // fold skipped - Network accessline 227
if (!out.ok) return; expect(out.data.results[0].url).toBe('https://off.example.com'); // fold skipped for (const r of out.data.results) { - Network accessline 228
expect(out.data.results[0].url).toBe('https://off.example.com'); // fold skipped
tests/integration/search-rerank-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 47
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'TypeScript Handbook', url: 'https://ts.dev/handbook', snippet: 'The official handbook', relevance_score: 0.9, engine: 'mock' }, - Network accessline 48
search: vi.fn().mockResolvedValue([ { title: 'TypeScript Handbook', url: 'https://ts.dev/handbook', snippet: 'The official handbook', relevance_score: 0.9, engine: 'mock' }, { title: 'TypeScript Wikipedia', url: 'https://en.wiki - Network accessline 49
{ title: 'TypeScript Handbook', url: 'https://ts.dev/handbook', snippet: 'The official handbook', relevance_score: 0.9, engine: 'mock' }, - Network accessline 50
{ title: 'TypeScript Wikipedia', url: 'https://en.wikipedia.org/typescript', snippet: 'Wikipedia article', relevance_score: 0.7, engine: 'mock' }, - Network accessline 51
{ title: 'TS Config Reference', url: 'https://ts.dev/tsconfig', snippet: 'TSConfig options', relevance_score: 0.5, engine: 'mock' }, - Network accessline 52
{ title: 'JS vs TS Blog Post', url: 'https://blog.dev/js-vs-ts', snippet: 'Comparison blog', relevance_score: 0.3, engine: 'mock' }, - Network accessline 56
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://ts.dev/handbook', - Network accessline 57
fetch: vi.fn().mockResolvedValue({ url: 'https://ts.dev/handbook', finalUrl: 'https://ts.dev/handbook', - Network accessline 58
url: 'https://ts.dev/handbook', - Network accessline 59
finalUrl: 'https://ts.dev/handbook',
tests/integration/search-s11c-ranking.test.ts
- Executable scriptline 1
Executable file - Network accessline 101
makeEntry( 'low', [makeResult('low', 'https://low.test/x', 'low title', 'arbitrary body')], - Network accessline 102
'low', [makeResult('low', 'https://low.test/x', 'low title', 'arbitrary body')], { quality: 'low' }, - Network accessline 103
[makeResult('low', 'https://low.test/x', 'low title', 'arbitrary body')], - Network accessline 106
makeEntry( 'high', [makeResult('high', 'https://high.test/x', 'high title', 'arbitrary body')], - Network accessline 107
'high', [makeResult('high', 'https://high.test/x', 'high title', 'arbitrary body')], { quality: 'high' }, - Network accessline 108
[makeResult('high', 'https://high.test/x', 'high title', 'arbitrary body')], - Network accessline 122
const urls = result.data.results.map((r) => r.url); const highIdx = urls.indexOf('https://high.test/x'); - Network accessline 123
const highIdx = urls.indexOf('https://high.test/x'); - Network accessline 124
const lowIdx = urls.indexOf('https://low.test/x'); - Network accessline 145
return [makeResult('mock', 'https://result.test/a', 'a', 'body')]; - Network accessline 148
return [ makeResult('mock', 'https://result.test/b', 'b', 'body'), - Network accessline 149
makeResult('mock', 'https://result.test/b', 'b', 'body'), - Network accessline 150
makeResult('mock', 'https://result.test/c', 'c', 'body'), - Network accessline 151
makeResult('mock', 'https://result.test/d', 'd', 'body'), - Network accessline 186
callCount += 1; return [ makeResult('mock', 'https://r.test/1', '1', 'body'), - Network accessline 187
return [ makeResult('mock', 'https://r.test/1', '1', 'body'), makeResult('mock', 'https://r.test/2', '2', 'body'), - Network accessline 188
makeResult('mock', 'https://r.test/1', '1', 'body'), - Network accessline 189
makeResult('mock', 'https://r.test/2', '2', 'body'), - Network accessline 190
makeResult('mock', 'https://r.test/3', '3', 'body'), - Network accessline 191
makeResult('mock', 'https://r.test/4', '4', 'body'), - Network accessline 192
makeResult('mock', 'https://r.test/5', '5', 'body'), - Network accessline 226
return [makeResult('mock', 'https://r.test/lonely', 'a', 'body')]; - Network accessline 245
verticalState.general = [ makeEntry('a', [ makeResult('a', 'https://foo.test/x?utm_source=alpha', 'page x', 'body'), - Network accessline 246
makeEntry('a', [ makeResult('a', 'https://foo.test/x?utm_source=alpha', 'page x', 'body'), ]), - Network accessline 247
makeResult('a', 'https://foo.test/x?utm_source=alpha', 'page x', 'body'), - Network accessline 248
]), makeEntry('b', [ makeResult('b', 'https://foo.test/x', 'page x', 'body'), - Network accessline 249
makeEntry('b', [ makeResult('b', 'https://foo.test/x', 'page x', 'body'), ]), - Network accessline 250
makeResult('b', 'https://foo.test/x', 'page x', 'body'), - Network accessline 267
verticalState.general = [ makeEntry('a', [ makeResult('a', 'https://foo.test/amp/x', 'amp', 'body'), - Network accessline 268
makeEntry('a', [ makeResult('a', 'https://foo.test/amp/x', 'amp', 'body'), ]), - Network accessline 269
makeResult('a', 'https://foo.test/amp/x', 'amp', 'body'), - Network accessline 270
]), makeEntry('b', [ makeResult('b', 'http://m.foo.test/x/', 'mobile', 'body'), - Network accessline 271
makeEntry('b', [ makeResult('b', 'http://m.foo.test/x/', 'mobile', 'body'), ]), - Network accessline 272
makeResult('b', 'http://m.foo.test/x/', 'mobile', 'body'), - Network accessline 273
]), makeEntry('c', [ makeResult('c', 'https://www.foo.test/x', 'desktop', 'body'), - Network accessline 274
makeEntry('c', [ makeResult('c', 'https://www.foo.test/x', 'desktop', 'body'), ]), - Network accessline 275
makeResult('c', 'https://www.foo.test/x', 'desktop', 'body'), - Network accessline 292
verticalState.general = [ makeEntry('a', [ makeResult('a', 'https://foo.test/x', 'x', 'body'), - Network accessline 293
makeEntry('a', [ makeResult('a', 'https://foo.test/x', 'x', 'body'), makeResult('a', 'https://foo.test/y', 'y', 'body'), - Network accessline 294
makeResult('a', 'https://foo.test/x', 'x', 'body'), - Network accessline 295
makeResult('a', 'https://foo.test/y', 'y', 'body'),
tests/integration/search-v1-context.test.ts
- Executable scriptline 1
Executable file - Network accessline 69
const BING_HTML = `<html><body> <li class="b_algo"> <h2><a href="https://example-a.test/page">React Hooks Guide</a></h2> - Network accessline 70
<li class="b_algo"> <h2><a href="https://example-a.test/page">React Hooks Guide</a></h2> <div class="b_caption"><p>Comprehensive guide to React hooks.</p></div> - Network accessline 71
<h2><a href="https://example-a.test/page">React Hooks Guide</a></h2> - Network accessline 74
</body></html>`; const DDG_HTML = `<html><body> <a class="result-link" href="https://example-b.test/page">Vue Composition API</a> - Network accessline 75
const DDG_HTML = `<html><body> <a class="result-link" href="https://example-b.test/page">Vue Composition API</a> <div class="result-snippet">Reference for the Vue composition API.</div> - Network accessline 76
<a class="result-link" href="https://example-b.test/page">Vue Composition API</a> - Network accessline 142
embedState.provider = makeBiasedProvider('https://example-b.test/page'); - Network accessline 153
if (!result.ok) return; expect(result.data.results.length).toBeGreaterThan(0); expect(result.data.results[0].url).toBe('https://example-b.test/page'); - Network accessline 154
expect(result.data.results.length).toBeGreaterThan(0); expect(result.data.results[0].url).toBe('https://example-b.test/page'); }); - Network accessline 155
expect(result.data.results[0].url).toBe('https://example-b.test/page'); - Network accessline 167
query: 'frontend frameworks', max_results: 5, agent_context: { recent_urls: ['https://example-a.test/page'] }, - Network accessline 168
max_results: 5, agent_context: { recent_urls: ['https://example-a.test/page'] }, }; - Network accessline 169
agent_context: { recent_urls: ['https://example-a.test/page'] }, - Network accessline 174
if (!result.ok) return; const urls = result.data.results.map((r) => r.url); expect(urls).not.toContain('https://example-a.test/page'); - Network accessline 175
const urls = result.data.results.map((r) => r.url); expect(urls).not.toContain('https://example-a.test/page'); expect(urls).toContain('https://example-b.test/page'); - Network accessline 176
expect(urls).not.toContain('https://example-a.test/page'); - Network accessline 177
expect(urls).toContain('https://example-b.test/page'); - Network accessline 188
embedState.provider = makeBiasedProvider('https://example-a.test/page'); - Network accessline 194
agent_context: { text: 'React hooks examples', recent_urls: ['https://example-a.test/page'], - Network accessline 195
text: 'React hooks examples', recent_urls: ['https://example-a.test/page'], }, - Network accessline 196
recent_urls: ['https://example-a.test/page'], - Network accessline 202
if (!result.ok) return; const urls = result.data.results.map((r) => r.url); expect(urls).not.toContain('https://example-a.test/page'); - Network accessline 203
const urls = result.data.results.map((r) => r.url); expect(urls).not.toContain('https://example-a.test/page'); expect(urls).toContain('https://example-b.test/page'); - Network accessline 204
expect(urls).not.toContain('https://example-a.test/page'); - Network accessline 205
expect(urls).toContain('https://example-b.test/page'); - Network accessline 251
{ match: (u) => u.includes('wikipedia.org'), body: WIKI_EMPTY }, ]); embedState.provider = makeBiasedProvider('https://example-b.test/page'); - Network accessline 253
embedState.provider = makeBiasedProvider('https://example-b.test/page'); - Network accessline 263
expect(result.ok).toBe(true); if (!result.ok) return; expect(result.data.results[0].url).toBe('https://example-b.test/page'); - Network accessline 264
if (!result.ok) return; expect(result.data.results[0].url).toBe('https://example-b.test/page'); }); - Network accessline 265
expect(result.data.results[0].url).toBe('https://example-b.test/page');
tests/integration/search-v1-pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 27
objectID: '1', title: 'HN story', url: 'https://hn.example.test/a', - Network accessline 28
title: 'HN story', url: 'https://hn.example.test/a', story_text: null, - Network accessline 29
url: 'https://hn.example.test/a', - Network accessline 37
name: 'foo.ts', path: 'src/foo.ts', html_url: 'https://github.example.test/foo', - Network accessline 38
path: 'src/foo.ts', html_url: 'https://github.example.test/foo', repository: { full_name: 'acme/foo', description: 'tooling' }, - Network accessline 39
html_url: 'https://github.example.test/foo', - Network accessline 43
const SO_ITEM = { title: 'How to async iterator', link: 'https://stackoverflow.example.test/q/1', - Network accessline 44
title: 'How to async iterator', link: 'https://stackoverflow.example.test/q/1', body: '<p>answer body</p>', - Network accessline 45
link: 'https://stackoverflow.example.test/q/1', - Network accessline 50
const BING_HTML = `<html><body> <li class="b_algo"> <h2><a href="https://bing.example.test/a">Result A</a></h2> - Network accessline 51
<li class="b_algo"> <h2><a href="https://bing.example.test/a">Result A</a></h2> <div class="b_caption"><p>snippet A</p></div> - Network accessline 52
<h2><a href="https://bing.example.test/a">Result A</a></h2> - Network accessline 54
</li> <li class="b_algo"> <h2><a href="https://bing.example.test/b">Result B</a></h2> - Network accessline 55
<li class="b_algo"> <h2><a href="https://bing.example.test/b">Result B</a></h2> <div class="b_caption"><p>snippet B</p></div> - Network accessline 56
<h2><a href="https://bing.example.test/b">Result B</a></h2> - Network accessline 61
const DDG_HTML = `<html><body> <a class="result-link" href="https://ddg.example.test/a">DDG A</a> - Network accessline 62
<a class="result-link" href="https://ddg.example.test/a">DDG A</a> - Network accessline 70
['Cat'], ['The cat is a domestic species.'], ['https://en.wikipedia.org/wiki/Cat'], - Network accessline 71
['The cat is a domestic species.'], ['https://en.wikipedia.org/wiki/Cat'], ]; - Network accessline 72
['https://en.wikipedia.org/wiki/Cat'], - Access to secretsline 168
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Access to secretsline 204
[Credential-related source omitted] - Access to secretsline 205
[Credential-related source omitted] - Network accessline 267
it('honors max_results by truncating fused output', async () => { const many = Array.from({ length: 10 }, (_, i) => `<li class="b_algo"><h2><a href="https://bing.example.test/${i}">R${i}</a></h2><div class="b_caption"><p>s${i}</p> - Network accessline 268
const many = Array.from({ length: 10 }, (_, i) => `<li class="b_algo"><h2><a href="https://bing.example.test/${i}">R${i}</a></h2><div class="b_caption"><p>s${i}</p></div></li>`, ).join(''); - Network accessline 269
`<li class="b_algo"><h2><a href="https://bing.example.test/${i}">R${i}</a></h2><div class="b_caption"><p>s${i}</p></div></li>`,
tests/integration/searxng-retry.test.ts
- Executable scriptline 1
Executable file
tests/integration/setup-roundtrip.test.ts
tests/integration/skills-install.test.ts
- Executable scriptline 1
Executable file
tests/integration/tui-autosave-roundtrip.test.ts
- Executable scriptline 1
Executable file
tests/integration/tui-narrow-terminal.test.ts
- Executable scriptline 1
Executable file
tests/integration/tui-shell-integration.test.ts
- Executable scriptline 1
Executable file
tests/integration/warmup-force.test.ts
- Executable scriptline 1
Executable file
tests/integration/warmup-tui.test.ts
- Executable scriptline 1
Executable file
tests/integration/watch/watch-handler.test.ts
- Executable scriptline 1
Executable file - Network accessline 36
// Minimal router — handleFetch calls into the cache layer first, so we // mock the underlying SmartRouter.fetch() to a deterministic markdown - Network accessline 37
// mock the underlying SmartRouter.fetch() to a deterministic markdown - Network accessline 100
const router = mockRouter('hello'); const r = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/p', interval_seconds: 60 }, - Network accessline 101
const r = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/p', interval_seconds: 60 }, router, - Network accessline 102
{ action: 'create', url: 'https://example.com/p', interval_seconds: 60 }, - Network accessline 104
)); expect(r.jobs).toHaveLength(1); expect(r.jobs[0].url).toBe('https://example.com/p'); - Network accessline 105
expect(r.jobs).toHaveLength(1); expect(r.jobs[0].url).toBe('https://example.com/p'); expect(r.jobs[0].status).toBe('active'); - Network accessline 106
expect(r.jobs[0].url).toBe('https://example.com/p'); - Network accessline 115
const router = mockRouter('hello'); const r = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/m17-single', interval_seconds: 60 }, - Network accessline 116
const r = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/m17-single', interval_seconds: 60 }, router, - Network accessline 117
{ action: 'create', url: 'https://example.com/m17-single', interval_seconds: 60 }, - Network accessline 119
)); expect(r.job).toBeDefined(); expect(r.job!.url).toBe('https://example.com/m17-single'); - Network accessline 121
expect(r.job!.url).toBe('https://example.com/m17-single'); - Network accessline 130
{ action: 'create', urls: ['https://example.com/m17-batch-a', 'https://example.com/m17-batch-b'], - Network accessline 131
action: 'create', urls: ['https://example.com/m17-batch-a', 'https://example.com/m17-batch-b'], interval_seconds: 60, - Network accessline 132
urls: ['https://example.com/m17-batch-a', 'https://example.com/m17-batch-b'], - Network accessline 139
const urls = r.jobs.map((j) => j.url).sort(); expect(urls).toEqual([ 'https://example.com/m17-batch-a', - Network accessline 140
expect(urls).toEqual([ 'https://example.com/m17-batch-a', 'https://example.com/m17-batch-b', - Network accessline 141
'https://example.com/m17-batch-a', - Network accessline 142
'https://example.com/m17-batch-b', - Network accessline 150
it('rejects an oversized batch (urls.length > MAX_WATCH_BATCH_SIZE)', async () => { const router = mockRouter(''); const tooMany = Array.from({ length: 1001 }, (_, i) => `https://example.com/m17-cap-${i}`); - Network accessline 151
const router = mockRouter(''); const tooMany = Array.from({ length: 1001 }, (_, i) => `https://example.com/m17-cap-${i}`); const r = await handleWatch( - Network accessline 152
const tooMany = Array.from({ length: 1001 }, (_, i) => `https://example.com/m17-cap-${i}`); - Network accessline 167
it('accepts a batch at exactly MAX_WATCH_BATCH_SIZE (cap is inclusive)', async () => { const router = mockRouter(''); const atLimit = Array.from({ length: 1000 }, (_, i) => `https://example.com/m17-atcap-${i}`); - Network accessline 168
const router = mockRouter(''); const atLimit = Array.from({ length: 1000 }, (_, i) => `https://example.com/m17-atcap-${i}`); const r = await handleWatch( - Network accessline 169
const atLimit = Array.from({ length: 1000 }, (_, i) => `https://example.com/m17-atcap-${i}`); - Network accessline 183
{ action: 'create', url: 'https://example.com/x', - Network accessline 184
action: 'create', url: 'https://example.com/x', urls: ['https://example.com/y'], - Network accessline 185
url: 'https://example.com/x', - Network accessline 186
urls: ['https://example.com/y'], - Network accessline 196
const router = mockRouter(''); const r = await handleWatch( { action: 'create', url: 'https://example.com/p', interval_seconds: 30 }, - Network accessline 197
const r = await handleWatch( { action: 'create', url: 'https://example.com/p', interval_seconds: 30 }, router, - Network accessline 198
{ action: 'create', url: 'https://example.com/p', interval_seconds: 30 }, - Network accessline 215
const router = mockRouter(''); const a = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/x', interval_seconds: 60 }, - Network accessline 216
const a = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/x', interval_seconds: 60 }, router, - Network accessline 217
{ action: 'create', url: 'https://example.com/x', interval_seconds: 60 }, - Network accessline 219
)); const b = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/x', interval_seconds: 60 }, - Network accessline 220
const b = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/x', interval_seconds: 60 }, router, - Network accessline 221
{ action: 'create', url: 'https://example.com/x', interval_seconds: 60 }, - Network accessline 229
it('SSRF: rejects http://localhost as the watched url', async () => { - Network accessline 230
const router = mockRouter(''); const r = await handleWatch( { action: 'create', url: 'http://localhost:3000/x', interval_seconds: 60 }, - Network accessline 231
const r = await handleWatch( { action: 'create', url: 'http://localhost:3000/x', interval_seconds: 60 }, router, - Network accessline 232
{ action: 'create', url: 'http://localhost:3000/x', interval_seconds: 60 }, - Network accessline 240
const router = mockRouter(''); const r = await handleWatch( { action: 'create', url: 'http://192.168.1.1/admin', interval_seconds: 60 }, - Network accessline 241
const r = await handleWatch( { action: 'create', url: 'http://192.168.1.1/admin', interval_seconds: 60 }, router, - Network accessline 242
{ action: 'create', url: 'http://192.168.1.1/admin', interval_seconds: 60 }, - Network accessline 263
{ action: 'create', url: 'https://example.com/p', - Network accessline 264
action: 'create', url: 'https://example.com/p', interval_seconds: 60, - Network accessline 265
url: 'https://example.com/p', - Network accessline 266
interval_seconds: 60, notification: 'http://169.254.169.254/exfil', }, - Network accessline 267
notification: 'http://169.254.169.254/exfil', - Network accessline 281
{ action: 'create', url: 'https://example.com/p', - Network accessline 282
action: 'create', url: 'https://example.com/p', interval_seconds: 60, - Network accessline 283
url: 'https://example.com/p', - Network accessline 284
interval_seconds: 60, notification: 'https://hooks.example.com/incoming', }, - Network accessline 285
notification: 'https://hooks.example.com/incoming', - Network accessline 295
const router = mockRouter(''); await handleWatch( { action: 'create', url: 'https://example.com/p', interval_seconds: 60 }, - Network accessline 296
await handleWatch( { action: 'create', url: 'https://example.com/p', interval_seconds: 60 }, router, - Network accessline 297
{ action: 'create', url: 'https://example.com/p', interval_seconds: 60 }, - Network accessline 311
const router = mockRouter('initial body'); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/page', interval_seconds: 60 }, - Network accessline 312
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/page', interval_seconds: 60 }, router, - Network accessline 313
{ action: 'create', url: 'https://example.com/page', interval_seconds: 60 }, - Network accessline 329
const router1 = mockRouter('v1 body'); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/diff', interval_seconds: 60 }, - Network accessline 330
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/diff', interval_seconds: 60 }, router1, - Network accessline 331
{ action: 'create', url: 'https://example.com/diff', interval_seconds: 60 }, - Network accessline 359
const routerV1 = mockRouterRawHtml(largeArticleHtml('alpha-one')); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/long-doc', interval_seconds: 60 }, - Network accessline 360
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/long-doc', interval_seconds: 60 }, routerV1, - Network accessline 361
{ action: 'create', url: 'https://example.com/long-doc', interval_seconds: 60 }, - Network accessline 401
const router = mockRouter(''); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/pause', interval_seconds: 60 }, - Network accessline 402
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/pause', interval_seconds: 60 }, router, - Network accessline 403
{ action: 'create', url: 'https://example.com/pause', interval_seconds: 60 }, - Network accessline 421
const router = mockRouter(''); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/del', interval_seconds: 60 }, - Network accessline 422
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/del', interval_seconds: 60 }, router, - Network accessline 423
{ action: 'create', url: 'https://example.com/del', interval_seconds: 60 }, - Network accessline 438
const router = mockRouter('lazy body'); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/lazy', interval_seconds: 60 }, - Network accessline 439
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/lazy', interval_seconds: 60 }, router, - Network accessline 440
{ action: 'create', url: 'https://example.com/lazy', interval_seconds: 60 }, - Network accessline 460
const router = mockRouter('paused body'); const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/p2', interval_seconds: 60 }, - Network accessline 461
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/p2', interval_seconds: 60 }, router, - Network accessline 462
{ action: 'create', url: 'https://example.com/p2', interval_seconds: 60 }, - Network accessline 480
// A public webhook URL passes the guard at registration time, but the // target server can return 307/308 redirecting to http://127.0.0.1/. - Network accessline 481
// target server can return 307/308 redirecting to http://127.0.0.1/. - Network accessline 488
// redirect:'manual' the runtime returns this response to the caller // and never re-fetches; with redirect:'follow' (the default), the // runtime would transparently re-fetch http://127.0.0.1/admin. - Network accessline 490
// runtime would transparently re-fetch http://127.0.0.1/admin. - Network accessline 491
return new Response('', { status: 308, headers: { location: 'http://127.0.0.1/admin' }, - Network accessline 492
status: 308, headers: { location: 'http://127.0.0.1/admin' }, }); - Network accessline 493
headers: { location: 'http://127.0.0.1/admin' }, - Network accessline 502
{ action: 'create', url: 'https://example.com/page', - Network accessline 503
action: 'create', url: 'https://example.com/page', interval_seconds: 60, - Network accessline 504
url: 'https://example.com/page', - Network accessline 505
interval_seconds: 60, notification: 'https://hooks.example.com/incoming', }, - Network accessline 506
notification: 'https://hooks.example.com/incoming', - Network accessline 530
expect(calls.length).toBeGreaterThan(0); const webhookCall = calls.find( (c) => String(c[0]) === 'https://hooks.example.com/incoming', - Network accessline 531
const webhookCall = calls.find( (c) => String(c[0]) === 'https://hooks.example.com/incoming', ); - Network accessline 532
(c) => String(c[0]) === 'https://hooks.example.com/incoming', - Network accessline 554
const created = mustOk(await handleWatch( { action: 'create', url: 'https://example.com/down', interval_seconds: 60 }, - Network accessline 555
{ action: 'create', url: 'https://example.com/down', interval_seconds: 60 },
tests/integration/zero-touch-just-works.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 96
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted]
tests/perf/embedding.bench.ts
- Executable scriptline 1
Executable file
tests/perf/rerank.bench.ts
- Executable scriptline 1
Executable file
tests/perf/search-v1.bench.ts
- Executable scriptline 1
Executable file
tests/perf/vector-search.bench.ts
- Executable scriptline 1
Executable file - Network accessline 73
for (let i = 0; i < CORPUS_SIZE; i++) { batch.push({ id: `https://doc${i}.com`, - Network accessline 74
batch.push({ id: `https://doc${i}.com`, vector: randomVector(DIMS), - Network accessline 75
id: `https://doc${i}.com`, - Network accessline 76
vector: randomVector(DIMS), metadata: { url: `https://doc${i}.com`, contentHash: 'h', modelId: 'bench' }, }); - Network accessline 77
metadata: { url: `https://doc${i}.com`, contentHash: 'h', modelId: 'bench' },
tests/setup.ts
- Executable scriptline 1
Executable file
tests/unit/agent/agent-defaults.test.ts
- Executable scriptline 1
Executable file
tests/unit/agent/executor.test.ts
- Executable scriptline 1
Executable file - Network accessline 38
return { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 39
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 40
url: 'https://example.com', - Network accessline 41
finalUrl: 'https://example.com', - Network accessline 51
const defaultSearchResults: RawSearchResult[] = [ { title: 'Result 1', url: 'https://example.com/1', snippet: 'First result', relevance_score: 0.95, engine: 'stub' }, - Network accessline 52
{ title: 'Result 1', url: 'https://example.com/1', snippet: 'First result', relevance_score: 0.95, engine: 'stub' }, - Network accessline 53
{ title: 'Result 2', url: 'https://example.com/2', snippet: 'Second result', relevance_score: 0.85, engine: 'stub' }, - Network accessline 54
{ title: 'Result 3', url: 'https://example.com/3', snippet: 'Third result', relevance_score: 0.75, engine: 'stub' }, - Network accessline 75
it('fetches explicit URLs from plan', async () => { const plan: AgentPlan = { searches: [], urls: ['https://example.com/pricing', 'https://example.com/about'], notes: '', samplingUsed: false }; - Network accessline 76
const plan: AgentPlan = { searches: [], urls: ['https://example.com/pricing', 'https://example.com/about'], notes: '', samplingUsed: false }; - Network accessline 86
it('combines search results and explicit URLs', async () => { const plan: AgentPlan = { searches: ['CRM tools'], urls: ['https://example.com/explicit'], notes: '', samplingUsed: false }; - Network accessline 87
const plan: AgentPlan = { searches: ['CRM tools'], urls: ['https://example.com/explicit'], notes: '', samplingUsed: false }; - Network accessline 96
it('respects max_pages budget', async () => { const plan: AgentPlan = { searches: ['query 1', 'query 2'], urls: ['https://example.com/1', 'https://example.com/2', 'https://example.com/3'], notes: '', samplingUsed: false }; - Network accessline 97
const plan: AgentPlan = { searches: ['query 1', 'query 2'], urls: ['https://example.com/1', 'https://example.com/2', 'https://example.com/3'], notes: '', samplingUsed: false }; - Network accessline 107
const plan: AgentPlan = { searches: ['unrelated query'], urls: ['https://target.example/seed1', 'https://target.example/seed2'], - Network accessline 108
searches: ['unrelated query'], urls: ['https://target.example/seed1', 'https://target.example/seed2'], notes: '', - Network accessline 109
urls: ['https://target.example/seed1', 'https://target.example/seed2'], - Network accessline 112
}; const engine = createStubEngine([ { title: 'Noise 1', url: 'https://noise.example/1', snippet: '', relevance_score: 0.9, engine: 'stub' }, - Network accessline 113
const engine = createStubEngine([ { title: 'Noise 1', url: 'https://noise.example/1', snippet: '', relevance_score: 0.9, engine: 'stub' }, { title: 'Noise 2', url: 'https://noise.example/2', snippet: '', relevance_score: 0.8, en - Network accessline 114
{ title: 'Noise 1', url: 'https://noise.example/1', snippet: '', relevance_score: 0.9, engine: 'stub' }, - Network accessline 115
{ title: 'Noise 2', url: 'https://noise.example/2', snippet: '', relevance_score: 0.8, engine: 'stub' }, - Network accessline 116
{ title: 'Noise 3', url: 'https://noise.example/3', snippet: '', relevance_score: 0.7, engine: 'stub' }, - Network accessline 122
const fetchedUrls = result.sources.filter((s) => s.fetched).map((s) => s.url); expect(fetchedUrls).toContain('https://target.example/seed1'); - Network accessline 123
expect(fetchedUrls).toContain('https://target.example/seed1'); - Network accessline 124
expect(fetchedUrls).toContain('https://target.example/seed2'); - Network accessline 125
expect(fetchedUrls.every((u) => u.startsWith('https://target.example/'))).toBe(true); - Network accessline 128
it('respects deadline and stops fetching', async () => { const plan: AgentPlan = { searches: ['slow query'], urls: ['https://example.com/slow1', 'https://example.com/slow2', 'https://example.com/slow3'], notes: '', samplingUsed: false } - Network accessline 129
const plan: AgentPlan = { searches: ['slow query'], urls: ['https://example.com/slow1', 'https://example.com/slow2', 'https://example.com/slow3'], notes: '', samplingUsed: false }; const slowRouter = { fetch: vi.fn().mockImplement - Network accessline 132
new Promise((resolve) => setTimeout(() => resolve({ url: 'https://example.com', - Network accessline 133
setTimeout(() => resolve({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 134
url: 'https://example.com', - Network accessline 135
finalUrl: 'https://example.com', - Network accessline 179
it('handles fetch failure for individual URLs', async () => { const plan: AgentPlan = { searches: [], urls: ['https://broken.com', 'https://working.com'], notes: '', samplingUsed: false }; - Network accessline 180
const plan: AgentPlan = { searches: [], urls: ['https://broken.com', 'https://working.com'], notes: '', samplingUsed: false }; - Network accessline 185
if (callCount === 1) return Promise.reject(new Error('connection refused')); return Promise.resolve({ url: 'https://working.com', finalUrl: 'https://working.com', - Network accessline 186
return Promise.resolve({ url: 'https://working.com', finalUrl: 'https://working.com', html: '<html><body><p>Working</p></body></html>', contentType: 'text/html', - Network accessline 187
url: 'https://working.com', finalUrl: 'https://working.com', - Network accessline 201
it('deduplicates URLs from search results', async () => { const duplicateResults: RawSearchResult[] = [ { title: 'Same', url: 'https://example.com/same', snippet: 'dup', relevance_score: 0.9, engine: 'stub' }, - Network accessline 202
const duplicateResults: RawSearchResult[] = [ { title: 'Same', url: 'https://example.com/same', snippet: 'dup', relevance_score: 0.9, engine: 'stub' }, { title: 'Same Again', url: 'https://example.com/same', snippet: 'dup2', rel - Network accessline 203
{ title: 'Same', url: 'https://example.com/same', snippet: 'dup', relevance_score: 0.9, engine: 'stub' }, - Network accessline 204
{ title: 'Same Again', url: 'https://example.com/same', snippet: 'dup2', relevance_score: 0.8, engine: 'stub' }, - Network accessline 241
it('caches fetched content', async () => { const plan: AgentPlan = { searches: [], urls: ['https://example.com/cache-test'], notes: '', samplingUsed: false }; - Network accessline 242
const plan: AgentPlan = { searches: [], urls: ['https://example.com/cache-test'], notes: '', samplingUsed: false };
tests/unit/agent/pipeline.llm-gate-keystore.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 40
return { fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', - Network accessline 41
fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', finalUrl: 'https://pgedge.com/pricing', - Network accessline 42
url: 'https://pgedge.com/pricing', - Network accessline 43
finalUrl: 'https://pgedge.com/pricing', - Network accessline 53
const SOURCES: RawSearchResult[] = [ { title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'pricing tiers', relevance_score: 0.9, engine: 'stub' }, - Network accessline 54
{ title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'pricing tiers', relevance_score: 0.9, engine: 'stub' }, - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted]
tests/unit/agent/pipeline.local-tier.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
return { fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', - Network accessline 41
fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', finalUrl: 'https://pgedge.com/pricing', - Network accessline 42
url: 'https://pgedge.com/pricing', - Network accessline 43
finalUrl: 'https://pgedge.com/pricing', - Network accessline 63
const SOURCES: RawSearchResult[] = [ { title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'pricing tiers', relevance_score: 0.9, engine: 'stub' }, - Network accessline 64
{ title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'pricing tiers', relevance_score: 0.9, engine: 'stub' }, - Network accessline 67
describe('agent synthesis fires via the local-model tier', () => { const originalEnv = process.env; const TIER = { available: true as const, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' as const }; - Network accessline 69
const TIER = { available: true as const, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' as const }; - Network accessline 103
expect(callOpts.backend).toEqual({ url: 'http://localhost:11434', model: 'qwen2.5:7b-instruct' });
tests/unit/agent/pipeline.provider-priority.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
return { fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', - Network accessline 13
fetch: vi.fn().mockResolvedValue({ url: 'https://pgedge.com/pricing', finalUrl: 'https://pgedge.com/pricing', - Network accessline 14
url: 'https://pgedge.com/pricing', - Network accessline 15
finalUrl: 'https://pgedge.com/pricing', - Network accessline 35
const SOURCES: RawSearchResult[] = [ { title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'pricing tiers', relevance_score: 0.9, engine: 'stub' }, - Network accessline 36
{ title: 'pgEdge Pricing', url: 'https://pgedge.com/pricing', snippet: 'pricing tiers', relevance_score: 0.9, engine: 'stub' }, - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted]
tests/unit/agent/pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
return { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 15
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 16
url: 'https://example.com', - Network accessline 17
finalUrl: 'https://example.com', - Network accessline 27
const defaultResults: RawSearchResult[] = [ { title: 'CRM Pricing', url: 'https://example.com/crm-pricing', snippet: 'CRM pricing comparison', relevance_score: 0.95, engine: 'stub' }, - Network accessline 28
{ title: 'CRM Pricing', url: 'https://example.com/crm-pricing', snippet: 'CRM pricing comparison', relevance_score: 0.95, engine: 'stub' }, - Network accessline 29
{ title: 'Best CRM 2025', url: 'https://example.com/best-crm', snippet: 'Top CRM tools', relevance_score: 0.88, engine: 'stub' }, - Network accessline 99
const input: AgentInput = { prompt: 'Check these pages', urls: ['https://example.com/page1', 'https://example.com/page2'], - Network accessline 100
prompt: 'Check these pages', urls: ['https://example.com/page1', 'https://example.com/page2'], }; - Network accessline 101
urls: ['https://example.com/page1', 'https://example.com/page2'], - Network accessline 132
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 133
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 134
url: 'https://example.com', - Network accessline 135
finalUrl: 'https://example.com', - Network accessline 169
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 170
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 171
url: 'https://example.com', - Network accessline 172
finalUrl: 'https://example.com', - Network accessline 210
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 211
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 212
url: 'https://example.com', - Network accessline 213
finalUrl: 'https://example.com', - Network accessline 264
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 265
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 266
url: 'https://example.com', - Network accessline 267
finalUrl: 'https://example.com', - Network accessline 314
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 315
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 316
url: 'https://example.com', - Network accessline 317
finalUrl: 'https://example.com', - Network accessline 371
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 372
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 373
url: 'https://example.com', - Network accessline 374
finalUrl: 'https://example.com', - Network accessline 425
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 426
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 427
url: 'https://example.com', - Network accessline 428
finalUrl: 'https://example.com', - Network accessline 474
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 475
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 476
url: 'https://example.com', - Network accessline 477
finalUrl: 'https://example.com', - Network accessline 507
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 508
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 509
url: 'https://example.com', - Network accessline 510
finalUrl: 'https://example.com',
tests/unit/agent/planner.test.ts
- Executable scriptline 1
Executable file - Network accessline 17
it('extracts URLs from prompt when present', async () => { const result = await planExecution( 'Compare the pricing at https://salesforce.com/pricing and https://hubspot.com/pricing', - Network accessline 18
const result = await planExecution( 'Compare the pricing at https://salesforce.com/pricing and https://hubspot.com/pricing', ); - Network accessline 19
'Compare the pricing at https://salesforce.com/pricing and https://hubspot.com/pricing', - Network accessline 20
); expect(result.urls.length).toBeGreaterThanOrEqual(2); expect(result.urls).toContain('https://salesforce.com/pricing'); - Network accessline 21
expect(result.urls.length).toBeGreaterThanOrEqual(2); expect(result.urls).toContain('https://salesforce.com/pricing'); expect(result.urls).toContain('https://hubspot.com/pricing'); - Network accessline 22
expect(result.urls).toContain('https://salesforce.com/pricing'); - Network accessline 23
expect(result.urls).toContain('https://hubspot.com/pricing'); - Network accessline 26
it('combines URLs and search queries', async () => { const result = await planExecution( 'Get the pricing from https://example.com/pricing and also search for CRM pricing comparison', - Network accessline 27
const result = await planExecution( 'Get the pricing from https://example.com/pricing and also search for CRM pricing comparison', ); - Network accessline 28
'Get the pricing from https://example.com/pricing and also search for CRM pricing comparison', - Network accessline 34
it('merges explicit urls parameter with extracted URLs', async () => { const result = await planExecution('Check pricing details', ['https://explicit.com/pricing']); - Network accessline 35
const result = await planExecution('Check pricing details', ['https://explicit.com/pricing']); - Network accessline 36
expect(result.urls).toContain('https://explicit.com/pricing'); - Network accessline 39
it('deduplicates URLs from prompt and parameter', async () => { const result = await planExecution( 'Check https://example.com/page', - Network accessline 40
const result = await planExecution( 'Check https://example.com/page', ['https://example.com/page'], - Network accessline 41
'Check https://example.com/page', - Network accessline 42
['https://example.com/page'], - Network accessline 89
it('extracts multiple URLs with different protocols', async () => { const result = await planExecution( 'Check https://secure.example.com and http://legacy.example.com', - Network accessline 90
const result = await planExecution( 'Check https://secure.example.com and http://legacy.example.com', ); - Network accessline 91
'Check https://secure.example.com and http://legacy.example.com', - Network accessline 92
); expect(result.urls).toContain('https://secure.example.com'); expect(result.urls).toContain('http://legacy.example.com'); - Network accessline 93
expect(result.urls).toContain('https://secure.example.com'); - Network accessline 94
expect(result.urls).toContain('http://legacy.example.com'); - Network accessline 144
text: JSON.stringify({ searches: ['CRM pricing comparison 2025', 'best CRM tools small business'], urls: ['https://g2.com/categories/crm'], - Network accessline 145
searches: ['CRM pricing comparison 2025', 'best CRM tools small business'], urls: ['https://g2.com/categories/crm'], notes: 'Focus on enterprise and SMB pricing tiers', - Network accessline 146
urls: ['https://g2.com/categories/crm'], - Network accessline 154
expect(result.samplingUsed).toBe(true); expect(result.searches).toContain('CRM pricing comparison 2025'); expect(result.urls).toContain('https://g2.com/categories/crm'); - Network accessline 155
expect(result.searches).toContain('CRM pricing comparison 2025'); expect(result.urls).toContain('https://g2.com/categories/crm'); expect(mockServer.createMessage).toHaveBeenCalledTimes(1); - Network accessline 156
expect(result.urls).toContain('https://g2.com/categories/crm'); - Network accessline 205
text: JSON.stringify({ searches: ['test query'], urls: ['https://from-sampling.com'], - Network accessline 206
searches: ['test query'], urls: ['https://from-sampling.com'], notes: '', - Network accessline 207
urls: ['https://from-sampling.com'], - Network accessline 211
}), }; const result = await planExecution('Test', ['https://explicit.com'], mockServer as any); - Network accessline 212
}; const result = await planExecution('Test', ['https://explicit.com'], mockServer as any); expect(result.urls).toContain('https://from-sampling.com'); - Network accessline 213
const result = await planExecution('Test', ['https://explicit.com'], mockServer as any); - Network accessline 214
expect(result.urls).toContain('https://from-sampling.com'); - Network accessline 215
expect(result.urls).toContain('https://explicit.com');
tests/unit/agent/rank.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
const results = [ makeResult({ url: 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 19
makeResult({ url: 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', title: 'Microsoft Lists app — track work, organize lists', - Network accessline 20
url: 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 24
}), makeResult({ url: 'https://science.nasa.gov/universe/stars/', - Network accessline 25
makeResult({ url: 'https://science.nasa.gov/universe/stars/', title: 'Stars - NASA Science', - Network accessline 26
url: 'https://science.nasa.gov/universe/stars/', - Network accessline 30
}), makeResult({ url: 'https://github.com/modelcontextprotocol/servers', - Network accessline 31
makeResult({ url: 'https://github.com/modelcontextprotocol/servers', title: 'modelcontextprotocol/servers — official MCP server implementations', - Network accessline 32
url: 'https://github.com/modelcontextprotocol/servers', - Network accessline 39
const ranked = rankAgentSearchResults(prompt, results); expect(ranked[0].url).toBe('https://github.com/modelcontextprotocol/servers'); - Network accessline 40
expect(ranked[0].url).toBe('https://github.com/modelcontextprotocol/servers'); - Network accessline 41
expect(ranked[ranked.length - 1].url).toBe( 'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', ); - Network accessline 42
'https://www.microsoft.com/en-us/microsoft-365/microsoft-lists', - Network accessline 48
const results = [ makeResult({ url: 'https://stars.com/pgvector-hosting', - Network accessline 49
makeResult({ url: 'https://stars.com/pgvector-hosting', title: 'Stars Hosting — pgvector plans', - Network accessline 50
url: 'https://stars.com/pgvector-hosting', - Network accessline 54
}), makeResult({ url: 'https://jkatz05.com/post/postgres/pgvector-hnsw-tuning/', - Network accessline 55
makeResult({ url: 'https://jkatz05.com/post/postgres/pgvector-hnsw-tuning/', title: 'pgvector HNSW ef_search tuning guide', - Network accessline 56
url: 'https://jkatz05.com/post/postgres/pgvector-hnsw-tuning/', - Network accessline 63
const ranked = rankAgentSearchResults(prompt, results); expect(ranked[0].url).toBe('https://jkatz05.com/post/postgres/pgvector-hnsw-tuning/'); - Network accessline 64
expect(ranked[0].url).toBe('https://jkatz05.com/post/postgres/pgvector-hnsw-tuning/'); - Network accessline 67
it('returns input unchanged when prompt is empty', () => { const results = [ makeResult({ url: 'https://a.example', title: 'A', relevance_score: 0.8 }), - Network accessline 68
const results = [ makeResult({ url: 'https://a.example', title: 'A', relevance_score: 0.8 }), makeResult({ url: 'https://b.example', title: 'B', relevance_score: 0.3 }), - Network accessline 69
makeResult({ url: 'https://a.example', title: 'A', relevance_score: 0.8 }), - Network accessline 70
makeResult({ url: 'https://b.example', title: 'B', relevance_score: 0.3 }), - Network accessline 71
]; const ranked = rankAgentSearchResults('', results); expect(ranked.map((r) => r.url)).toEqual(['https://a.example', 'https://b.example']); - Network accessline 72
const ranked = rankAgentSearchResults('', results); expect(ranked.map((r) => r.url)).toEqual(['https://a.example', 'https://b.example']); }); - Network accessline 73
expect(ranked.map((r) => r.url)).toEqual(['https://a.example', 'https://b.example']);
tests/unit/agent/relevance.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
}); it('rejects DuckDuckGo redirect endpoints', () => { expect(isValidCandidateUrl('https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com')).toBe(false); - Network accessline 9
it('rejects DuckDuckGo redirect endpoints', () => { expect(isValidCandidateUrl('https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com')).toBe(false); }); - Network accessline 10
expect(isValidCandidateUrl('https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com')).toBe(false); - Network accessline 11
}); it('accepts ordinary http/https URLs', () => { expect(isValidCandidateUrl('https://example.com/a/b')).toBe(true); - Network accessline 12
it('accepts ordinary http/https URLs', () => { expect(isValidCandidateUrl('https://example.com/a/b')).toBe(true); }); - Network accessline 13
expect(isValidCandidateUrl('https://example.com/a/b')).toBe(true); - Network accessline 14
}); it('rejects r.jina.ai URLs', () => { expect(isValidCandidateUrl('https://r.jina.ai/https://example.com')).toBe(false); - Network accessline 15
it('rejects r.jina.ai URLs', () => { expect(isValidCandidateUrl('https://r.jina.ai/https://example.com')).toBe(false); }); - Network accessline 16
expect(isValidCandidateUrl('https://r.jina.ai/https://example.com')).toBe(false); - Network accessline 20
describe('isBlocklistedDomain', () => { it('blocks gaming forums', () => { expect(isBlocklistedDomain('https://elitepvpers.com/x')).toBe(true); - Network accessline 21
it('blocks gaming forums', () => { expect(isBlocklistedDomain('https://elitepvpers.com/x')).toBe(true); }); - Network accessline 22
expect(isBlocklistedDomain('https://elitepvpers.com/x')).toBe(true); - Network accessline 23
}); it('blocks Chinese consumer forums for technical queries', () => { expect(isBlocklistedDomain('https://zhidao.baidu.com/q')).toBe(true); - Network accessline 24
it('blocks Chinese consumer forums for technical queries', () => { expect(isBlocklistedDomain('https://zhidao.baidu.com/q')).toBe(true); expect(isBlocklistedDomain('https://jingyan.baidu.com/q')).toBe(true); - Network accessline 25
expect(isBlocklistedDomain('https://zhidao.baidu.com/q')).toBe(true); - Network accessline 26
expect(isBlocklistedDomain('https://jingyan.baidu.com/q')).toBe(true); - Network accessline 27
expect(isBlocklistedDomain('https://zhihu.com/q')).toBe(true); - Network accessline 28
}); it('does not block reputable domains', () => { expect(isBlocklistedDomain('https://postgresql.org/docs')).toBe(false); - Network accessline 29
it('does not block reputable domains', () => { expect(isBlocklistedDomain('https://postgresql.org/docs')).toBe(false); expect(isBlocklistedDomain('https://stackoverflow.com/q/1')).toBe(false); - Network accessline 30
expect(isBlocklistedDomain('https://postgresql.org/docs')).toBe(false); - Network accessline 31
expect(isBlocklistedDomain('https://stackoverflow.com/q/1')).toBe(false); - Network accessline 38
describe('agentSourcesToSearchResults', () => { it('maps AgentSource[] → MergedSearchResult[] preserving url and title', () => { const sources = [{ url: 'https://a', title: 'A', body: 'aa' }]; - Network accessline 39
it('maps AgentSource[] → MergedSearchResult[] preserving url and title', () => { const sources = [{ url: 'https://a', title: 'A', body: 'aa' }]; const out = agentSourcesToSearchResults(sources); - Network accessline 40
const sources = [{ url: 'https://a', title: 'A', body: 'aa' }]; - Network accessline 41
const out = agentSourcesToSearchResults(sources); expect(out[0].url).toBe('https://a'); expect(out[0].title).toBe('A'); - Network accessline 42
expect(out[0].url).toBe('https://a'); - Network accessline 48
it('excludes sources with score < 0.1 with excluded_reason', async () => { const sources = [ { url: 'https://a', title: 'PostgreSQL release notes', body: 'PostgreSQL 17.0 was released...' }, - Network accessline 49
const sources = [ { url: 'https://a', title: 'PostgreSQL release notes', body: 'PostgreSQL 17.0 was released...' }, { url: 'https://b', title: 'Cooking pasta recipes', body: 'Boil water and add pasta' }, - Network accessline 50
{ url: 'https://a', title: 'PostgreSQL release notes', body: 'PostgreSQL 17.0 was released...' }, - Network accessline 51
{ url: 'https://b', title: 'Cooking pasta recipes', body: 'Boil water and add pasta' }, - Network accessline 52
]; const { kept, excluded } = await scoreAndFilterSources('latest postgres release', sources, { threshold: 0.1 }); expect(kept.find((k) => k.url === 'https://a')).toBeDefined(); - Network accessline 53
const { kept, excluded } = await scoreAndFilterSources('latest postgres release', sources, { threshold: 0.1 }); expect(kept.find((k) => k.url === 'https://a')).toBeDefined(); const exclB = excluded.find((e) => e.source.url === 'http - Network accessline 54
expect(kept.find((k) => k.url === 'https://a')).toBeDefined(); - Network accessline 55
const exclB = excluded.find((e) => e.source.url === 'https://b'); - Network accessline 61
it('partitions inputs by validity then blocklist, preserving extra fields and order', () => { const items = [ { url: 'https://example.com/a', score: 1 }, - Network accessline 62
const items = [ { url: 'https://example.com/a', score: 1 }, { url: 'not a url', score: 2 }, - Network accessline 63
{ url: 'https://example.com/a', score: 1 }, - Network accessline 64
{ url: 'not a url', score: 2 }, { url: 'https://zhihu.com/q', score: 3 }, { url: 'https://example.com/b', score: 4 }, - Network accessline 65
{ url: 'https://zhihu.com/q', score: 3 }, - Network accessline 66
{ url: 'https://example.com/b', score: 4 }, - Network accessline 67
{ url: 'https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com', score: 5 }, - Network accessline 69
const result = preFilterCandidates(items); expect(result.kept).toEqual([ { url: 'https://example.com/a', score: 1 }, - Network accessline 70
expect(result.kept).toEqual([ { url: 'https://example.com/a', score: 1 }, { url: 'https://example.com/b', score: 4 }, - Network accessline 71
{ url: 'https://example.com/a', score: 1 }, - Network accessline 72
{ url: 'https://example.com/b', score: 4 }, - Network accessline 74
expect(result.excluded).toEqual([ { item: { url: 'not a url', score: 2 }, reason: 'invalid_url' }, { item: { url: 'https://zhihu.com/q', score: 3 }, reason: 'blocklisted_domain' }, - Network accessline 75
{ item: { url: 'not a url', score: 2 }, reason: 'invalid_url' }, { item: { url: 'https://zhihu.com/q', score: 3 }, reason: 'blocklisted_domain' }, { item: { url: 'https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com', score: - Network accessline 76
{ item: { url: 'https://zhihu.com/q', score: 3 }, reason: 'blocklisted_domain' }, - Network accessline 77
{ item: { url: 'https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com', score: 5 }, reason: 'invalid_url' },
tests/unit/benchmarks/agent/evaluator.test.ts
- Executable scriptline 1
Executable file - Network accessline 205
steps: [], collectedContent: 'TypeScript 5.0 was released with decorator support.', collectedUrls: ['https://typescriptlang.org'], - Network accessline 206
collectedContent: 'TypeScript 5.0 was released with decorator support.', collectedUrls: ['https://typescriptlang.org'], totalDurationMs: 500, - Network accessline 207
collectedUrls: ['https://typescriptlang.org'],
tests/unit/benchmarks/agent/metrics.test.ts
- Executable scriptline 1
Executable file
tests/unit/benchmarks/agent/report.test.ts
- Executable scriptline 1
Executable file
tests/unit/benchmarks/agent/runner.test.ts
- Executable scriptline 1
Executable file
tests/unit/benchmarks/agent/task-executor.test.ts
- Executable scriptline 1
Executable file - Network accessline 34
describe('buildFetchInput', () => { it('creates fetch input from URL', () => { const input = buildFetchInput('https://example.com/page'); - Network accessline 35
it('creates fetch input from URL', () => { const input = buildFetchInput('https://example.com/page'); expect(input.url).toBe('https://example.com/page'); - Network accessline 36
const input = buildFetchInput('https://example.com/page'); - Network accessline 37
expect(input.url).toBe('https://example.com/page'); - Network accessline 41
it('sets render_js to auto', () => { const input = buildFetchInput('https://example.com'); - Network accessline 42
const input = buildFetchInput('https://example.com'); - Network accessline 51
const mockSearch = vi.fn().mockResolvedValue({ results: [ { url: 'https://a.com', title: 'A', snippet: 'content A', markdown_content: 'Full content from A' }, - Network accessline 52
results: [ { url: 'https://a.com', title: 'A', snippet: 'content A', markdown_content: 'Full content from A' }, ], - Network accessline 53
{ url: 'https://a.com', title: 'A', snippet: 'content A', markdown_content: 'Full content from A' }, - Network accessline 60
const mockFetch = vi.fn().mockResolvedValue({ url: 'https://a.com', - Network accessline 61
url: 'https://a.com', - Network accessline 112
const mockSearch = vi.fn().mockResolvedValue({ results: [ { url: 'https://a.com', title: 'A', snippet: 's' }, - Network accessline 113
results: [ { url: 'https://a.com', title: 'A', snippet: 's' }, { url: 'https://b.com', title: 'B', snippet: 's' }, - Network accessline 114
{ url: 'https://a.com', title: 'A', snippet: 's' }, - Network accessline 115
{ url: 'https://b.com', title: 'B', snippet: 's' }, - Network accessline 122
const mockFetch = vi.fn() .mockResolvedValueOnce({ url: 'https://a.com', title: 'A', markdown: 'Content A', metadata: {}, links: [], images: [], cached: false }) - Network accessline 123
.mockResolvedValueOnce({ url: 'https://a.com', title: 'A', markdown: 'Content A', metadata: {}, links: [], images: [], cached: false }) - Network accessline 124
.mockResolvedValueOnce({ url: 'https://b.com', title: 'B', markdown: 'Content B', metadata: {}, links: [], images: [], cached: false }); - Network accessline 127
expect(result.collectedContent).toContain('Content A'); expect(result.collectedContent).toContain('Content B'); expect(result.collectedUrls).toContain('https://a.com'); - Network accessline 128
expect(result.collectedContent).toContain('Content B'); expect(result.collectedUrls).toContain('https://a.com'); expect(result.collectedUrls).toContain('https://b.com'); - Network accessline 129
expect(result.collectedUrls).toContain('https://a.com'); - Network accessline 130
expect(result.collectedUrls).toContain('https://b.com'); - Network accessline 136
const mockSearch = vi.fn().mockResolvedValue({ results: [ { url: 'https://a.com', title: 'A', snippet: 's' }, - Network accessline 137
results: [ { url: 'https://a.com', title: 'A', snippet: 's' }, { url: 'https://b.com', title: 'B', snippet: 's' }, - Network accessline 138
{ url: 'https://a.com', title: 'A', snippet: 's' }, - Network accessline 139
{ url: 'https://b.com', title: 'B', snippet: 's' }, - Network accessline 140
{ url: 'https://c.com', title: 'C', snippet: 's' }, - Network accessline 157
const mockSearch = vi.fn().mockResolvedValue({ results: [ { url: 'https://good.com', title: 'Good', snippet: 's' }, - Network accessline 158
results: [ { url: 'https://good.com', title: 'Good', snippet: 's' }, { url: 'https://bad.com', title: 'Bad', snippet: 's' }, - Network accessline 159
{ url: 'https://good.com', title: 'Good', snippet: 's' }, - Network accessline 160
{ url: 'https://bad.com', title: 'Bad', snippet: 's' }, - Network accessline 167
const mockFetch = vi.fn() .mockResolvedValueOnce({ url: 'https://good.com', title: 'Good', markdown: 'Good content', metadata: {}, links: [], images: [], cached: false }) .mockRejectedValueOnce(new Error('fetch timeout')); - Network accessline 168
.mockResolvedValueOnce({ url: 'https://good.com', title: 'Good', markdown: 'Good content', metadata: {}, links: [], images: [], cached: false }) - Network accessline 180
const mockSearch = vi.fn().mockImplementation(() => new Promise(resolve => setTimeout(() => resolve({ results: [{ url: 'https://slow.com', title: 'Slow', snippet: 's' }], - Network accessline 181
new Promise(resolve => setTimeout(() => resolve({ results: [{ url: 'https://slow.com', title: 'Slow', snippet: 's' }], query: 'q', - Network accessline 182
results: [{ url: 'https://slow.com', title: 'Slow', snippet: 's' }],
tests/unit/benchmarks/extraction/metrics.test.ts
tests/unit/benchmarks/extraction/report.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
return { id: 'test-001', url: 'https://example.com/page', - Network accessline 31
id: 'test-001', url: 'https://example.com/page', category: 'article', - Network accessline 32
url: 'https://example.com/page', - Network accessline 208
runDate: '2026-04-14T12:00:00Z', durationMs: 100, summary: computeSummary([makeResult({ url: 'https://example.com/path?q=1&b=2' })]), - Network accessline 209
durationMs: 100, summary: computeSummary([makeResult({ url: 'https://example.com/path?q=1&b=2' })]), results: [makeResult({ url: 'https://example.com/path?q=1&b=2' })], - Network accessline 210
summary: computeSummary([makeResult({ url: 'https://example.com/path?q=1&b=2' })]), - Network accessline 211
results: [makeResult({ url: 'https://example.com/path?q=1&b=2' })], - Network accessline 213
const json = generateJsonReport(report); const parsed = JSON.parse(json); expect(parsed.results[0].url).toBe('https://example.com/path?q=1&b=2'); - Network accessline 214
const parsed = JSON.parse(json); expect(parsed.results[0].url).toBe('https://example.com/path?q=1&b=2'); }); - Network accessline 215
expect(parsed.results[0].url).toBe('https://example.com/path?q=1&b=2');
tests/unit/benchmarks/extraction/runner.test.ts
- Executable scriptline 1
Executable file - Network accessline 47
{ id: 'test-001', url: 'https://example.com/page1', - Network accessline 48
id: 'test-001', url: 'https://example.com/page1', category: 'article', - Network accessline 49
url: 'https://example.com/page1', - Network accessline 55
{ id: 'test-002', url: 'https://docs.example.com/api', - Network accessline 56
id: 'test-002', url: 'https://docs.example.com/api', category: 'docs', - Network accessline 57
url: 'https://docs.example.com/api', - Network accessline 153
const entry: ManifestEntry = { id: 'bench-001', url: 'https://example.com', - Network accessline 154
id: 'bench-001', url: 'https://example.com', category: 'article', - Network accessline 155
url: 'https://example.com', - Network accessline 185
const entry: ManifestEntry = { id: 'bench-002', url: 'https://example.com', - Network accessline 186
id: 'bench-002', url: 'https://example.com', category: 'article', - Network accessline 187
url: 'https://example.com', - Network accessline 208
const entry: ManifestEntry = { id: 'bench-err', url: 'https://example.com', - Network accessline 209
id: 'bench-err', url: 'https://example.com', category: 'article', - Network accessline 210
url: 'https://example.com', - Network accessline 224
const entry: ManifestEntry = { id: 'bench-empty', url: 'https://example.com', - Network accessline 225
id: 'bench-empty', url: 'https://example.com', category: 'article', - Network accessline 226
url: 'https://example.com', - Network accessline 246
const entry: ManifestEntry = { id: 'bench-len', url: 'https://example.com', - Network accessline 247
id: 'bench-len', url: 'https://example.com', category: 'article', - Network accessline 248
url: 'https://example.com',
tests/unit/benchmarks/extraction/tokenizer.test.ts
- Executable scriptline 1
Executable file
tests/unit/benchmarks/search/metrics.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
const judgments: RelevanceJudgment[] = [ { queryId: 'q1', url: 'https://a.com', grade: 3 }, - Network accessline 15
{ queryId: 'q1', url: 'https://a.com', grade: 3 }, - Network accessline 16
{ queryId: 'q1', url: 'https://b.com', grade: 2 }, - Network accessline 17
{ queryId: 'q1', url: 'https://c.com', grade: 1 }, - Network accessline 18
{ queryId: 'q1', url: 'https://d.com', grade: 0 }, - Network accessline 21
describe('isUrlRelevant', () => { it('returns true for grade >= 1', () => { expect(isUrlRelevant('https://a.com', judgments, 'q1')).toBe(true); - Network accessline 22
it('returns true for grade >= 1', () => { expect(isUrlRelevant('https://a.com', judgments, 'q1')).toBe(true); expect(isUrlRelevant('https://b.com', judgments, 'q1')).toBe(true); - Network accessline 23
expect(isUrlRelevant('https://a.com', judgments, 'q1')).toBe(true); - Network accessline 24
expect(isUrlRelevant('https://b.com', judgments, 'q1')).toBe(true); - Network accessline 25
expect(isUrlRelevant('https://c.com', judgments, 'q1')).toBe(true); - Network accessline 28
it('returns false for grade 0', () => { expect(isUrlRelevant('https://d.com', judgments, 'q1')).toBe(false); - Network accessline 29
expect(isUrlRelevant('https://d.com', judgments, 'q1')).toBe(false); - Network accessline 32
it('returns false for unjudged URL', () => { expect(isUrlRelevant('https://unknown.com', judgments, 'q1')).toBe(false); - Network accessline 33
expect(isUrlRelevant('https://unknown.com', judgments, 'q1')).toBe(false); - Network accessline 36
it('returns false for wrong queryId', () => { expect(isUrlRelevant('https://a.com', judgments, 'q2')).toBe(false); - Network accessline 37
expect(isUrlRelevant('https://a.com', judgments, 'q2')).toBe(false); - Network accessline 41
describe('computePrecisionAtK', () => { it('returns 1.0 when all K results are relevant', () => { const urls = ['https://a.com', 'https://b.com', 'https://c.com']; - Network accessline 42
it('returns 1.0 when all K results are relevant', () => { const urls = ['https://a.com', 'https://b.com', 'https://c.com']; expect(computePrecisionAtK(urls, judgments, 'q1', 3)).toBe(1); - Network accessline 43
const urls = ['https://a.com', 'https://b.com', 'https://c.com']; - Network accessline 47
it('returns 0 when no results are relevant', () => { const urls = ['https://d.com', 'https://unknown.com']; - Network accessline 48
const urls = ['https://d.com', 'https://unknown.com']; - Network accessline 52
it('returns correct fraction for mixed results', () => { const urls = ['https://a.com', 'https://d.com', 'https://b.com']; - Network accessline 53
const urls = ['https://a.com', 'https://d.com', 'https://b.com']; - Network accessline 57
it('handles K larger than results length', () => { const urls = ['https://a.com']; - Network accessline 58
const urls = ['https://a.com']; - Network accessline 66
it('returns 0 for K=0', () => { expect(computePrecisionAtK(['https://a.com'], judgments, 'q1', 0)).toBe(0); - Network accessline 67
expect(computePrecisionAtK(['https://a.com'], judgments, 'q1', 0)).toBe(0); - Network accessline 71
describe('computeMRR', () => { it('returns 1.0 when first result is relevant', () => { const urls = ['https://a.com', 'https://d.com']; - Network accessline 72
it('returns 1.0 when first result is relevant', () => { const urls = ['https://a.com', 'https://d.com']; expect(computeMRR(urls, judgments, 'q1')).toBe(1); - Network accessline 73
const urls = ['https://a.com', 'https://d.com']; - Network accessline 77
it('returns 0.5 when second result is first relevant', () => { const urls = ['https://d.com', 'https://a.com']; - Network accessline 78
const urls = ['https://d.com', 'https://a.com']; - Network accessline 82
it('returns 0 when no results are relevant', () => { const urls = ['https://d.com', 'https://unknown.com']; - Network accessline 83
const urls = ['https://d.com', 'https://unknown.com']; - Network accessline 91
it('returns 1/3 when third result is first relevant', () => { const urls = ['https://d.com', 'https://unknown.com', 'https://a.com']; - Network accessline 92
const urls = ['https://d.com', 'https://unknown.com', 'https://a.com']; - Network accessline 119
describe('computeNDCG', () => { it('returns 1.0 for perfectly ranked results', () => { const rankedUrls = ['https://a.com', 'https://b.com', 'https://c.com', 'https://d.com']; - Network accessline 120
it('returns 1.0 for perfectly ranked results', () => { const rankedUrls = ['https://a.com', 'https://b.com', 'https://c.com', 'https://d.com']; const ndcg = computeNDCG(rankedUrls, judgments, 'q1'); - Network accessline 121
const rankedUrls = ['https://a.com', 'https://b.com', 'https://c.com', 'https://d.com']; - Network accessline 126
it('returns less than 1 for suboptimal ranking', () => { const rankedUrls = ['https://d.com', 'https://c.com', 'https://b.com', 'https://a.com']; - Network accessline 127
const rankedUrls = ['https://d.com', 'https://c.com', 'https://b.com', 'https://a.com']; - Network accessline 133
it('returns 0 when all results are irrelevant', () => { const rankedUrls = ['https://d.com', 'https://unknown.com']; - Network accessline 134
const rankedUrls = ['https://d.com', 'https://unknown.com']; - Network accessline 142
it('returns 0 when no judgments exist for query', () => { expect(computeNDCG(['https://a.com'], judgments, 'q-none')).toBe(0); - Network accessline 143
expect(computeNDCG(['https://a.com'], judgments, 'q-none')).toBe(0); - Network accessline 147
describe('computeNDCGAtK', () => { it('computes NDCG considering only top K results', () => { const rankedUrls = ['https://a.com', 'https://d.com', 'https://b.com']; - Network accessline 148
it('computes NDCG considering only top K results', () => { const rankedUrls = ['https://a.com', 'https://d.com', 'https://b.com']; const ndcgAt1 = computeNDCGAtK(rankedUrls, judgments, 'q1', 1); - Network accessline 149
const rankedUrls = ['https://a.com', 'https://d.com', 'https://b.com']; - Network accessline 156
it('returns 0 for K=0', () => { expect(computeNDCGAtK(['https://a.com'], judgments, 'q1', 0)).toBe(0); - Network accessline 157
expect(computeNDCGAtK(['https://a.com'], judgments, 'q1', 0)).toBe(0); - Network accessline 197
describe('computeQueryMetrics', () => { it('computes all metric fields for valid input', () => { const urls = ['https://a.com', 'https://b.com', 'https://c.com']; - Network accessline 198
it('computes all metric fields for valid input', () => { const urls = ['https://a.com', 'https://b.com', 'https://c.com']; const result = computeQueryMetrics('q1', 'test query', 'docs', urls, judgments, 50); - Network accessline 199
const urls = ['https://a.com', 'https://b.com', 'https://c.com'];
tests/unit/benchmarks/search/mock-engine.test.ts
- Executable scriptline 1
Executable file - Network accessline 26
queryId: 'docs-001', results: [ { title: 'TypeScript Docs', url: 'https://typescriptlang.org/docs', snippet: 'TS docs', relevance_score: 0.95, engine: 'searxng' }, - Network accessline 27
results: [ { title: 'TypeScript Docs', url: 'https://typescriptlang.org/docs', snippet: 'TS docs', relevance_score: 0.95, engine: 'searxng' }, { title: 'MDN Reference', url: 'https://developer.mozilla.org/js', snippet: 'MDN', releva - Network accessline 28
{ title: 'TypeScript Docs', url: 'https://typescriptlang.org/docs', snippet: 'TS docs', relevance_score: 0.95, engine: 'searxng' }, - Network accessline 29
{ title: 'MDN Reference', url: 'https://developer.mozilla.org/js', snippet: 'MDN', relevance_score: 0.8, engine: 'searxng' }, - Network accessline 30
{ title: 'Blog Post', url: 'https://blog.example.com/ts', snippet: 'Blog', relevance_score: 0.6, engine: 'searxng' },
tests/unit/benchmarks/search/report.test.ts
- Executable scriptline 1
Executable file
tests/unit/benchmarks/search/runner.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
version: '1.0.0', judgments: [ { queryId: 'q1', url: 'https://ts.org/docs/generics', grade: 3 }, - Network accessline 43
judgments: [ { queryId: 'q1', url: 'https://ts.org/docs/generics', grade: 3 }, { queryId: 'q1', url: 'https://example.com/blog', grade: 1 }, - Network accessline 44
{ queryId: 'q1', url: 'https://ts.org/docs/generics', grade: 3 }, - Network accessline 45
{ queryId: 'q1', url: 'https://example.com/blog', grade: 1 }, - Network accessline 46
{ queryId: 'q2', url: 'https://stackoverflow.com/q/123', grade: 3 }, - Network accessline 124
const query: BenchmarkQuery = { id: 'q1', query: 'test', category: 'docs' }; const mockResults = [ { title: 'Result', url: 'https://ts.org/docs/generics', snippet: 'Test', relevance_score: 0.9 }, - Network accessline 125
const mockResults = [ { title: 'Result', url: 'https://ts.org/docs/generics', snippet: 'Test', relevance_score: 0.9 }, ]; - Network accessline 126
{ title: 'Result', url: 'https://ts.org/docs/generics', snippet: 'Test', relevance_score: 0.9 },
tests/unit/cache/antibot-clearance.test.ts
- Executable scriptline 1
Executable file - Network accessline 196
tier: 'browser', expiresAt: '2026-08-01T00:00:00.000Z', solvedRoute: 'http://proxy:8080', - Network accessline 197
expiresAt: '2026-08-01T00:00:00.000Z', solvedRoute: 'http://proxy:8080', }); - Network accessline 198
solvedRoute: 'http://proxy:8080', - Network accessline 199
}); expect(getDomainClearance('routed.test')!.solvedRoute).toBe('http://proxy:8080'); }); - Network accessline 200
expect(getDomainClearance('routed.test')!.solvedRoute).toBe('http://proxy:8080'); - Access to secretsline 226
[Credential-related source omitted]
tests/unit/cache/backfill-embeddings.test.ts
- Executable scriptline 1
Executable file - Network accessline 64
} seed(db, [ { url: 'https://a.example/1', title: 'A', markdown: 'a body' }, - Network accessline 65
seed(db, [ { url: 'https://a.example/1', title: 'A', markdown: 'a body' }, { url: 'https://b.example/2', title: 'B', markdown: 'b body' }, - Network accessline 66
{ url: 'https://a.example/1', title: 'A', markdown: 'a body' }, - Network accessline 67
{ url: 'https://b.example/2', title: 'B', markdown: 'b body' }, - Network accessline 81
const upsertedIds = upsertSpy.mock.calls[0][0].map((rec: { id: string }) => rec.id).sort(); expect(upsertedIds).toEqual(['https://a.example/1', 'https://b.example/2']); - Network accessline 82
expect(upsertedIds).toEqual(['https://a.example/1', 'https://b.example/2']); - Network accessline 90
} seed(db, [ { url: 'https://a.example/1', title: '', markdown: '' }, - Network accessline 91
seed(db, [ { url: 'https://a.example/1', title: '', markdown: '' }, { url: 'https://b.example/2', title: 'B', markdown: 'body' }, - Network accessline 92
{ url: 'https://a.example/1', title: '', markdown: '' }, - Network accessline 93
{ url: 'https://b.example/2', title: 'B', markdown: 'body' }, - Network accessline 106
return; } seed(db, [{ url: 'https://a.example/1', title: 'A', markdown: 'a body' }]); - Network accessline 107
} seed(db, [{ url: 'https://a.example/1', title: 'A', markdown: 'a body' }]); closeDatabase(); - Network accessline 108
seed(db, [{ url: 'https://a.example/1', title: 'A', markdown: 'a body' }]); - Network accessline 120
} seed(db, [ { url: 'https://a.example/1', title: 'A', markdown: 'a' }, - Network accessline 121
seed(db, [ { url: 'https://a.example/1', title: 'A', markdown: 'a' }, { url: 'https://b.example/2', title: 'B', markdown: 'b' }, - Network accessline 122
{ url: 'https://a.example/1', title: 'A', markdown: 'a' }, - Network accessline 123
{ url: 'https://b.example/2', title: 'B', markdown: 'b' }, - Network accessline 124
{ url: 'https://c.example/3', title: 'C', markdown: 'c' }, - Network accessline 138
} seed(db, [ { url: 'https://a.example/1', title: 'A', markdown: 'a body' }, - Network accessline 139
seed(db, [ { url: 'https://a.example/1', title: 'A', markdown: 'a body' }, { url: 'https://b.example/2', title: 'B', markdown: 'b body' }, - Network accessline 140
{ url: 'https://a.example/1', title: 'A', markdown: 'a body' }, - Network accessline 141
{ url: 'https://b.example/2', title: 'B', markdown: 'b body' },
tests/unit/cache/change-detector.test.ts
- Executable scriptline 1
Executable file - Network accessline 45
describe('no previous cache entry', () => { it('returns changed=false when URL was never cached', () => { const result = detectChange('https://example.com/new', 'some new markdown'); - Network accessline 46
it('returns changed=false when URL was never cached', () => { const result = detectChange('https://example.com/new', 'some new markdown'); expect(result.changed).toBe(false); - Network accessline 47
const result = detectChange('https://example.com/new', 'some new markdown'); - Network accessline 53
it('returns changed=false for a different URL', () => { cacheContent(makeRaw('https://other.com'), makeExtraction({ markdown: 'other' })); - Network accessline 54
cacheContent(makeRaw('https://other.com'), makeExtraction({ markdown: 'other' })); - Network accessline 55
const result = detectChange('https://example.com/unrelated', 'content'); - Network accessline 61
it('returns changed=false when content hash matches', () => { const markdown = '# Hello\n\nSame content.'; cacheContent(makeRaw('https://example.com/page'), makeExtraction({ markdown })); - Network accessline 63
cacheContent(makeRaw('https://example.com/page'), makeExtraction({ markdown })); - Network accessline 65
const result = detectChange('https://example.com/page', markdown); - Network accessline 71
it('returns changed=false even with different URL casing (normalized)', () => { const markdown = 'Same content'; cacheContent(makeRaw('https://www.Example.COM/page/'), makeExtraction({ markdown })); - Network accessline 73
cacheContent(makeRaw('https://www.Example.COM/page/'), makeExtraction({ markdown })); - Network accessline 75
const result = detectChange('https://example.com/page', markdown); - Network accessline 80
const markdown = 'Content with tracking'; cacheContent( makeRaw('https://example.com/page?utm_source=test'), - Network accessline 81
cacheContent( makeRaw('https://example.com/page?utm_source=test'), makeExtraction({ markdown }), - Network accessline 82
makeRaw('https://example.com/page?utm_source=test'), - Network accessline 86
const result = detectChange('https://example.com/page', markdown); - Network accessline 93
const oldMarkdown = '# Hello\n\nOld content.'; const newMarkdown = '# Hello\n\nNew content.'; cacheContent(makeRaw('https://example.com/page'), makeExtraction({ markdown: oldMarkdown })); - Network accessline 95
cacheContent(makeRaw('https://example.com/page'), makeExtraction({ markdown: oldMarkdown })); - Network accessline 97
const result = detectChange('https://example.com/page', newMarkdown); - Network accessline 104
it('includes previous_hash as 64-char hex string', () => { cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'version 1' })); - Network accessline 105
cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'version 1' })); - Network accessline 106
const result = detectChange('https://example.com/a', 'version 2'); - Network accessline 111
const old = 'Line 1\nLine 2\nLine 3'; const new_ = 'Line 1\nLine 2 updated\nLine 3\nLine 4'; cacheContent(makeRaw('https://example.com/doc'), makeExtraction({ markdown: old })); - Network accessline 113
cacheContent(makeRaw('https://example.com/doc'), makeExtraction({ markdown: old })); - Network accessline 115
const result = detectChange('https://example.com/doc', new_); - Network accessline 120
it('detects change from empty to non-empty content', () => { cacheContent(makeRaw('https://example.com/empty'), makeExtraction({ markdown: '' })); - Network accessline 121
cacheContent(makeRaw('https://example.com/empty'), makeExtraction({ markdown: '' })); - Network accessline 122
const result = detectChange('https://example.com/empty', 'Now has content'); - Network accessline 127
it('detects change from non-empty to empty content', () => { cacheContent(makeRaw('https://example.com/filled'), makeExtraction({ markdown: 'Has content' })); - Network accessline 128
cacheContent(makeRaw('https://example.com/filled'), makeExtraction({ markdown: 'Has content' })); - Network accessline 129
const result = detectChange('https://example.com/filled', ''); - Network accessline 137
const old = 'Bonjour le monde'; const new_ = 'Bonjour tout le monde'; cacheContent(makeRaw('https://example.com/unicode'), makeExtraction({ markdown: old })); - Network accessline 138
const new_ = 'Bonjour tout le monde'; cacheContent(makeRaw('https://example.com/unicode'), makeExtraction({ markdown: old })); const result = detectChange('https://example.com/unicode', new_); - Network accessline 139
cacheContent(makeRaw('https://example.com/unicode'), makeExtraction({ markdown: old })); - Network accessline 140
const result = detectChange('https://example.com/unicode', new_); - Network accessline 146
const old = 'Hello'; const new_ = 'Hello World'; cacheContent(makeRaw('https://example.com/cjk'), makeExtraction({ markdown: old })); - Network accessline 147
const new_ = 'Hello World'; cacheContent(makeRaw('https://example.com/cjk'), makeExtraction({ markdown: old })); const result = detectChange('https://example.com/cjk', new_); - Network accessline 148
cacheContent(makeRaw('https://example.com/cjk'), makeExtraction({ markdown: old })); - Network accessline 149
const result = detectChange('https://example.com/cjk', new_); - Network accessline 156
const old = 'Line\n'.repeat(1000); const new_ = 'Line\n'.repeat(999) + 'Changed\n'; cacheContent(makeRaw('https://example.com/long'), makeExtraction({ markdown: old })); - Network accessline 157
const new_ = 'Line\n'.repeat(999) + 'Changed\n'; cacheContent(makeRaw('https://example.com/long'), makeExtraction({ markdown: old })); const result = detectChange('https://example.com/long', new_); - Network accessline 158
cacheContent(makeRaw('https://example.com/long'), makeExtraction({ markdown: old })); - Network accessline 159
const result = detectChange('https://example.com/long', new_); - Network accessline 163
it('returns correct type for all fields', () => { cacheContent(makeRaw('https://example.com/t'), makeExtraction({ markdown: 'a' })); - Network accessline 164
cacheContent(makeRaw('https://example.com/t'), makeExtraction({ markdown: 'a' })); - Network accessline 165
const result = detectChange('https://example.com/t', 'b'); - Network accessline 171
it('is idempotent (calling twice returns same result without caching new content)', () => { cacheContent(makeRaw('https://example.com/idem'), makeExtraction({ markdown: 'old' })); - Network accessline 172
cacheContent(makeRaw('https://example.com/idem'), makeExtraction({ markdown: 'old' })); - Network accessline 173
const r1 = detectChange('https://example.com/idem', 'new'); - Network accessline 174
const r2 = detectChange('https://example.com/idem', 'new'); - Network accessline 189
it('reports changed=true when status flips 200 → 404 with identical body', () => { const sameBody = '# Same body\n\nIdentical text either way.'; cacheContent(makeRaw('https://example.com/flip', 200), makeExtraction({ markdown: s - Network accessline 191
cacheContent(makeRaw('https://example.com/flip', 200), makeExtraction({ markdown: sameBody })); - Network accessline 193
const result = detectChange('https://example.com/flip', sameBody, 404); - Network accessline 199
it('reports changed=true when status flips 404 → 200 with identical body', () => { const sameBody = 'identical'; cacheContent(makeRaw('https://example.com/recovered', 404), makeExtraction({ markdown: sameBody })); - Network accessline 201
cacheContent(makeRaw('https://example.com/recovered', 404), makeExtraction({ markdown: sameBody })); - Network accessline 203
const result = detectChange('https://example.com/recovered', sameBody, 200); - Network accessline 209
it('reports changed=false when both body hash and status code match', () => { const body = '# body'; cacheContent(makeRaw('https://example.com/steady', 200), makeExtraction({ markdown: body })); - Network accessline 211
cacheContent(makeRaw('https://example.com/steady', 200), makeExtraction({ markdown: body })); - Network accessline 213
const result = detectChange('https://example.com/steady', body, 200); - Network accessline 219
it('falls back to body-hash-only when newHttpStatus is omitted (callers that don\'t track status)', () => { const sameBody = 'same'; cacheContent(makeRaw('https://example.com/legacy', 200), makeExtraction({ markdown: sameBody }) - Network accessline 221
cacheContent(makeRaw('https://example.com/legacy', 200), makeExtraction({ markdown: sameBody })); - Network accessline 223
const result = detectChange('https://example.com/legacy', sameBody);
tests/unit/cache/clearance-route-secret.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
* The gate only needs EQUALITY of the egress route, never the original string. */ const CRED_PROXY = 'http://alice:hunter2@proxy.example.com:8080'; - Network accessline 20
const CRED_PROXY = 'http://alice:hunter2@proxy.example.com:8080'; - Network accessline 57
record(CRED_PROXY); const a = getDomainClearance('example.com')!.solvedRoute; record('http://bob:pw@other.example.com:8080'); - Network accessline 58
const a = getDomainClearance('example.com')!.solvedRoute; record('http://bob:pw@other.example.com:8080'); const b = getDomainClearance('example.com')!.solvedRoute; - Network accessline 59
record('http://bob:pw@other.example.com:8080'); - Network accessline 74
record(CRED_PROXY); const stored = getDomainClearance('example.com')!; expect(routeMatchesClearance(stored.solvedRoute, 'http://elsewhere.example:3128')).toBe(false); - Network accessline 75
const stored = getDomainClearance('example.com')!; expect(routeMatchesClearance(stored.solvedRoute, 'http://elsewhere.example:3128')).toBe(false); }); - Network accessline 76
expect(routeMatchesClearance(stored.solvedRoute, 'http://elsewhere.example:3128')).toBe(false); - Network accessline 85
it('normalizes both sides of the comparison identically', () => { expect(normalizeClearanceRoute(CRED_PROXY)).toBe( normalizeClearanceRoute('http://proxy.example.com:8080'), - Network accessline 86
expect(normalizeClearanceRoute(CRED_PROXY)).toBe( normalizeClearanceRoute('http://proxy.example.com:8080'), ); - Network accessline 87
normalizeClearanceRoute('http://proxy.example.com:8080'),
tests/unit/cache/db-embedding.test.ts
- Executable scriptline 1
Executable file - Network accessline 47
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), ?, ?, ?) `).run( 'https://test.com', 'https://test.com', 'Test', 'content', '<html>', - Network accessline 48
`).run( 'https://test.com', 'https://test.com', 'Test', 'content', '<html>', '{}', '[]', '[]', 'http', 'defuddle', - Network accessline 49
'https://test.com', 'https://test.com', 'Test', 'content', '<html>', - Network accessline 54
const row = db.prepare( 'SELECT embedding, embedding_model, embedding_dims FROM url_cache WHERE url = ?', ).get('https://test.com') as { embedding: Buffer; embedding_model: string; embedding_dims: number }; - Network accessline 56
).get('https://test.com') as { embedding: Buffer; embedding_model: string; embedding_dims: number }; - Network accessline 75
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now')) `).run( 'https://noembedding.com', 'https://noembedding.com', 'No Emb', '', '', - Network accessline 76
`).run( 'https://noembedding.com', 'https://noembedding.com', 'No Emb', '', '', '{}', '[]', '[]', 'http', 'defuddle', 'hash123', - Network accessline 77
'https://noembedding.com', 'https://noembedding.com', 'No Emb', '', '', - Network accessline 81
const row = db.prepare( 'SELECT embedding, embedding_model, embedding_dims FROM url_cache WHERE url = ?', ).get('https://noembedding.com') as { embedding: null; embedding_model: null; embedding_dims: null }; - Network accessline 83
).get('https://noembedding.com') as { embedding: null; embedding_model: null; embedding_dims: null };
tests/unit/cache/db-exit-hook.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/db-vec-packaged.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/db.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/diff-engine.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/diff-summary.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/domain-routing-admin.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/lcs.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/migrations-runner.test.ts
- Executable scriptline 1
Executable file
tests/unit/cache/sanitize-fts-query.test.ts
- Executable scriptline 1
Executable file - Network accessline 38
it('quotes URLs and slashes', () => { expect(sanitizeFtsQuery('https://example.com')).toBe('"https://example.com"'); - Network accessline 39
expect(sanitizeFtsQuery('https://example.com')).toBe('"https://example.com"'); - Network accessline 62
it('searchCache does not throw on version-with-period queries', () => { cacheContent(makeRaw('https://example.com/ts'), makeExtracted('TypeScript 5.4', 'TypeScript 5.4 brings narrowing improvements')); - Network accessline 63
cacheContent(makeRaw('https://example.com/ts'), makeExtracted('TypeScript 5.4', 'TypeScript 5.4 brings narrowing improvements')); - Network accessline 67
it('searchCacheFiltered does not throw on version queries', () => { cacheContent(makeRaw('https://example.com/ts'), makeExtracted('TypeScript 5.4', 'release notes')); - Network accessline 68
cacheContent(makeRaw('https://example.com/ts'), makeExtracted('TypeScript 5.4', 'release notes'));
tests/unit/cache/sqlite-vec-store.test.ts
- Executable scriptline 1
Executable file - Network accessline 41
it('upsert + size + search round-trips', async () => { const records: VectorRecord[] = [ { id: 'a', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 42
const records: VectorRecord[] = [ { id: 'a', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, { id: 'b', vector: new Float32Array([0, 1, 0, 0]), metadata: { url: 'http - Network accessline 43
{ id: 'a', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 44
{ id: 'b', vector: new Float32Array([0, 1, 0, 0]), metadata: { url: 'https://b', contentHash: 'hb', modelId: 'test' } }, - Network accessline 45
{ id: 'c', vector: new Float32Array([0.9, 0.1, 0, 0]), metadata: { url: 'https://c', contentHash: 'hc', modelId: 'test' } }, - Network accessline 54
expect(results[1].id).toBe('c'); expect(results[0].score).toBeGreaterThan(results[1].score); expect(results[0].metadata.url).toBe('https://a'); - Network accessline 55
expect(results[0].score).toBeGreaterThan(results[1].score); expect(results[0].metadata.url).toBe('https://a'); }); - Network accessline 56
expect(results[0].metadata.url).toBe('https://a'); - Network accessline 84
it('filters by url and contentHash', async () => { await store.upsert([ { id: 'a', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://a', contentHash: 'h1', modelId: 'm' } }, - Network accessline 85
await store.upsert([ { id: 'a', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://a', contentHash: 'h1', modelId: 'm' } }, { id: 'b', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://b', contentH - Network accessline 86
{ id: 'a', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://a', contentHash: 'h1', modelId: 'm' } }, - Network accessline 87
{ id: 'b', vector: new Float32Array([1, 0, 0, 0]), metadata: { url: 'https://b', contentHash: 'h2', modelId: 'm' } }, - Network accessline 90
const byUrl = await store.search(new Float32Array([1, 0, 0, 0]), 10, { url: 'https://b' });
tests/unit/cache/stale-window.test.ts
- Executable scriptline 1
Executable file - Network accessline 70
cacheSearchResults( 'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 71
'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], ['e'], - Network accessline 72
[{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 82
cacheSearchResults( 'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 83
'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], ['e'], - Network accessline 84
[{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 97
cacheSearchResults( 'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 98
'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], ['e'], - Network accessline 99
[{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 109
cacheSearchResults( 'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], - Network accessline 110
'q', [{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }], ['e'], - Network accessline 111
[{ title: 't', url: 'https://u.example', snippet: 's', relevance_score: 1 }],
tests/unit/cache/store-embedding.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
resetConfig(); initDatabase(':memory:'); seedPage('https://example.com/page'); - Network accessline 34
initDatabase(':memory:'); seedPage('https://example.com/page'); }); - Network accessline 35
seedPage('https://example.com/page'); - Network accessline 48
const updated = updateCacheEmbedding('https://example.com/page', buffer, 'bge-small-en-v1.5', 3); - Network accessline 52
const row = db.prepare( 'SELECT embedding, embedding_model, embedding_dims FROM url_cache WHERE normalized_url = ?', ).get('https://example.com/page') as { embedding: Buffer; embedding_model: string; embedding_dims: number }; - Network accessline 54
).get('https://example.com/page') as { embedding: Buffer; embedding_model: string; embedding_dims: number }; - Network accessline 64
const updated = updateCacheEmbedding('https://nonexistent.com', buffer, 'bge-small-en-v1.5', 1); - Network accessline 72
const r1 = updateCacheEmbedding('https://example.com/page', v1, 'model-a', 2); - Network accessline 75
const r2 = updateCacheEmbedding('https://example.com/page', v2, 'model-b', 2); - Network accessline 78
const result = getEmbeddingForUrl('https://example.com/page'); - Network accessline 83
it('handles empty buffer gracefully', () => { const updated = updateCacheEmbedding('https://example.com/page', Buffer.alloc(0), 'model', 0); - Network accessline 84
const updated = updateCacheEmbedding('https://example.com/page', Buffer.alloc(0), 'model', 0); - Network accessline 94
seedPage('https://example.com/embedded'); - Network accessline 96
const vector = new Float32Array([0.1, 0.2, 0.3]); updateCacheEmbedding('https://example.com/embedded', Buffer.from(vector.buffer), 'bge-small-en-v1.5', 3); - Network accessline 97
updateCacheEmbedding('https://example.com/embedded', Buffer.from(vector.buffer), 'bge-small-en-v1.5', 3); - Network accessline 105
it('returns embedding data for a URL with embedding', () => { const result = getEmbeddingForUrl('https://example.com/embedded'); - Network accessline 106
const result = getEmbeddingForUrl('https://example.com/embedded'); - Network accessline 113
it('returns null for URL without embedding', () => { seedPage('https://example.com/no-emb'); - Network accessline 114
seedPage('https://example.com/no-emb'); - Network accessline 116
const result = getEmbeddingForUrl('https://example.com/no-emb'); - Network accessline 120
it('returns null for non-existent URL', () => { const result = getEmbeddingForUrl('https://nonexistent.com'); - Network accessline 121
const result = getEmbeddingForUrl('https://nonexistent.com'); - Network accessline 137
it('returns all URLs with embeddings', () => { for (const url of ['https://a.com', 'https://b.com']) { - Network accessline 138
for (const url of ['https://a.com', 'https://b.com']) { - Network accessline 144
seedPage('https://c.com');
tests/unit/cache/store-search-key.test.ts
- Executable scriptline 1
Executable file - Network accessline 10
const sampleResults: SearchResultItem[] = [ { title: 'doc', url: 'https://example.com', snippet: 's', relevance_score: 1 }, - Network accessline 11
{ title: 'doc', url: 'https://example.com', snippet: 's', relevance_score: 1 }, - Network accessline 105
const cached = getCachedSearchResults(key); expect(cached).not.toBeNull(); expect(cached!.results[0].url).toBe('https://example.com'); - Network accessline 106
expect(cached).not.toBeNull(); expect(cached!.results[0].url).toBe('https://example.com'); }); - Network accessline 107
expect(cached!.results[0].url).toBe('https://example.com');
tests/unit/cache/store.test.ts
- Executable scriptline 1
Executable file - Network accessline 37
markdown: '# Hello\n\nThis is a test page with some content.', metadata: { description: 'A test page', author: 'Tester' }, links: ['https://example.com/other'], - Network accessline 38
metadata: { description: 'A test page', author: 'Tester' }, links: ['https://example.com/other'], images: ['https://example.com/img.png'], - Network accessline 39
links: ['https://example.com/other'], - Network accessline 40
images: ['https://example.com/img.png'], - Network accessline 46
describe('normalizeUrl', () => { it('strips utm_source param', () => { expect(normalizeUrl('https://example.com/page?utm_source=google')).toBe('https://example.com/page'); - Network accessline 47
it('strips utm_source param', () => { expect(normalizeUrl('https://example.com/page?utm_source=google')).toBe('https://example.com/page'); }); - Network accessline 48
expect(normalizeUrl('https://example.com/page?utm_source=google')).toBe('https://example.com/page'); - Network accessline 51
it('strips utm_medium param', () => { expect(normalizeUrl('https://example.com/page?utm_medium=email')).toBe('https://example.com/page'); - Network accessline 52
expect(normalizeUrl('https://example.com/page?utm_medium=email')).toBe('https://example.com/page'); - Network accessline 55
it('strips utm_campaign param', () => { expect(normalizeUrl('https://example.com/page?utm_campaign=spring')).toBe('https://example.com/page'); - Network accessline 56
expect(normalizeUrl('https://example.com/page?utm_campaign=spring')).toBe('https://example.com/page'); - Network accessline 59
it('strips utm_content param', () => { expect(normalizeUrl('https://example.com/page?utm_content=cta')).toBe('https://example.com/page'); - Network accessline 60
expect(normalizeUrl('https://example.com/page?utm_content=cta')).toBe('https://example.com/page'); - Network accessline 63
it('strips utm_term param', () => { expect(normalizeUrl('https://example.com/page?utm_term=keyword')).toBe('https://example.com/page'); - Network accessline 64
expect(normalizeUrl('https://example.com/page?utm_term=keyword')).toBe('https://example.com/page'); - Network accessline 67
it('strips fbclid param', () => { expect(normalizeUrl('https://example.com/page?fbclid=abc123')).toBe('https://example.com/page'); - Network accessline 68
expect(normalizeUrl('https://example.com/page?fbclid=abc123')).toBe('https://example.com/page'); - Network accessline 71
it('strips multiple tracking params and preserves others', () => { const url = 'https://example.com/page?id=42&utm_source=twitter&fbclid=xyz'; - Network accessline 72
const url = 'https://example.com/page?id=42&utm_source=twitter&fbclid=xyz'; - Network accessline 73
expect(normalizeUrl(url)).toBe('https://example.com/page?id=42'); - Network accessline 76
it('removes www prefix', () => { expect(normalizeUrl('https://www.example.com/page')).toBe('https://example.com/page'); - Network accessline 77
expect(normalizeUrl('https://www.example.com/page')).toBe('https://example.com/page'); - Network accessline 80
it('strips trailing slash from path', () => { expect(normalizeUrl('https://example.com/page/')).toBe('https://example.com/page'); - Network accessline 81
expect(normalizeUrl('https://example.com/page/')).toBe('https://example.com/page'); - Network accessline 84
it('does not strip slash from root path', () => { const result = normalizeUrl('https://example.com/'); - Network accessline 85
const result = normalizeUrl('https://example.com/'); - Network accessline 86
expect(result).toBe('https://example.com'); - Network accessline 89
it('lowercases scheme and host', () => { expect(normalizeUrl('HTTPS://Example.COM/Page')).toBe('https://example.com/Page'); - Network accessline 90
expect(normalizeUrl('HTTPS://Example.COM/Page')).toBe('https://example.com/Page'); - Network accessline 93
it('handles URL with no params cleanly', () => { expect(normalizeUrl('https://example.com/article')).toBe('https://example.com/article'); - Network accessline 94
expect(normalizeUrl('https://example.com/article')).toBe('https://example.com/article'); - Network accessline 107
it('inserts and retrieves content by exact URL', () => { const url = 'https://example.com/article'; - Network accessline 108
const url = 'https://example.com/article'; - Network accessline 117
it('retrieves content by normalized URL (www vs non-www)', () => { const urlWithWww = 'https://www.example.com/article'; - Network accessline 118
const urlWithWww = 'https://www.example.com/article'; - Network accessline 119
cacheContent(makeRaw(urlWithWww), makeExtraction()); const result = getCachedContent('https://example.com/article'); expect(result).not.toBeNull(); - Network accessline 120
const result = getCachedContent('https://example.com/article'); - Network accessline 121
expect(result).not.toBeNull(); expect(result!.normalizedUrl).toBe('https://example.com/article'); }); - Network accessline 122
expect(result!.normalizedUrl).toBe('https://example.com/article'); - Network accessline 125
it('retrieves content by URL with tracking params stripped', () => { const url = 'https://example.com/article'; - Network accessline 126
const url = 'https://example.com/article'; - Network accessline 127
cacheContent(makeRaw(url), makeExtraction()); const result = getCachedContent('https://example.com/article?utm_source=google'); expect(result).not.toBeNull(); - Network accessline 128
const result = getCachedContent('https://example.com/article?utm_source=google'); - Network accessline 133
it('stores serialized metadata as JSON string', () => { const url = 'https://example.com/meta'; - Network accessline 134
const url = 'https://example.com/meta'; - Network accessline 143
it('stores serialized links as JSON string', () => { const url = 'https://example.com/links'; - Network accessline 144
const url = 'https://example.com/links'; - Network accessline 148
expect(typeof result!.links).toBe('string'); const parsed = JSON.parse(result!.links); expect(parsed).toContain('https://example.com/other'); - Network accessline 149
const parsed = JSON.parse(result!.links); expect(parsed).toContain('https://example.com/other'); }); - Network accessline 150
expect(parsed).toContain('https://example.com/other'); - Network accessline 153
it('stores serialized images as JSON string', () => { const url = 'https://example.com/images'; - Network accessline 154
const url = 'https://example.com/images'; - Network accessline 158
expect(typeof result!.images).toBe('string'); const parsed = JSON.parse(result!.images); expect(parsed).toContain('https://example.com/img.png'); - Network accessline 159
const parsed = JSON.parse(result!.images); expect(parsed).toContain('https://example.com/img.png'); }); - Network accessline 160
expect(parsed).toContain('https://example.com/img.png'); - Network accessline 163
it('stores content_hash as SHA-256 hex string', () => { const url = 'https://example.com/hash'; - Network accessline 164
const url = 'https://example.com/hash'; - Network accessline 171
it('stores fetchMethod from RawFetchResult', () => { const raw = makeRaw('https://example.com/method'); - Network accessline 172
const raw = makeRaw('https://example.com/method'); - Network accessline 173
raw.method = 'browser'; cacheContent(raw, makeExtraction()); const result = getCachedContent('https://example.com/method'); - Network accessline 174
cacheContent(raw, makeExtraction()); const result = getCachedContent('https://example.com/method'); expect(result!.fetchMethod).toBe('browser'); - Network accessline 175
const result = getCachedContent('https://example.com/method'); - Network accessline 179
it('stores extractorUsed from ExtractionResult', () => { const url = 'https://example.com/extractor'; - Network accessline 180
const url = 'https://example.com/extractor'; - Network accessline 186
it('returns null for unknown URL', () => { const result = getCachedContent('https://notcached.example.com/'); - Network accessline 187
const result = getCachedContent('https://notcached.example.com/'); - Network accessline 191
it('replaces existing entry on re-insert (upsert by normalizedUrl)', () => { const url = 'https://example.com/replace'; - Network accessline 192
const url = 'https://example.com/replace'; - Network accessline 199
it('stores expiresAt as ISO datetime string', () => { const url = 'https://example.com/expires'; - Network accessline 200
const url = 'https://example.com/expires'; - Network accessline 207
it('roundtrips content_completeness from RawFetchResult through the cache', () => { const url = 'https://example.com/completeness'; - Network accessline 208
const url = 'https://example.com/completeness'; - Network accessline 221
it('leaves contentCompleteness undefined when the RawFetchResult lacks it (HTTP tier)', () => { const url = 'https://example.com/no-completeness'; - Network accessline 222
const url = 'https://example.com/no-completeness'; - Network accessline 240
it('returns false for freshly cached content', () => { const url = 'https://example.com/fresh'; - Network accessline 241
const url = 'https://example.com/fresh'; - Network accessline 248
const expired: CachedContent = { id: 1, url: 'https://example.com', - Network accessline 249
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 250
url: 'https://example.com', - Network accessline 251
normalizedUrl: 'https://example.com', - Network accessline 268
const noExpiry: CachedContent = { id: 1, url: 'https://example.com', - Network accessline 269
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 270
url: 'https://example.com', - Network accessline 271
normalizedUrl: 'https://example.com', - Network accessline 297
it('finds cached content by keyword in title', () => { cacheContent(makeRaw('https://example.com/typescript'), makeExtraction({ title: 'TypeScript Guide' })); - Network accessline 298
cacheContent(makeRaw('https://example.com/typescript'), makeExtraction({ title: 'TypeScript Guide' })); - Network accessline 304
it('finds cached content by keyword in markdown', () => { cacheContent( makeRaw('https://example.com/rust'), - Network accessline 305
cacheContent( makeRaw('https://example.com/rust'), makeExtraction({ title: 'Rust Intro', markdown: '# Rust\n\nOwnership and borrowing.' }) - Network accessline 306
makeRaw('https://example.com/rust'), - Network accessline 309
const results = searchCache('borrowing'); expect(results.length).toBeGreaterThan(0); expect(results[0].url).toBe('https://example.com/rust'); - Network accessline 310
expect(results.length).toBeGreaterThan(0); expect(results[0].url).toBe('https://example.com/rust'); }); - Network accessline 311
expect(results[0].url).toBe('https://example.com/rust'); - Network accessline 314
it('returns empty array when no match', () => { cacheContent(makeRaw('https://example.com/go'), makeExtraction({ title: 'Go Language' })); - Network accessline 315
cacheContent(makeRaw('https://example.com/go'), makeExtraction({ title: 'Go Language' })); - Network accessline 320
it('returns multiple results when multiple entries match', () => { cacheContent(makeRaw('https://example.com/a'), makeExtraction({ title: 'JavaScript basics' })); - Network accessline 321
cacheContent(makeRaw('https://example.com/a'), makeExtraction({ title: 'JavaScript basics' })); - Network accessline 322
cacheContent(makeRaw('https://example.com/b'), makeExtraction({ title: 'Advanced JavaScript' })); - Network accessline 327
it('FTS triggers fire after insert (search works immediately)', () => { cacheContent(makeRaw('https://example.com/trigger-test'), makeExtraction({ title: 'TriggerFired' })); - Network accessline 328
cacheContent(makeRaw('https://example.com/trigger-test'), makeExtraction({ title: 'TriggerFired' })); - Network accessline 343
it('caches and retrieves search results by query', () => { const results: SearchResultItem[] = [ { title: 'React', url: 'https://react.dev', snippet: 'UI lib', relevance_score: 0.95 }, - Network accessline 344
const results: SearchResultItem[] = [ { title: 'React', url: 'https://react.dev', snippet: 'UI lib', relevance_score: 0.95 }, ]; - Network accessline 345
{ title: 'React', url: 'https://react.dev', snippet: 'UI lib', relevance_score: 0.95 }, - Network accessline 362
it('updates cache on re-search of same query', () => { const results1: SearchResultItem[] = [ { title: 'Old', url: 'https://old.com', snippet: '', relevance_score: 0.5 }, - Network accessline 363
const results1: SearchResultItem[] = [ { title: 'Old', url: 'https://old.com', snippet: '', relevance_score: 0.5 }, ]; - Network accessline 364
{ title: 'Old', url: 'https://old.com', snippet: '', relevance_score: 0.5 }, - Network accessline 365
]; const results2: SearchResultItem[] = [ { title: 'New', url: 'https://new.com', snippet: '', relevance_score: 0.9 }, - Network accessline 366
const results2: SearchResultItem[] = [ { title: 'New', url: 'https://new.com', snippet: '', relevance_score: 0.9 }, ]; - Network accessline 367
{ title: 'New', url: 'https://new.com', snippet: '', relevance_score: 0.9 }, - Network accessline 396
it('returns correct counts after caching content', () => { cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'A content' })); - Network accessline 397
cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'A content' })); - Network accessline 398
cacheContent(makeRaw('https://example.com/b'), makeExtraction({ markdown: 'B content' })); - Network accessline 414
it('cached_at of the most recently cached entry equals stats.newest (M19)', () => { cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'A content' })); - Network accessline 415
cacheContent(makeRaw('https://example.com/a'), makeExtraction({ markdown: 'A content' })); - Network accessline 420
const cachedA = getCachedContent('https://example.com/a'); - Network accessline 431
initDatabase(':memory:'); cacheContent( makeRaw('https://example.com/page1'), - Network accessline 432
cacheContent( makeRaw('https://example.com/page1'), makeExtraction({ title: 'TypeScript Guide', markdown: '# TypeScript\n\nLearn TypeScript basics.' }), - Network accessline 433
makeRaw('https://example.com/page1'), - Network accessline 435
); cacheContent( makeRaw('https://docs.python.org/tutorial'), - Network accessline 436
cacheContent( makeRaw('https://docs.python.org/tutorial'), makeExtraction({ title: 'Python Tutorial', markdown: '# Python\n\nLearn Python programming.' }), - Network accessline 437
makeRaw('https://docs.python.org/tutorial'), - Network accessline 439
); cacheContent( makeRaw('https://example.com/page2'), - Network accessline 440
cacheContent( makeRaw('https://example.com/page2'), makeExtraction({ title: 'React Hooks', markdown: '# React Hooks\n\nUseState and useEffect.' }), - Network accessline 441
makeRaw('https://example.com/page2'), - Network accessline 505
initDatabase(':memory:'); cacheContent( makeRaw('https://example.com/page1'), - Network accessline 506
cacheContent( makeRaw('https://example.com/page1'), makeExtraction({ title: 'Page 1', markdown: 'TypeScript content' }), - Network accessline 507
makeRaw('https://example.com/page1'), - Network accessline 509
); cacheContent( makeRaw('https://docs.python.org/tutorial'), - Network accessline 510
cacheContent( makeRaw('https://docs.python.org/tutorial'), makeExtraction({ title: 'Python', markdown: 'Python content' }), - Network accessline 511
makeRaw('https://docs.python.org/tutorial'), - Network accessline 513
); cacheContent( makeRaw('https://example.com/page2'), - Network accessline 514
cacheContent( makeRaw('https://example.com/page2'), makeExtraction({ title: 'Page 2', markdown: 'React content' }), - Network accessline 515
makeRaw('https://example.com/page2'), - Network accessline 560
it('returns the content_hash for a cached URL', () => { const raw = makeRaw('https://example.com/page'); - Network accessline 561
const raw = makeRaw('https://example.com/page'); - Network accessline 565
const hash = getHashForNormalizedUrl(normalizeUrl('https://example.com/page')); - Network accessline 571
it('returns null for an uncached URL', () => { const hash = getHashForNormalizedUrl('https://not-cached.com'); - Network accessline 572
const hash = getHashForNormalizedUrl('https://not-cached.com'); - Network accessline 576
it('finds the hash via normalized URL even when original differs', () => { const raw = makeRaw('https://www.example.com/page/?utm_source=google'); - Network accessline 577
const raw = makeRaw('https://www.example.com/page/?utm_source=google'); - Network accessline 581
const hash = getHashForNormalizedUrl(normalizeUrl('https://example.com/page')); - Network accessline 586
it('returns the most recent hash when URL was cached multiple times', () => { const raw = makeRaw('https://example.com/page'); - Network accessline 587
const raw = makeRaw('https://example.com/page'); - Network accessline 591
const hash = getHashForNormalizedUrl(normalizeUrl('https://example.com/page')); - Network accessline 595
it('handles URLs with unicode characters', () => { const raw = makeRaw('https://example.com/cafe'); - Network accessline 596
const raw = makeRaw('https://example.com/cafe'); - Network accessline 599
const hash = getHashForNormalizedUrl(normalizeUrl('https://example.com/cafe')); - Network accessline 613
it('returns the markdown for a cached URL', () => { const raw = makeRaw('https://example.com/page'); - Network accessline 614
const raw = makeRaw('https://example.com/page'); - Network accessline 618
const md = getMarkdownForNormalizedUrl(normalizeUrl('https://example.com/page')); - Network accessline 622
it('returns null for an uncached URL', () => { const md = getMarkdownForNormalizedUrl('https://not-cached.com'); - Network accessline 623
const md = getMarkdownForNormalizedUrl('https://not-cached.com'); - Network accessline 627
it('finds markdown via normalized URL', () => { const raw = makeRaw('https://www.example.com/page/'); - Network accessline 628
const raw = makeRaw('https://www.example.com/page/'); - Network accessline 632
const md = getMarkdownForNormalizedUrl(normalizeUrl('https://example.com/page')); - Network accessline 636
it('handles empty markdown', () => { const raw = makeRaw('https://example.com/empty'); - Network accessline 637
const raw = makeRaw('https://example.com/empty'); - Network accessline 641
const md = getMarkdownForNormalizedUrl(normalizeUrl('https://example.com/empty')); - Network accessline 645
it('handles very long markdown content', () => { const longContent = 'Line\n'.repeat(10000); const raw = makeRaw('https://example.com/long'); - Network accessline 646
const longContent = 'Line\n'.repeat(10000); const raw = makeRaw('https://example.com/long'); const extraction = makeExtraction({ markdown: longContent }); - Network accessline 647
const raw = makeRaw('https://example.com/long'); - Network accessline 651
const md = getMarkdownForNormalizedUrl(normalizeUrl('https://example.com/long')); - Network accessline 673
it('returns both hash and status for a cached URL with status persisted', () => { const raw = makeRaw('https://example.com/page'); - Network accessline 674
const raw = makeRaw('https://example.com/page'); - Network accessline 678
const out = getHashAndStatusForNormalizedUrl(normalizeUrl('https://example.com/page')); - Network accessline 686
it('returns status=null when the row has a hash but no http_status (legacy / pre-migration)', () => { const raw: RawFetchResult = { url: 'https://example.com/legacy', - Network accessline 687
const raw: RawFetchResult = { url: 'https://example.com/legacy', finalUrl: 'https://example.com/legacy', - Network accessline 688
url: 'https://example.com/legacy', - Network accessline 689
finalUrl: 'https://example.com/legacy', - Network accessline 698
const out = getHashAndStatusForNormalizedUrl(normalizeUrl('https://example.com/legacy')); - Network accessline 704
it('returns hash=null and status=null when the URL is absent from cache', () => { const out = getHashAndStatusForNormalizedUrl('https://uncached.example.com/missing'); - Network accessline 705
const out = getHashAndStatusForNormalizedUrl('https://uncached.example.com/missing'); - Network accessline 710
it('agrees with the single-column helpers for a populated row', () => { const raw = makeRaw('https://example.com/agree'); - Network accessline 711
const raw = makeRaw('https://example.com/agree'); - Network accessline 713
const norm = normalizeUrl('https://example.com/agree'); - Network accessline 747
function makeCached(expiresAt: string): CachedContent { return { url: 'https://tz.test/', - Network accessline 748
return { url: 'https://tz.test/', normalizedUrl: 'https://tz.test', - Network accessline 749
url: 'https://tz.test/', - Network accessline 750
normalizedUrl: 'https://tz.test',
tests/unit/cache/tls-routing.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/agent-support-consistency.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/claude-code.test.ts
tests/unit/cli/agents/cline.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/codex.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/opencode.test.ts
- Executable scriptline 1
Executable file - Network accessline 64
"theme": "opencode", "mcp": { "current": { "type": "remote", "url": "https://example.com/current" }, - Network accessline 65
"mcp": { "current": { "type": "remote", "url": "https://example.com/current" }, }, - Network accessline 66
"current": { "type": "remote", "url": "https://example.com/current" }, - Network accessline 71
"theme": "opencode", "mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 72
"mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, "wigolo": { "type": "local", "command": "npx", "args": ["-y", "wigolo"] }, - Network accessline 73
"other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 107
"theme": "opencode", "mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 108
"mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, "wigolo": { "type": "local", "command": ["npx", "-y", "wigolo"], "enabled": true }, - Network accessline 109
"other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 115
"formatter": { "prettier": { "command": ["prettier", "--write", "$FILE"] } }, "mcp": { "other": { "type": "remote", "url": "https://example.com/legacy" }, - Network accessline 116
"mcp": { "other": { "type": "remote", "url": "https://example.com/legacy" }, "wigolo": { "type": "local", "command": "npx", "args": ["-y", "wigolo"] }, - Network accessline 117
"other": { "type": "remote", "url": "https://example.com/legacy" },
tests/unit/cli/agents/registry.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/skills-content.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/skills/catalog.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/skills/executor.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/skills/planner.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/skills/receipts.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/skills/targets.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/utils.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/vscode.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/windsurf.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/agents/zed.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/auth.test.ts
- Executable scriptline 1
Executable file - Network accessline 48
describe('discover subcommand', () => { it('outputs session list when sessions are found', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 49
it('outputs session list when sessions are found', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; resetConfig(); - Network accessline 50
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 53
vi.mocked(listSessions).mockResolvedValue([ { id: 'ABC', url: 'https://google.com', title: 'Google', webSocketDebuggerUrl: 'ws://localhost:9222/ABC' }, - Network accessline 54
{ id: 'ABC', url: 'https://google.com', title: 'Google', webSocketDebuggerUrl: 'ws://localhost:9222/ABC' }, - Network accessline 55
{ id: 'DEF', url: 'https://github.com', title: 'GitHub', webSocketDebuggerUrl: 'ws://localhost:9222/DEF' }, - Network accessline 61
expect(output).toContain('Google'); expect(output).toContain('GitHub'); expect(output).toContain('https://google.com'); - Network accessline 62
expect(output).toContain('GitHub'); expect(output).toContain('https://google.com'); expect(output).toContain('https://github.com'); - Network accessline 63
expect(output).toContain('https://google.com'); - Network accessline 64
expect(output).toContain('https://github.com'); - Network accessline 69
it('outputs no-sessions message when CDP returns empty', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 70
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 93
it('handles listSessions error gracefully', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 94
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 106
it('outputs session IDs for programmatic use', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 107
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 110
vi.mocked(listSessions).mockResolvedValue([ { id: 'X1', url: 'https://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x/X1' }, - Network accessline 111
{ id: 'X1', url: 'https://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x/X1' }, - Network accessline 121
it('handles unicode in session titles', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 122
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 125
vi.mocked(listSessions).mockResolvedValue([ { id: '1', url: 'https://a.com', title: 'Uber uns - Willkommen', webSocketDebuggerUrl: 'ws://x/1' }, - Network accessline 126
{ id: '1', url: 'https://a.com', title: 'Uber uns - Willkommen', webSocketDebuggerUrl: 'ws://x/1' }, - Network accessline 162
it('shows configured CDP URL', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 163
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 168
const output = stderrOutput.join(''); expect(output).toContain('http://localhost:9222'); - Network accessline 169
expect(output).toContain('http://localhost:9222');
tests/unit/cli/config-dispatch.test.ts
tests/unit/cli/config.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/daemon.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
this.host = options.host; } start = vi.fn().mockResolvedValue('http://127.0.0.1:3333'); - Network accessline 13
} start = vi.fn().mockResolvedValue('http://127.0.0.1:3333'); stop = vi.fn().mockResolvedValue(undefined); - Network accessline 14
start = vi.fn().mockResolvedValue('http://127.0.0.1:3333'); - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Access to secretsline 152
[Credential-related source omitted] - Access to secretsline 203
[Credential-related source omitted] - Access to secretsline 239
[Credential-related source omitted]
tests/unit/cli/doctor-engine-health.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 114
const result: RawSearchResult = { title: 'T', url: 'https://a.com', - Network accessline 115
title: 'T', url: 'https://a.com', snippet: 'S', - Network accessline 116
url: 'https://a.com',
tests/unit/cli/doctor-fixes.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/doctor-isolated.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/doctor-lazy.test.ts
- Executable scriptline 1
Executable file - Network accessline 125
it('reports a configured remote reranker without checking the ONNX cache', async () => { process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; - Network accessline 126
process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; resetConfig(); - Network accessline 127
process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1';
tests/unit/cli/doctor-ollama.test.ts
- Executable scriptline 1
Executable file - Network accessline 10
it('returns the picked model when the pick resolves in time', async () => { const pick = vi.fn(async () => 'llama3.1:8b'); expect(await resolveOllamaModelBounded('http://localhost:11434', pick, 400)).toBe('llama3.1:8b'); - Network accessline 11
const pick = vi.fn(async () => 'llama3.1:8b'); expect(await resolveOllamaModelBounded('http://localhost:11434', pick, 400)).toBe('llama3.1:8b'); }); - Network accessline 12
expect(await resolveOllamaModelBounded('http://localhost:11434', pick, 400)).toBe('llama3.1:8b'); - Network accessline 27
); const start = Date.now(); const result = await resolveOllamaModelBounded('http://localhost:11434', pick, 30); - Network accessline 28
const start = Date.now(); const result = await resolveOllamaModelBounded('http://localhost:11434', pick, 30); const elapsed = Date.now() - start; - Network accessline 29
const result = await resolveOllamaModelBounded('http://localhost:11434', pick, 30); - Network accessline 37
throw new Error('boom'); }); expect(await resolveOllamaModelBounded('http://localhost:11434', pick, 400)).toBeUndefined(); - Network accessline 38
}); expect(await resolveOllamaModelBounded('http://localhost:11434', pick, 400)).toBeUndefined(); }); - Network accessline 39
expect(await resolveOllamaModelBounded('http://localhost:11434', pick, 400)).toBeUndefined(); - Network accessline 54
ollamaActive: true, reachable: true, baseUrl: 'http://localhost:11434', - Network accessline 55
reachable: true, baseUrl: 'http://localhost:11434', model: 'm\x1b[2Jx', - Network accessline 56
baseUrl: 'http://localhost:11434', - Network accessline 70
ollamaActive: false, reachable: true, baseUrl: 'http://localhost:11434', - Network accessline 71
reachable: true, baseUrl: 'http://localhost:11434', }); - Network accessline 72
baseUrl: 'http://localhost:11434', - Network accessline 74
const joined = lines.join('\n'); expect(joined).toMatch(/local llm server detected/i); expect(joined).toContain('http://localhost:11434'); - Network accessline 75
expect(joined).toMatch(/local llm server detected/i); expect(joined).toContain('http://localhost:11434'); expect(joined).toMatch(/WIGOLO_LLM_PROVIDER=ollama/); - Network accessline 76
expect(joined).toContain('http://localhost:11434'); - Network accessline 86
ollamaActive: false, reachable: true, baseUrl: 'http://localhost:11434', - Network accessline 87
reachable: true, baseUrl: 'http://localhost:11434', }); - Network accessline 88
baseUrl: 'http://localhost:11434', - Network accessline 97
ollamaActive: false, reachable: false, baseUrl: 'http://localhost:11434', - Network accessline 98
reachable: false, baseUrl: 'http://localhost:11434', }); - Network accessline 99
baseUrl: 'http://localhost:11434', - Network accessline 109
ollamaActive: true, reachable: true, baseUrl: 'http://localhost:11434', - Network accessline 110
reachable: true, baseUrl: 'http://localhost:11434', model: 'llama3.1:8b', - Network accessline 111
baseUrl: 'http://localhost:11434', - Network accessline 114
const joined = lines.join('\n'); expect(joined).toMatch(/ollama/i); expect(joined).toContain('http://localhost:11434'); - Network accessline 115
expect(joined).toMatch(/ollama/i); expect(joined).toContain('http://localhost:11434'); expect(joined).toContain('llama3.1:8b'); - Network accessline 116
expect(joined).toContain('http://localhost:11434'); - Network accessline 126
ollamaActive: true, reachable: false, baseUrl: 'http://localhost:11434', - Network accessline 127
reachable: false, baseUrl: 'http://localhost:11434', }); - Network accessline 128
baseUrl: 'http://localhost:11434', - Network accessline 147
const lines = buildLocalTierDoctorLines({ localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' }, - Network accessline 148
localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' }, }); - Network accessline 149
tier: { available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' }, - Network accessline 151
const joined = lines.join('\n'); expect(joined).toMatch(/auto/); expect(joined).toContain('http://localhost:11434'); - Network accessline 152
expect(joined).toMatch(/auto/); expect(joined).toContain('http://localhost:11434'); expect(joined).toContain('qwen2.5:7b-instruct'); - Network accessline 153
expect(joined).toContain('http://localhost:11434'); - Network accessline 168
const lines = buildLocalTierDoctorLines({ localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'm\x1b[2Jx', source: 'auto' }, - Network accessline 169
localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'm\x1b[2Jx', source: 'auto' }, }); - Network accessline 170
tier: { available: true, endpoint: 'http://localhost:11434', model: 'm\x1b[2Jx', source: 'auto' },
tests/unit/cli/doctor-provider.test.ts
tests/unit/cli/doctor-tls-tier.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/doctor.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 50
[Credential-related source omitted] - Dangerous shell operationline 191
expect(outBuffer).toContain('sudo npx playwright install-deps chromium'); - Access to secretsline 220
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 223
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Access to secretsline 252
[Credential-related source omitted] - Access to secretsline 259
[Credential-related source omitted] - Network accessline 270
it('shows custom URL when WIGOLO_LLM_PROVIDER is URL', async () => { process.env.WIGOLO_LLM_PROVIDER = 'http://localhost:11434'; - Network accessline 271
process.env.WIGOLO_LLM_PROVIDER = 'http://localhost:11434'; - Access to secretsline 281
[Credential-related source omitted] - Access to secretsline 282
[Credential-related source omitted] - Access to secretsline 299
[Credential-related source omitted] - Access to secretsline 300
[Credential-related source omitted] - Access to secretsline 313
[Credential-related source omitted] - Access to secretsline 323
[Credential-related source omitted] - Access to secretsline 324
[Credential-related source omitted] - Network accessline 453
vi.mocked(loadFeedConfig).mockReturnValueOnce({ feeds: [ { url: 'https://example.com/rss' }, - Network accessline 454
feeds: [ { url: 'https://example.com/rss' }, { url: 'https://stale.example/feed' }, - Network accessline 455
{ url: 'https://example.com/rss' }, - Network accessline 456
{ url: 'https://stale.example/feed' }, - Network accessline 457
{ url: 'https://empty.example/feed' }, - Network accessline 466
return { get: (url: string) => { if (url === 'https://example.com/rss') return { n: 3, last_at: fresh }; - Network accessline 467
get: (url: string) => { if (url === 'https://example.com/rss') return { n: 3, last_at: fresh }; if (url === 'https://stale.example/feed') return { n: 12, last_at: stale }; - Network accessline 468
if (url === 'https://example.com/rss') return { n: 3, last_at: fresh }; - Network accessline 469
if (url === 'https://stale.example/feed') return { n: 12, last_at: stale };
tests/unit/cli/flag-bridge.test.ts
tests/unit/cli/health.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/help-completeness.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/help.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/index.test.ts
- Executable scriptline 1
Executable file - Network accessline 123
it('routes the snake-case "find_similar" alias', () => { const parsed = parseCommand(['find_similar', 'https://x.com']); - Network accessline 124
const parsed = parseCommand(['find_similar', 'https://x.com']); - Network accessline 125
expect(parsed.command).toBe('find_similar'); expect(parsed.args).toEqual(['https://x.com']); }); - Network accessline 126
expect(parsed.args).toEqual(['https://x.com']); - Network accessline 135
it('routes "watch add <url>" preserving the subcommand + url', () => { const parsed = parseCommand(['watch', 'add', 'https://x.com', '--interval', '120']); - Network accessline 136
const parsed = parseCommand(['watch', 'add', 'https://x.com', '--interval', '120']); - Network accessline 137
expect(parsed.command).toBe('watch'); expect(parsed.args).toEqual(['add', 'https://x.com', '--interval', '120']); }); - Network accessline 138
expect(parsed.args).toEqual(['add', 'https://x.com', '--interval', '120']);
tests/unit/cli/init-non-interactive.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 168
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted] - Access to secretsline 171
[Credential-related source omitted] - Access to secretsline 465
[Credential-related source omitted] - Access to secretsline 466
[Credential-related source omitted] - Access to secretsline 470
[Credential-related source omitted] - Access to secretsline 483
[Credential-related source omitted] - Access to secretsline 485
[Credential-related source omitted] - Access to secretsline 489
[Credential-related source omitted] - Access to secretsline 503
[Credential-related source omitted] - Access to secretsline 509
[Credential-related source omitted]
tests/unit/cli/init-ollama-hint.test.ts
tests/unit/cli/init-packaged-binary.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/init.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/json-contracts.test.ts
- Executable scriptline 1
Executable file - Network accessline 50
it('emits a single JSON status doc on stdout, nothing on stdout otherwise', async () => { process.env.WIGOLO_AUTH_STATE_PATH = '/home/u/.auth/state.json'; process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 51
process.env.WIGOLO_AUTH_STATE_PATH = '/home/u/.auth/state.json'; process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; const { resetConfig } = await import('../../../src/config.js'); - Network accessline 52
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Access to secretsline 78
[Credential-related source omitted]
tests/unit/cli/ollama-probe.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
describe('resolveProbeBaseUrl', () => { it('prefers WIGOLO_LLM_BASE_URL env over the default', () => { expect(resolveProbeBaseUrl({ WIGOLO_LLM_BASE_URL: 'http://box:9999' })).toBe('http://box:9999'); - Network accessline 6
it('prefers WIGOLO_LLM_BASE_URL env over the default', () => { expect(resolveProbeBaseUrl({ WIGOLO_LLM_BASE_URL: 'http://box:9999' })).toBe('http://box:9999'); }); - Network accessline 7
expect(resolveProbeBaseUrl({ WIGOLO_LLM_BASE_URL: 'http://box:9999' })).toBe('http://box:9999'); - Network accessline 18
it('returns reachable=true when /api/tags responds ok', async () => { const fetchImpl = vi.fn(async () => ({ ok: true }) as Response); const res = await probeOllama('http://localhost:11434', fetchImpl); - Network accessline 19
const fetchImpl = vi.fn(async () => ({ ok: true }) as Response); const res = await probeOllama('http://localhost:11434', fetchImpl); expect(res.reachable).toBe(true); - Network accessline 20
const res = await probeOllama('http://localhost:11434', fetchImpl); - Network accessline 24
expect(fetchImpl).toHaveBeenCalledWith( 'http://localhost:11434/api/tags', - Network accessline 25
'http://localhost:11434/api/tags', - Network accessline 30
it('returns reachable=false on a non-ok response without throwing', async () => { const fetchImpl = vi.fn(async () => ({ ok: false }) as Response); const res = await probeOllama('http://localhost:11434', fetchImpl); - Network accessline 31
const fetchImpl = vi.fn(async () => ({ ok: false }) as Response); const res = await probeOllama('http://localhost:11434', fetchImpl); expect(res.reachable).toBe(false); - Network accessline 32
const res = await probeOllama('http://localhost:11434', fetchImpl); - Network accessline 40
throw new Error('ECONNREFUSED'); }); const res = await probeOllama('http://localhost:11434', fetchImpl); - Network accessline 41
}); const res = await probeOllama('http://localhost:11434', fetchImpl); expect(res.reachable).toBe(false); - Network accessline 42
const res = await probeOllama('http://localhost:11434', fetchImpl); - Network accessline 53
}), ); const res = await probeOllama('http://localhost:11434', fetchImpl, 10); - Network accessline 54
); const res = await probeOllama('http://localhost:11434', fetchImpl, 10); expect(res.reachable).toBe(false); - Network accessline 55
const res = await probeOllama('http://localhost:11434', fetchImpl, 10); - Network accessline 59
it('strips a trailing slash from the base before appending /api/tags', async () => { const fetchImpl = vi.fn(async () => ({ ok: true }) as Response); await probeOllama('http://localhost:11434/', fetchImpl); - Network accessline 60
const fetchImpl = vi.fn(async () => ({ ok: true }) as Response); await probeOllama('http://localhost:11434/', fetchImpl); expect(fetchImpl).toHaveBeenCalledWith( - Network accessline 61
await probeOllama('http://localhost:11434/', fetchImpl); - Network accessline 62
expect(fetchImpl).toHaveBeenCalledWith( 'http://localhost:11434/api/tags', expect.anything(), - Network accessline 63
'http://localhost:11434/api/tags', - Network accessline 69
describe('maybeOllamaHint', () => { it('returns a hint string when a server is reachable and no LLM is configured', () => { const hint = maybeOllamaHint({ reachable: true, llmConfigured: false, baseUrl: 'http://localhost:11434' }); - Network accessline 70
it('returns a hint string when a server is reachable and no LLM is configured', () => { const hint = maybeOllamaHint({ reachable: true, llmConfigured: false, baseUrl: 'http://localhost:11434' }); expect(hint).toMatch(/local llm serv - Network accessline 71
const hint = maybeOllamaHint({ reachable: true, llmConfigured: false, baseUrl: 'http://localhost:11434' }); - Network accessline 72
expect(hint).toMatch(/local llm server detected/i); expect(hint).toContain('http://localhost:11434'); expect(hint).toMatch(/WIGOLO_LLM_PROVIDER=ollama/); - Network accessline 73
expect(hint).toContain('http://localhost:11434'); - Network accessline 80
expect(maybeOllamaHint({ reachable: true, llmConfigured: true, baseUrl: 'http://localhost:11434' })).toBeNull(); - Network accessline 83
it('returns null when no server is reachable (nothing to enable)', () => { expect(maybeOllamaHint({ reachable: false, llmConfigured: false, baseUrl: 'http://localhost:11434' })).toBeNull(); - Network accessline 84
expect(maybeOllamaHint({ reachable: false, llmConfigured: false, baseUrl: 'http://localhost:11434' })).toBeNull();
tests/unit/cli/plugin.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
await runPluginAdd('https://github.com/user/wigolo-plugin-example.git'); - Network accessline 68
await runPluginAdd('https://github.com/user/my-plugin.git'); - Network accessline 82
await runPluginAdd('https://github.com/user/no-git-suffix'); - Network accessline 94
await expect(runPluginAdd('https://github.com/user/my-plugin.git')).rejects.toThrow( - Network accessline 106
await expect(runPluginAdd('https://github.com/user/nonexistent.git')).rejects.toThrow( - Network accessline 138
try { await expect( runPluginAdd('https://github.com/user/evil-plugin.git'), - Network accessline 139
await expect( runPluginAdd('https://github.com/user/evil-plugin.git'), ).rejects.toThrow(/non-interactively/i); - Network accessline 140
runPluginAdd('https://github.com/user/evil-plugin.git'), - Network accessline 155
await runPluginAdd('https://github.com/user/trusted-plugin.git', { assumeYes: true }); - Network accessline 343
await runPluginCommand(['add', 'https://github.com/user/repo.git']);
tests/unit/cli/router-config.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/setup-mcp-integration.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/setup-mcp-non-interactive.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/setup-mcp.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/shell.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/skills-command.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/status.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/telemetry.test.ts
- Executable scriptline 1
Executable file - Network accessline 109
it('serializes complex props correctly', () => { process.env.WIGOLO_TELEMETRY = '1'; emit('extract', { url: 'https://x.test', tags: ['a', 'b'], meta: { ok: true, n: 3 } }); - Network accessline 110
process.env.WIGOLO_TELEMETRY = '1'; emit('extract', { url: 'https://x.test', tags: ['a', 'b'], meta: { ok: true, n: 3 } }); const line = readFileSync(todayFile(dataDir), 'utf8').trim(); - Network accessline 111
emit('extract', { url: 'https://x.test', tags: ['a', 'b'], meta: { ok: true, n: 3 } }); - Network accessline 118
expect(parsed.props.tags).toEqual(['a', 'b']); expect(parsed.props.meta).toEqual({ ok: true, n: 3 }); expect(parsed.props.url).toBe('https://x.test'); - Network accessline 119
expect(parsed.props.meta).toEqual({ ok: true, n: 3 }); expect(parsed.props.url).toBe('https://x.test'); }); - Network accessline 120
expect(parsed.props.url).toBe('https://x.test'); - Network accessline 124
process.env.WIGOLO_TELEMETRY = '1'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); configureRemote('https://collect.test/events'); - Network accessline 125
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); configureRemote('https://collect.test/events'); emit('ping', { v: 1 }); - Network accessline 126
configureRemote('https://collect.test/events'); - Network accessline 128
expect(fetchSpy).toHaveBeenCalledTimes(1); const [url, init] = fetchSpy.mock.calls[0] as [string, RequestInit]; expect(url).toBe('https://collect.test/events'); - Network accessline 129
const [url, init] = fetchSpy.mock.calls[0] as [string, RequestInit]; expect(url).toBe('https://collect.test/events'); expect(init.method).toBe('POST'); - Network accessline 130
expect(url).toBe('https://collect.test/events'); - Network accessline 139
process.env.WIGOLO_TELEMETRY = '1'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); configureRemote('https://collect.test/events'); - Network accessline 140
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); configureRemote('https://collect.test/events'); configureRemote(undefined); - Network accessline 141
configureRemote('https://collect.test/events'); - Network accessline 147
it('uses WIGOLO_TELEMETRY_ENDPOINT env when configureRemote was not called', () => { process.env.WIGOLO_TELEMETRY = '1'; process.env.WIGOLO_TELEMETRY_ENDPOINT = 'https://env.test/events'; - Network accessline 148
process.env.WIGOLO_TELEMETRY = '1'; process.env.WIGOLO_TELEMETRY_ENDPOINT = 'https://env.test/events'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); - Network accessline 149
process.env.WIGOLO_TELEMETRY_ENDPOINT = 'https://env.test/events'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); emit('env-ping'); - Network accessline 151
emit('env-ping'); expect(fetchSpy).toHaveBeenCalledTimes(1); expect(fetchSpy.mock.calls[0][0]).toBe('https://env.test/events'); - Network accessline 152
expect(fetchSpy).toHaveBeenCalledTimes(1); expect(fetchSpy.mock.calls[0][0]).toBe('https://env.test/events'); }); - Network accessline 153
expect(fetchSpy.mock.calls[0][0]).toBe('https://env.test/events'); - Network accessline 157
process.env.WIGOLO_TELEMETRY = '1'; vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('boom')); configureRemote('https://collect.test/events'); - Network accessline 158
vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('boom')); configureRemote('https://collect.test/events'); expect(() => emit('ping')).not.toThrow(); - Network accessline 159
configureRemote('https://collect.test/events'); - Network accessline 171
process.env.WIGOLO_TELEMETRY = '1'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); configureRemote('https://collect.test/events'); - Network accessline 172
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response()); configureRemote('https://collect.test/events'); _resetTelemetryForTest(); - Network accessline 173
configureRemote('https://collect.test/events');
tests/unit/cli/tool-flag-parity.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tool-run.test.ts
- Executable scriptline 1
Executable file - Network accessline 62
const okSearch: StageResult<SearchOutput> = { ok: true, data: { results: [{ title: 't', url: 'https://x.com', snippet: 's', relevance_score: 0.9, source: 'core' } as SearchOutput['results'][number]], query: 'q', engines_used: ['core'], - Network accessline 63
ok: true, data: { results: [{ title: 't', url: 'https://x.com', snippet: 's', relevance_score: 0.9, source: 'core' } as SearchOutput['results'][number]], query: 'q', engines_used: ['core'], total_time_ms: 1 }, }; - Network accessline 64
data: { results: [{ title: 't', url: 'https://x.com', snippet: 's', relevance_score: 0.9, source: 'core' } as SearchOutput['results'][number]], query: 'q', engines_used: ['core'], total_time_ms: 1 }, - Network accessline 114
const parsed = JSON.parse(cap.text()); expect(parsed.results).toBeDefined(); expect(parsed.results[0].url).toBe('https://x.com'); - Network accessline 115
expect(parsed.results).toBeDefined(); expect(parsed.results[0].url).toBe('https://x.com'); }); - Network accessline 116
expect(parsed.results[0].url).toBe('https://x.com'); - Network accessline 137
const okFetch: StageResult<FetchOutput> = { ok: true, data: { url: 'https://x.com', title: 'T', markdown: '# hi', metadata: {}, links: [], images: [], cached: false }, - Network accessline 138
ok: true, data: { url: 'https://x.com', title: 'T', markdown: '# hi', metadata: {}, links: [], images: [], cached: false }, }; - Network accessline 139
data: { url: 'https://x.com', title: 'T', markdown: '# hi', metadata: {}, links: [], images: [], cached: false }, - Network accessline 143
let code: number; try { code = await runTool('fetch', ['https://x.com', '--json']); - Network accessline 144
try { code = await runTool('fetch', ['https://x.com', '--json']); } finally { - Network accessline 145
code = await runTool('fetch', ['https://x.com', '--json']); - Network accessline 159
let code: number; try { code = await runTool('fetch', ['https://x.com', '--json']); - Network accessline 160
try { code = await runTool('fetch', ['https://x.com', '--json']); } finally { - Network accessline 161
code = await runTool('fetch', ['https://x.com', '--json']); - Network accessline 203
let code: number; try { code = await runTool('fetch', ['https://x.com']); - Network accessline 204
try { code = await runTool('fetch', ['https://x.com']); } finally { - Network accessline 205
code = await runTool('fetch', ['https://x.com']);
tests/unit/cli/tui/actions/cache-stats.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/cleanup.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/compute-storage.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/detect-system.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/export-import-config.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/headless-set.test.ts
tests/unit/cli/tui/actions/mcp-stdio-no-ink.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/provider-actions.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Network accessline 143
it('custom URL is stored as setting, recorded with keyLocation env', async () => { const URL = 'http://localhost:11434'; - Network accessline 144
const URL = 'http://localhost:11434';
tests/unit/cli/tui/actions/uninstall.test.ts
tests/unit/cli/tui/actions/write-config-no-silent.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/actions/write-config.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/agents.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/banner.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/banner.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/ActionBar.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/CategoryScreen.blur.test.tsx
tests/unit/cli/tui/components/CategoryScreen.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/DoctorScreen.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/FieldRenderer.enter-select.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/FieldRenderer.saved-check.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/FieldRenderer.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/ImportScreen.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/SettingsHome.multiselect-preview.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/SettingsHome.quit.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/SettingsHome.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/SettingsHome.threeway.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/VerifyScreen.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/WizardSteps.ceremony.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/WizardSteps.continue-quit.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/components/WizardSteps.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/config-force-wizard.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/config-writer-cli.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/config-writer-json.test.ts
- Executable scriptline 1
Executable file - Network accessline 92
"theme": "system", "mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 93
"mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, }, - Network accessline 94
"other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 146
"mcp": { "wigolo": { "type": "local", "command": ["old"] }, "other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 147
"wigolo": { "type": "local", "command": ["old"] }, "other": { "type": "remote", "url": "https://example.com/mcp" }, }, - Network accessline 148
"other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 164
expect(content.mcp).toEqual({ wigolo: { type: 'local', command: ['npx', '-y', 'wigolo'], enabled: true }, other: { type: 'remote', url: 'https://example.com/mcp' }, - Network accessline 165
wigolo: { type: 'local', command: ['npx', '-y', 'wigolo'], enabled: true }, other: { type: 'remote', url: 'https://example.com/mcp' }, }); - Network accessline 166
other: { type: 'remote', url: 'https://example.com/mcp' }, - Network accessline 420
"theme": "system", "mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 421
"mcp": { "other": { "type": "remote", "url": "https://example.com/mcp" }, "wigolo": { "type": "local", "command": "npx", "args": ["-y", "wigolo"] }, - Network accessline 422
"other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 451
"other": { "type": "remote", "url": "https://example.com/mcp" }, - Network accessline 464
expect(updated).toContain('// This remote server must remain configured.'); expect(parseJsonObject(updated, true).mcp).toEqual({ other: { type: 'remote', url: 'https://example.com/mcp' }, - Network accessline 465
expect(parseJsonObject(updated, true).mcp).toEqual({ other: { type: 'remote', url: 'https://example.com/mcp' }, }); - Network accessline 466
other: { type: 'remote', url: 'https://example.com/mcp' },
tests/unit/cli/tui/config-writer-toml.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/config-writer.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/dashboard-screens.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/detect-helpers.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/entry-required-fields.test.ts
tests/unit/cli/tui/entry.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/extras-prompt.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 31
[Credential-related source omitted] - Network accessline 73
it('parses comma-separated RSS feeds and persists as array', async () => { selectMock.mockResolvedValueOnce('skip'); inputMock.mockResolvedValueOnce(' https://a.example/feed , https://b.example/feed ,'); - Network accessline 74
selectMock.mockResolvedValueOnce('skip'); inputMock.mockResolvedValueOnce(' https://a.example/feed , https://b.example/feed ,'); inputMock.mockResolvedValueOnce(''); - Network accessline 75
inputMock.mockResolvedValueOnce(' https://a.example/feed , https://b.example/feed ,'); - Network accessline 79
const result = await promptExtras(dir); expect(result.rssFeeds).toEqual([ 'https://a.example/feed', - Network accessline 80
expect(result.rssFeeds).toEqual([ 'https://a.example/feed', 'https://b.example/feed', - Network accessline 81
'https://a.example/feed', - Network accessline 82
'https://b.example/feed', - Network accessline 85
const cfg = JSON.parse(readFileSync(join(dir, 'config.json'), 'utf-8')); expect(cfg.settings.rssFeeds).toEqual(['https://a.example/feed', 'https://b.example/feed']); - Network accessline 86
expect(cfg.settings.rssFeeds).toEqual(['https://a.example/feed', 'https://b.example/feed']); - Network accessline 90
selectMock.mockResolvedValueOnce('skip'); inputMock.mockResolvedValueOnce(''); inputMock.mockResolvedValueOnce('http://localhost:11434/v1'); - Network accessline 91
inputMock.mockResolvedValueOnce(''); inputMock.mockResolvedValueOnce('http://localhost:11434/v1'); selectMock.mockResolvedValueOnce('skip'); // provider - Network accessline 92
inputMock.mockResolvedValueOnce('http://localhost:11434/v1'); - Network accessline 95
const result = await promptExtras(dir); expect(result.llmEndpoint).toBe('http://localhost:11434/v1'); - Network accessline 96
expect(result.llmEndpoint).toBe('http://localhost:11434/v1'); - Access to secretsline 128
[Credential-related source omitted]
tests/unit/cli/tui/flags.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/format.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/init-config-writer.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/mount-root-phase-sync.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/plain-override.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/reporter-auto.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/reporter.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/router/entry-wire.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/router/ink-root.apply-verify.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/router/ink-root.phase3-integration.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/router/ink-root.save-state.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/router/ink-root.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/run-command.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/advanced.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/agents.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/browser.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/cache.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/catalog.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/llm-no-custom.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/llm.test.ts
tests/unit/cli/tui/schema/migrate.test.ts
tests/unit/cli/tui/schema/search.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/schema/types.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/select-agents.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/App.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/CommandPalette.test.tsx
tests/unit/cli/tui/shell/CommandPalette.width.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Footer.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Header.liveness.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Header.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/HelpOverlay.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/HelpOverlay.width.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/MainPane.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/MainPane.transition.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Sidebar.pulse.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Sidebar.quit.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Sidebar.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/Spinner.test.tsx
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/palette-index.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/shell/width.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/activity-store.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/agent-install-hints.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/agent-targets.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/propagation.test.ts
tests/unit/cli/tui/state/required-fields.test.ts
tests/unit/cli/tui/state/secret-store.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 2
[Credential-related source omitted] - Access to secretsline 3
[Credential-related source omitted] - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 157
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted]
tests/unit/cli/tui/state/settings-store.blur.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/settings-store.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/settings-store.toast.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/toast-store.action.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/toast-store.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/state/uninstall-signal.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/status-agents.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/status-cache.test.ts
- Executable scriptline 1
Executable file - Network accessline 28
const db = new Database(dbPath); db.exec('CREATE TABLE url_cache (id INTEGER PRIMARY KEY, url TEXT)'); db.prepare('INSERT INTO url_cache (url) VALUES (?)').run('https://a.test'); - Network accessline 29
db.exec('CREATE TABLE url_cache (id INTEGER PRIMARY KEY, url TEXT)'); db.prepare('INSERT INTO url_cache (url) VALUES (?)').run('https://a.test'); db.prepare('INSERT INTO url_cache (url) VALUES (?)').run('https://b.test'); - Network accessline 30
db.prepare('INSERT INTO url_cache (url) VALUES (?)').run('https://a.test'); - Network accessline 31
db.prepare('INSERT INTO url_cache (url) VALUES (?)').run('https://b.test'); - Network accessline 32
db.prepare('INSERT INTO url_cache (url) VALUES (?)').run('https://c.test');
tests/unit/cli/tui/status-format.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/status-python.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/system-check.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/theme/borders.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/theme/motion-guard.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/theme/motion.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/theme/palette.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/tui-reporter.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tui/verification.test.tsx
- Executable scriptline 1
Executable file - Network accessline 7
useVerify: () => ({ items: [ { id: 'searxng', name: 'SearXNG', status: 'pass', detail: 'http://localhost:8888' }, - Network accessline 8
items: [ { id: 'searxng', name: 'SearXNG', status: 'pass', detail: 'http://localhost:8888' }, { id: 'reranker', name: 'ML reranker', status: 'pass', detail: 'installed' }, - Network accessline 9
{ id: 'searxng', name: 'SearXNG', status: 'pass', detail: 'http://localhost:8888' },
tests/unit/cli/tui/verify-suggestions.test.ts
tests/unit/cli/tui/verify.test.ts
- Executable scriptline 1
Executable file - Network accessline 73
delete process.env.WIGOLO_SEARCH; process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; - Network accessline 74
process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; resetConfig(); - Network accessline 75
process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; - Network accessline 134
it('records searxng: ok and URL when start() resolves', async () => { startMock.mockResolvedValueOnce('http://127.0.0.1:8888'); - Network accessline 135
startMock.mockResolvedValueOnce('http://127.0.0.1:8888'); - Network accessline 140
expect(result.searxng).toBe('ok'); expect(result.searxngUrl).toBe('http://127.0.0.1:8888'); - Network accessline 141
expect(result.searxngUrl).toBe('http://127.0.0.1:8888'); - Network accessline 142
expect(reporter.events).toContain('success:searxng:http://127.0.0.1:8888'); - Network accessline 147
describe('runVerify — package probes', () => { beforeEach(() => { startMock.mockResolvedValue('http://127.0.0.1:8888'); - Network accessline 148
beforeEach(() => { startMock.mockResolvedValue('http://127.0.0.1:8888'); }); - Network accessline 149
startMock.mockResolvedValue('http://127.0.0.1:8888'); - Network accessline 212
it('emits no notes when everything passes', async () => { startMock.mockResolvedValue('http://127.0.0.1:8888'); - Network accessline 213
startMock.mockResolvedValue('http://127.0.0.1:8888');
tests/unit/cli/tui/version.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/tune.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/uninstall.test.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 6
* - npm/source layout: full cleanup is `rm -rf ~/.wigolo`. - Dangerous shell operationline 7
* - curl|sh bootstrap layout (~/.wigolo/tool or ~/.wigolo/runtime present): - Dangerous shell operationline 9
* data" (rm -rf ~/.wigolo, which ALSO deletes the tool). Conflating them - Dangerous shell operationline 81
it('npm/source layout: full cleanup is a single rm -rf of the data dir', async () => { - Dangerous shell operationline 91
expect(out).toContain('rm -rf'); - Dangerous shell operationline 116
expect(out).toContain('rm -rf'); - Dangerous shell operationline 174
expect(out).toContain('rm -rf');
tests/unit/cli/verify-command.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/warmup-browser-deps.test.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 96
// sudo -n true fails (no passwordless sudo); binary install succeeds. - Dangerous shell operationline 114
expect(notes.some((n) => n.includes('sudo npx playwright install-deps chromium'))).toBe(true); - Dangerous shell operationline 116
// Must NEVER have run sudo to actually install (only the -n true probe). - Dangerous shell operationline 123
it('Linux non-root + NO sudo binary at all (spawn ENOENT): probe treated as skip, warmup does not crash', async () => { - Dangerous shell operationline 133
const err = new Error('spawn sudo ENOENT') as NodeJS.ErrnoException; - Dangerous shell operationline 164
// No sudo probe at all when root. - Dangerous shell operationline 169
it('Linux non-root + passwordless sudo available: install-deps via `sudo -n`', async () => { - Dangerous shell operationline 172
// sudo -n true succeeds → passwordless sudo available.
tests/unit/cli/warmup-embedding.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/warmup-firefox.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/warmup-force.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/warmup-local-llm.test.ts
- Executable scriptline 1
Executable file - Network accessline 15
const line = formatLocalLlmWarmupLine({ localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' }, - Network accessline 16
localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' }, }); - Network accessline 17
tier: { available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', source: 'auto' }, - Network accessline 18
}); expect(line).toContain('http://localhost:11434'); expect(line).toContain('qwen2.5:7b-instruct'); - Network accessline 19
expect(line).toContain('http://localhost:11434'); - Network accessline 33
const line = formatLocalLlmWarmupLine({ localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'm\x1b[2Jx', source: 'auto' }, - Network accessline 34
localLlm: 'auto', tier: { available: true, endpoint: 'http://localhost:11434', model: 'm\x1b[2Jx', source: 'auto' }, }); - Network accessline 35
tier: { available: true, endpoint: 'http://localhost:11434', model: 'm\x1b[2Jx', source: 'auto' },
tests/unit/cli/warmup-python-env.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/warmup-setup-json-contract.test.ts
- Executable scriptline 1
Executable file
tests/unit/cli/warmup-verify.test.ts
- Executable scriptline 1
Executable file - Network accessline 69
stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(capture as never); stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(capture as never); mockStart.mockResolvedValue('http://127.0.0.1:8888'); - Network accessline 70
stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(capture as never); mockStart.mockResolvedValue('http://127.0.0.1:8888'); mockStop.mockResolvedValue(undefined); - Network accessline 71
mockStart.mockResolvedValue('http://127.0.0.1:8888');
tests/unit/cli/warmup.test.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 42
`python3 venv module not available. On Debian/Ubuntu, run: sudo apt install ${v ? `python${v}-venv (or python3-venv)` : 'python3-venv'}. Search will use the built-in core backend until this is fixed.`, - Network accessline 200
vi.mocked(getConfig).mockReturnValueOnce({ dataDir: '/tmp/test-wigolo', searchBackend: null, searxngUrl: 'http://searxng:8080', - Network accessline 201
dataDir: '/tmp/test-wigolo', searchBackend: null, searxngUrl: 'http://searxng:8080', - Dangerous shell operationline 248
expect(result.searxngError).toContain('sudo apt install python3.12-venv'); - Network accessline 303
it('--all with an external searxngUrl DOES run the searxng phase', async () => { vi.mocked(getConfig).mockReturnValue({ dataDir: '/tmp/test-wigolo', searchBackend: null, searxngUrl: 'http://sx.local:8888' } as never); - Network accessline 304
vi.mocked(getConfig).mockReturnValue({ dataDir: '/tmp/test-wigolo', searchBackend: null, searxngUrl: 'http://sx.local:8888' } as never);
tests/unit/config-persistence.test.ts
- Executable scriptline 1
Executable file
tests/unit/config-search-budgets.test.ts
- Executable scriptline 1
Executable file
tests/unit/config.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
delete process.env.SEARXNG_URL; process.env.WIGOLO_SEARXNG_URL = 'http://wigolo-searxng:8080'; - Network accessline 54
process.env.WIGOLO_SEARXNG_URL = 'http://wigolo-searxng:8080'; - Network accessline 55
expect(getConfig().searxngUrl).toBe('http://wigolo-searxng:8080'); - Network accessline 57
process.env.SEARXNG_URL = 'http://legacy-searxng:8080'; - Network accessline 59
expect(getConfig().searxngUrl).toBe('http://wigolo-searxng:8080'); - Network accessline 61
delete process.env.WIGOLO_SEARXNG_URL; resetConfig(); expect(getConfig().searxngUrl).toBe('http://legacy-searxng:8080'); - Network accessline 62
resetConfig(); expect(getConfig().searxngUrl).toBe('http://legacy-searxng:8080'); }); - Network accessline 63
expect(getConfig().searxngUrl).toBe('http://legacy-searxng:8080'); - Network accessline 302
it('reads remote endpoint, model, key, and timeout from env', () => { process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; - Network accessline 303
[Credential-related source omitted] - Network accessline 304
process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; - Access to secretsline 305
[Credential-related source omitted] - Network accessline 308
resetConfig(); expect(getConfig()).toMatchObject({ reranker: 'remote', rerankApiBase: 'http://127.0.0.1:8082/v1', - Network accessline 309
expect(getConfig()).toMatchObject({ reranker: 'remote', rerankApiBase: 'http://127.0.0.1:8082/v1', rerankApiKey: 'test-token', rerankerModel: 'test-reranker', rerankerRequestTimeoutMs: 1234, - Network accessline 310
reranker: 'remote', rerankApiBase: 'http://127.0.0.1:8082/v1', - Network accessline 473
it('reads WIGOLO_CDP_URL as string', () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 474
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 475
resetConfig(); expect(getConfig().cdpUrl).toBe('http://localhost:9222'); }); - Network accessline 476
expect(getConfig().cdpUrl).toBe('http://localhost:9222'); - Network accessline 479
it('reads custom CDP port', () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9333'; - Network accessline 480
process.env.WIGOLO_CDP_URL = 'http://localhost:9333'; - Network accessline 481
resetConfig(); expect(getConfig().cdpUrl).toBe('http://localhost:9333'); }); - Network accessline 482
expect(getConfig().cdpUrl).toBe('http://localhost:9333'); - Network accessline 485
it('reads remote CDP URL', () => { process.env.WIGOLO_CDP_URL = 'http://192.168.1.100:9222'; - Network accessline 486
process.env.WIGOLO_CDP_URL = 'http://192.168.1.100:9222'; - Network accessline 487
resetConfig(); expect(getConfig().cdpUrl).toBe('http://192.168.1.100:9222'); }); - Network accessline 488
expect(getConfig().cdpUrl).toBe('http://192.168.1.100:9222'); - Network accessline 669
process.env.WIGOLO_LOCAL_LLM = 'http://box:11434'; - Network accessline 670
resetConfig(); expect(getConfig().localLlm).toBe('http://box:11434'); }); - Network accessline 671
expect(getConfig().localLlm).toBe('http://box:11434');
tests/unit/config/crawl-pacing.test.ts
- Executable scriptline 1
Executable file
tests/unit/config/hardcore-mode.test.ts
tests/unit/config/proxy-credential-persistence.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 40
[Credential-related source omitted] - Network accessline 41
const path = join(dir, 'config.json'); writePersistedConfig(path, { settings: { proxyUrl: 'http://alice:s3cret@proxy.example.com:8080' }, - Network accessline 42
writePersistedConfig(path, { settings: { proxyUrl: 'http://alice:s3cret@proxy.example.com:8080' }, }); - Network accessline 43
settings: { proxyUrl: 'http://alice:s3cret@proxy.example.com:8080' }, - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Network accessline 57
writePersistedConfig(path, { settings: { solverUrl: 'http://s-user:s-pass@solver.local:8191', - Network accessline 58
settings: { solverUrl: 'http://s-user:s-pass@solver.local:8191', hostedReaderUrl: 'https://r-user:r-pass@reader.example.com', - Network accessline 59
solverUrl: 'http://s-user:s-pass@solver.local:8191', - Network accessline 60
hostedReaderUrl: 'https://r-user:r-pass@reader.example.com', - Access to secretsline 70
[Credential-related source omitted] - Network accessline 72
store.set('proxyUrl-cred', 'stale:cred'); writePersistedConfig(path, { settings: { proxyUrl: 'http://proxy.example.com:8080/' }, - Network accessline 73
writePersistedConfig(path, { settings: { proxyUrl: 'http://proxy.example.com:8080/' }, }); - Network accessline 74
settings: { proxyUrl: 'http://proxy.example.com:8080/' }, - Network accessline 75
}); const cfg = readPersistedConfig(path); expect(cfg.settings.proxyUrl).toBe('http://proxy.example.com:8080/'); - Network accessline 77
expect(cfg.settings.proxyUrl).toBe('http://proxy.example.com:8080/'); - Access to secretsline 82
[Credential-related source omitted] - Network accessline 91
const path = join(dir, 'config.json'); writePersistedConfig(path, { settings: { proxyUrl: 'http://alice:s3cret@proxy.example.com:8080' }, - Network accessline 92
writePersistedConfig(path, { settings: { proxyUrl: 'http://alice:s3cret@proxy.example.com:8080' }, }); - Network accessline 93
settings: { proxyUrl: 'http://alice:s3cret@proxy.example.com:8080' }, - Network accessline 107
JSON.stringify({ version: 1, settings: { proxyUrl: 'http://hand:edited@proxy.example.com:8080' }, - Network accessline 108
version: 1, settings: { proxyUrl: 'http://hand:edited@proxy.example.com:8080' }, }), - Network accessline 109
settings: { proxyUrl: 'http://hand:edited@proxy.example.com:8080' }, - Network accessline 112
resetPersistedConfig(); const cfg = readPersistedConfig(path); expect(cfg.settings.proxyUrl).toBe('http://proxy.example.com:8080/'); - Network accessline 113
const cfg = readPersistedConfig(path); expect(cfg.settings.proxyUrl).toBe('http://proxy.example.com:8080/'); expect(cfg.settings.proxyUrl).not.toContain('hand'); - Network accessline 114
expect(cfg.settings.proxyUrl).toBe('http://proxy.example.com:8080/'); - Access to secretsline 117
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Network accessline 128
saveInitConfig(dir, { proxyUrl: 'http://wiz:pass@proxy.wizard.local:3128', useProxy: true }); - Network accessline 129
const settings = readInitConfig(dir); expect(settings.proxyUrl).toBe('http://proxy.wizard.local:3128/'); expect(settings.useProxy).toBe(true); - Network accessline 130
expect(settings.proxyUrl).toBe('http://proxy.wizard.local:3128/'); - Network accessline 135
it('a wizard-set credential-free proxy survives verbatim', () => { saveInitConfig(dir, { proxyUrl: 'http://proxy.wizard.local:3128/' }); - Network accessline 136
saveInitConfig(dir, { proxyUrl: 'http://proxy.wizard.local:3128/' }); - Network accessline 137
expect(readInitConfig(dir).proxyUrl).toBe('http://proxy.wizard.local:3128/');
tests/unit/config/proxy-credential-resolve.test.ts
- Executable scriptline 1
Executable file - Network accessline 51
it('reads solverUrl / hostedReaderUrl from env', () => { process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191/v1'; - Network accessline 52
process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191/v1'; - Network accessline 53
process.env.WIGOLO_HOSTED_READER_URL = 'https://r.jina.ai'; - Network accessline 54
resetConfig(); const cfg = getConfig(); expect(cfg.solverUrl).toBe('http://127.0.0.1:8191/v1'); - Network accessline 55
const cfg = getConfig(); expect(cfg.solverUrl).toBe('http://127.0.0.1:8191/v1'); expect(cfg.hostedReaderUrl).toBe('https://r.jina.ai'); - Network accessline 56
expect(cfg.solverUrl).toBe('http://127.0.0.1:8191/v1'); - Network accessline 57
expect(cfg.hostedReaderUrl).toBe('https://r.jina.ai'); - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Network accessline 63
writeFileSync( join(dir, 'config.json'), JSON.stringify({ version: 1, settings: { proxyUrl: 'http://proxy.example.com:8080/' } }), - Network accessline 64
join(dir, 'config.json'), JSON.stringify({ version: 1, settings: { proxyUrl: 'http://proxy.example.com:8080/' } }), ); - Network accessline 65
JSON.stringify({ version: 1, settings: { proxyUrl: 'http://proxy.example.com:8080/' } }), - Network accessline 69
resetConfig(); const cfg = getConfig(); expect(cfg.proxyUrl).toBe('http://alice:s3cret@proxy.example.com:8080/'); - Network accessline 70
const cfg = getConfig(); expect(cfg.proxyUrl).toBe('http://alice:s3cret@proxy.example.com:8080/'); }); - Network accessline 71
expect(cfg.proxyUrl).toBe('http://alice:s3cret@proxy.example.com:8080/'); - Access to secretsline 75
[Credential-related source omitted] - Network accessline 77
process.env.PROXY_URL = 'http://env-user:env-pass@proxy.example.com:8080'; - Network accessline 79
resetConfig(); const cfg = getConfig(); expect(cfg.proxyUrl).toBe('http://env-user:env-pass@proxy.example.com:8080'); - Network accessline 80
const cfg = getConfig(); expect(cfg.proxyUrl).toBe('http://env-user:env-pass@proxy.example.com:8080'); expect(cfg.proxyUrl).not.toContain('other'); - Network accessline 81
expect(cfg.proxyUrl).toBe('http://env-user:env-pass@proxy.example.com:8080'); - Network accessline 85
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Network accessline 86
process.env.PROXY_URL = 'http://proxy.example.com:8080/'; - Network accessline 87
resetConfig(); expect(getConfig().proxyUrl).toBe('http://proxy.example.com:8080/'); }); - Network accessline 88
expect(getConfig().proxyUrl).toBe('http://proxy.example.com:8080/');
tests/unit/config/reddit-credentials.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted]
tests/unit/crawl/crawler.test.ts
- Executable scriptline 1
Executable file - Network accessline 71
fetchFn = vi.fn(async (url: string) => { if (url === 'https://docs.example.com') { - Network accessline 72
if (url === 'https://docs.example.com') { - Network accessline 73
return makeFetchOutput(url, 'Docs Home', '# Docs\n\nWelcome.', [ 'https://docs.example.com/intro', 'https://docs.example.com/api', - Network accessline 74
'https://docs.example.com/intro', - Network accessline 75
'https://docs.example.com/api', - Network accessline 76
'https://other.example.com/external', - Network accessline 77
]); } if (url === 'https://docs.example.com/intro') { - Network accessline 78
} if (url === 'https://docs.example.com/intro') { return makeFetchOutput(url, 'Intro', '# Intro\n\nGetting started.', [ - Network accessline 79
if (url === 'https://docs.example.com/intro') { - Network accessline 80
return makeFetchOutput(url, 'Intro', '# Intro\n\nGetting started.', [ 'https://docs.example.com/api', 'https://docs.example.com/deep/nested', - Network accessline 81
'https://docs.example.com/api', - Network accessline 82
'https://docs.example.com/deep/nested', - Network accessline 83
]); } if (url === 'https://docs.example.com/api') { - Network accessline 84
} if (url === 'https://docs.example.com/api') { return makeFetchOutput(url, 'API', '# API\n\nEndpoints.', []); - Network accessline 85
if (url === 'https://docs.example.com/api') { - Network accessline 86
return makeFetchOutput(url, 'API', '# API\n\nEndpoints.', []); } if (url === 'https://docs.example.com/deep/nested') { - Network accessline 87
} if (url === 'https://docs.example.com/deep/nested') { return makeFetchOutput(url, 'Nested', '# Nested\n\nDeep page.', []); - Network accessline 88
if (url === 'https://docs.example.com/deep/nested') { - Network accessline 106
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 107
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 108
url: 'https://docs.example.com', - Network accessline 114
expect(result.pages.length).toBeGreaterThanOrEqual(1); expect(result.pages[0].url).toBe('https://docs.example.com'); - Network accessline 115
expect(result.pages[0].url).toBe('https://docs.example.com'); - Network accessline 121
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 122
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 123
url: 'https://docs.example.com', - Network accessline 130
expect(result.crawled).toBe(1); expect(result.pages[0].url).toBe('https://docs.example.com'); - Network accessline 131
expect(result.pages[0].url).toBe('https://docs.example.com'); - Network accessline 139
const crawler = new Crawler(shellFetch, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 140
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 141
url: 'https://docs.example.com', - Network accessline 154
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 155
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 156
url: 'https://docs.example.com', - Network accessline 170
const crawler = new Crawler(solvedFetch, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 171
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 172
url: 'https://docs.example.com', - Network accessline 182
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 183
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 184
url: 'https://docs.example.com', - Network accessline 194
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 195
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 196
url: 'https://docs.example.com', - Network accessline 207
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 208
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 209
url: 'https://docs.example.com', - Network accessline 215
const urls = result.pages.map((p) => p.url); expect(urls).not.toContain('https://other.example.com/external'); - Network accessline 216
expect(urls).not.toContain('https://other.example.com/external'); - Network accessline 220
// https://example.com 301s to https://www.example.com, so every link on the - Network accessline 222
const redirectingFetch: FetchFn = vi.fn(async (url: string) => { if (url === 'https://example.com') { - Network accessline 223
if (url === 'https://example.com') { - Network accessline 224
return makeFetchOutput('https://www.example.com', 'Home', '# Home', [ - Network accessline 225
'https://www.example.com/a', - Network accessline 226
'https://www.example.com/b', - Network accessline 227
'https://other.example.com/external', - Network accessline 234
const crawler = new Crawler(redirectingFetch, rawFetchFn); const result = await crawler.crawl({ url: 'https://example.com', - Network accessline 235
const result = await crawler.crawl({ url: 'https://example.com', strategy: 'bfs', - Network accessline 236
url: 'https://example.com', - Network accessline 242
const urls = result.pages.map((p) => p.url); expect(urls).toContain('https://www.example.com/a'); - Network accessline 243
expect(urls).toContain('https://www.example.com/a'); - Network accessline 244
expect(urls).toContain('https://www.example.com/b'); - Network accessline 249
const crawler = new Crawler(redirectingFetch, rawFetchFn); const result = await crawler.crawl({ url: 'https://example.com', - Network accessline 250
const result = await crawler.crawl({ url: 'https://example.com', strategy: 'bfs', - Network accessline 251
url: 'https://example.com', - Network accessline 257
expect(result.pages.map((p) => p.url)).not.toContain('https://other.example.com/external'); - Network accessline 260
it('keeps the requested origin when the seed fetch fails', async () => { const failingSeed: FetchFn = vi.fn(async (url: string) => { if (url === 'https://example.com') { - Network accessline 261
const failingSeed: FetchFn = vi.fn(async (url: string) => { if (url === 'https://example.com') { return { ...makeFetchOutput(url, '', '', []), error: 'fetch_failed' }; - Network accessline 262
if (url === 'https://example.com') { - Network accessline 267
const crawler = new Crawler(failingSeed, rawFetchFn); const result = await crawler.crawl({ url: 'https://example.com', - Network accessline 268
const result = await crawler.crawl({ url: 'https://example.com', strategy: 'bfs', - Network accessline 269
url: 'https://example.com', - Network accessline 280
const crawler = new Crawler(fetchFn, rawFetchFn); await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 281
await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 282
url: 'https://docs.example.com', - Network accessline 289
const apiCalls = (fetchFn as ReturnType<typeof vi.fn>).mock.calls.filter( (c: unknown[]) => c[0] === 'https://docs.example.com/api', - Network accessline 290
(c: unknown[]) => c[0] === 'https://docs.example.com/api', - Network accessline 296
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 297
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 298
url: 'https://docs.example.com', - Network accessline 307
expect(urls).toContain('https://docs.example.com'); - Network accessline 309
expect(urls).not.toContain('https://docs.example.com/api'); - Network accessline 313
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 314
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 315
url: 'https://docs.example.com', - Network accessline 322
const urls = result.pages.map((p) => p.url); expect(urls).not.toContain('https://docs.example.com/api'); - Network accessline 323
expect(urls).not.toContain('https://docs.example.com/api'); - Network accessline 327
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 328
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 329
url: 'https://docs.example.com', - Network accessline 342
it('skips pages that return errors and continues crawling', async () => { const failingFetch: FetchFn = vi.fn(async (url) => { if (url === 'https://docs.example.com') { - Network accessline 343
const failingFetch: FetchFn = vi.fn(async (url) => { if (url === 'https://docs.example.com') { return makeFetchOutput(url, 'Home', '# Home', [ - Network accessline 344
if (url === 'https://docs.example.com') { - Network accessline 345
return makeFetchOutput(url, 'Home', '# Home', [ 'https://docs.example.com/good', 'https://docs.example.com/bad', - Network accessline 346
'https://docs.example.com/good', - Network accessline 347
'https://docs.example.com/bad', - Network accessline 348
]); } if (url === 'https://docs.example.com/bad') { - Network accessline 349
} if (url === 'https://docs.example.com/bad') { return { ...makeFetchOutput(url, '', '', []), error: 'Network timeout' }; - Network accessline 350
if (url === 'https://docs.example.com/bad') { - Network accessline 351
return { ...makeFetchOutput(url, '', '', []), error: 'Network timeout' }; } if (url === 'https://docs.example.com/good') { - Network accessline 352
} if (url === 'https://docs.example.com/good') { return makeFetchOutput(url, 'Good', '# Good\n\nWorks.', []); - Network accessline 353
if (url === 'https://docs.example.com/good') { - Network accessline 359
const crawler = new Crawler(failingFetch, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 360
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 361
url: 'https://docs.example.com', - Network accessline 367
const urls = result.pages.map((p) => p.url); expect(urls).toContain('https://docs.example.com'); - Network accessline 368
expect(urls).toContain('https://docs.example.com'); - Network accessline 369
expect(urls).toContain('https://docs.example.com/good'); - Network accessline 371
expect(urls).not.toContain('https://docs.example.com/bad'); - Network accessline 375
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 376
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 377
url: 'https://docs.example.com', - Network accessline 395
fetchFn = vi.fn(async (url: string) => { if (url === 'https://docs.example.com') { - Network accessline 396
if (url === 'https://docs.example.com') { - Network accessline 397
return makeFetchOutput(url, 'Root', '# Root', [ 'https://docs.example.com/a', 'https://docs.example.com/b', - Network accessline 398
'https://docs.example.com/a', - Network accessline 399
'https://docs.example.com/b', - Network accessline 400
]); } if (url === 'https://docs.example.com/a') { - Network accessline 401
} if (url === 'https://docs.example.com/a') { return makeFetchOutput(url, 'A', '# A', [ - Network accessline 402
if (url === 'https://docs.example.com/a') { - Network accessline 403
return makeFetchOutput(url, 'A', '# A', [ 'https://docs.example.com/a/deep', ]); - Network accessline 404
'https://docs.example.com/a/deep', - Network accessline 405
]); } if (url === 'https://docs.example.com/a/deep') { - Network accessline 406
} if (url === 'https://docs.example.com/a/deep') { return makeFetchOutput(url, 'A Deep', '# A Deep', []); - Network accessline 407
if (url === 'https://docs.example.com/a/deep') { - Network accessline 408
return makeFetchOutput(url, 'A Deep', '# A Deep', []); } if (url === 'https://docs.example.com/b') { - Network accessline 409
} if (url === 'https://docs.example.com/b') { return makeFetchOutput(url, 'B', '# B', []); - Network accessline 410
if (url === 'https://docs.example.com/b') { - Network accessline 428
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 429
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'dfs', - Network accessline 430
url: 'https://docs.example.com', - Network accessline 436
const urls = result.pages.map((p) => p.url); expect(urls).toContain('https://docs.example.com'); - Network accessline 437
expect(urls).toContain('https://docs.example.com'); - Network accessline 438
expect(urls).toContain('https://docs.example.com/a'); - Network accessline 439
expect(urls).toContain('https://docs.example.com/a/deep'); - Network accessline 440
expect(urls).toContain('https://docs.example.com/b'); - Network accessline 446
const bIdx = urls.indexOf('https://docs.example.com/b'); - Network accessline 447
const aIdx = urls.indexOf('https://docs.example.com/a'); - Network accessline 452
const crawler = new Crawler(fetchFn, rawFetchFn); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 453
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'dfs', - Network accessline 454
url: 'https://docs.example.com', - Network accessline 460
const deepPage = result.pages.find((p) => p.url === 'https://docs.example.com/a/deep'); - Network accessline 466
it('fetches pages from sitemap.xml', async () => { const sitemapXml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 467
const sitemapXml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://docs.example.com/page1</loc></url> - Network accessline 468
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 469
<url><loc>https://docs.example.com/page1</loc></url> - Network accessline 470
<url><loc>https://docs.example.com/page2</loc></url> - Network accessline 484
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 485
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'sitemap', - Network accessline 486
url: 'https://docs.example.com', - Network accessline 492
expect(result.total_found).toBe(2); const urls = result.pages.map((p) => p.url); expect(urls).toContain('https://docs.example.com/page1'); - Network accessline 493
const urls = result.pages.map((p) => p.url); expect(urls).toContain('https://docs.example.com/page1'); expect(urls).toContain('https://docs.example.com/page2'); - Network accessline 494
expect(urls).toContain('https://docs.example.com/page1'); - Network accessline 495
expect(urls).toContain('https://docs.example.com/page2'); - Network accessline 509
const fetch: FetchFn = vi.fn(async (url) => makeFetchOutput(url, 'Home', '# Home', ['https://docs.example.com/page1']), - Network accessline 510
makeFetchOutput(url, 'Home', '# Home', ['https://docs.example.com/page1']), - Network accessline 513
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 514
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'sitemap', - Network accessline 515
url: 'https://docs.example.com', - Network accessline 525
it('respects max_pages for sitemap strategy', async () => { const urls = Array.from({ length: 50 }, (_, i) => `<url><loc>https://docs.example.com/p${i}</loc></url>`, - Network accessline 526
const urls = Array.from({ length: 50 }, (_, i) => `<url><loc>https://docs.example.com/p${i}</loc></url>`, ).join('\n'); - Network accessline 527
`<url><loc>https://docs.example.com/p${i}</loc></url>`, - Network accessline 529
const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls}</urlset>`; - Network accessline 542
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 543
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'sitemap', - Network accessline 544
url: 'https://docs.example.com', - Network accessline 553
it('threads challenge_class/solve_method through the sitemap/explicit-urls path', async () => { const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 554
const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 555
<url><loc>https://docs.example.com/page1</loc></url> - Network accessline 571
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 572
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'sitemap', - Network accessline 573
url: 'https://docs.example.com', - Network accessline 584
describe('Crawler — canonical output URLs', () => { it('collapses trailing-slash duplicates from sitemap into one page', async () => { const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9 - Network accessline 585
it('collapses trailing-slash duplicates from sitemap into one page', async () => { const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://docs.example.com/intro</loc - Network accessline 586
const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 587
<url><loc>https://docs.example.com/intro</loc></url> - Network accessline 588
<url><loc>https://docs.example.com/intro/</loc></url> - Network accessline 589
<url><loc>https://docs.example.com/api</loc></url> - Network accessline 603
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 604
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'sitemap', - Network accessline 605
url: 'https://docs.example.com', - Network accessline 610
const urls = result.pages.map((p) => p.url); expect(urls).toHaveLength(2); expect(urls).toContain('https://docs.example.com/intro'); - Network accessline 611
expect(urls).toHaveLength(2); expect(urls).toContain('https://docs.example.com/intro'); expect(urls).toContain('https://docs.example.com/api'); - Network accessline 612
expect(urls).toContain('https://docs.example.com/intro'); - Network accessline 613
expect(urls).toContain('https://docs.example.com/api'); - Network accessline 621
const fetchSpy: FetchFn = vi.fn(async (url: string) => { if (url === 'https://docs.example.com') { - Network accessline 622
if (url === 'https://docs.example.com') { - Network accessline 623
return makeFetchOutput(url, 'Home', '# Home', [ 'https://docs.example.com/page#section-1', 'https://docs.example.com/page#section-2', - Network accessline 624
'https://docs.example.com/page#section-1', - Network accessline 625
'https://docs.example.com/page#section-2', - Network accessline 626
'https://docs.example.com/page#section-3', - Network accessline 627
'https://docs.example.com/page', - Network accessline 628
'https://docs.example.com/page#section-4', - Network accessline 632
return makeFetchOutput('https://docs.example.com/page', 'Page', '# Page', []); - Network accessline 638
const crawler = new Crawler(fetchSpy, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 639
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 640
url: 'https://docs.example.com', - Network accessline 646
const pageHits = result.pages.filter((p) => p.url === 'https://docs.example.com/page').length; - Network accessline 657
const fetch: FetchFn = vi.fn(async (url) => { if (url === 'https://docs.example.com') { - Network accessline 658
if (url === 'https://docs.example.com') { - Network accessline 659
return makeFetchOutput(url, 'Home', '# Home', [ 'https://docs.example.com/intro#welcome', 'https://docs.example.com/intro#getting-started', - Network accessline 660
'https://docs.example.com/intro#welcome', - Network accessline 661
'https://docs.example.com/intro#getting-started', - Network accessline 666
return makeFetchOutput('https://docs.example.com/intro#welcome', 'Intro', '# Intro', []); - Network accessline 672
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 673
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 674
url: 'https://docs.example.com', - Network accessline 680
const introHits = result.pages.filter(p => p.url.startsWith('https://docs.example.com/intro')); - Network accessline 681
expect(introHits).toHaveLength(1); expect(introHits[0].url).toBe('https://docs.example.com/intro'); }); - Network accessline 682
expect(introHits[0].url).toBe('https://docs.example.com/intro'); - Network accessline 690
const fetchSpy: FetchFn = vi.fn(async (url: string) => { if (url === 'https://docs.example.com') { - Network accessline 691
if (url === 'https://docs.example.com') { - Network accessline 692
return makeFetchOutput(url, 'Home', '# Home', [ 'https://docs.example.com/foo', 'https://docs.example.com/foo#section-a', - Network accessline 693
'https://docs.example.com/foo', - Network accessline 694
'https://docs.example.com/foo#section-a', - Network accessline 695
'https://docs.example.com/foo#section-b', - Network accessline 704
const crawler = new Crawler(fetchSpy, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com', - Network accessline 705
const result = await crawler.crawl({ url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 706
url: 'https://docs.example.com', - Network accessline 713
expect(result.links).toBeDefined(); const fooEdges = result.links!.filter((e) => e.from === 'https://docs.example.com' && - Network accessline 714
const fooEdges = result.links!.filter((e) => e.from === 'https://docs.example.com' && e.to.startsWith('https://docs.example.com/foo'), - Network accessline 715
e.from === 'https://docs.example.com' && - Network accessline 716
e.to.startsWith('https://docs.example.com/foo'), - Network accessline 721
expect(fooEdges[0].to).toBe('https://docs.example.com/foo'); - Network accessline 724
it('strips trailing slash on emitted non-root paths', async () => { const fetch: FetchFn = vi.fn(async (url) => { if (url === 'https://docs.example.com/intro') { - Network accessline 726
if (url === 'https://docs.example.com/intro') { - Network accessline 729
return makeFetchOutput('https://docs.example.com/intro/', 'Intro', '# Intro', []); - Network accessline 737
const crawler = new Crawler(fetch, rawFetch); const result = await crawler.crawl({ url: 'https://docs.example.com/intro', - Network accessline 738
const result = await crawler.crawl({ url: 'https://docs.example.com/intro', strategy: 'bfs', - Network accessline 739
url: 'https://docs.example.com/intro', - Network accessline 745
expect(result.pages).toHaveLength(1); expect(result.pages[0].url).toBe('https://docs.example.com/intro'); - Network accessline 746
expect(result.pages[0].url).toBe('https://docs.example.com/intro'); - Network accessline 803
const crawler = new Crawler(crawlFetchFn(router), rawFetchStub); await crawler.crawl({ url: 'https://blocked.example.com', strategy: 'bfs', max_depth: 0, max_pages: 1 }); - Network accessline 804
await crawler.crawl({ url: 'https://blocked.example.com', strategy: 'bfs', max_depth: 0, max_pages: 1 }); - Network accessline 822
const crawler = new Crawler(crawlFetchFn(router), rawFetchStub); await crawler.crawl({ url: 'https://nostatus.example.com', strategy: 'bfs', max_depth: 0, max_pages: 1 }); - Network accessline 823
await crawler.crawl({ url: 'https://nostatus.example.com', strategy: 'bfs', max_depth: 0, max_pages: 1 }); - Network accessline 833
limiter.setRobotsCrawlDelay('blocked.example.com', 0.1); // 100ms floor limiter.registerDomain('https://blocked.example.com/a'); - Network accessline 834
limiter.registerDomain('https://blocked.example.com/a');
tests/unit/crawl/dedup.test.ts
- Executable scriptline 1
Executable file - Network accessline 72
const nav = '## Navigation\n\n[Home](/) | [Docs](/docs) | [API](/api)'; const pages = [ { url: 'https://example.com/a', markdown: `# Page A\n\nContent A.\n\n${nav}` }, - Network accessline 73
const pages = [ { url: 'https://example.com/a', markdown: `# Page A\n\nContent A.\n\n${nav}` }, { url: 'https://example.com/b', markdown: `# Page B\n\nContent B.\n\n${nav}` }, - Network accessline 74
{ url: 'https://example.com/a', markdown: `# Page A\n\nContent A.\n\n${nav}` }, - Network accessline 75
{ url: 'https://example.com/b', markdown: `# Page B\n\nContent B.\n\n${nav}` }, - Network accessline 76
{ url: 'https://example.com/c', markdown: `# Page C\n\nContent C.\n\n${nav}` }, - Network accessline 89
it('keeps blocks appearing in <=50% of pages', () => { const pages = [ { url: 'https://a.com/1', markdown: '# Unique A\n\nOnly here.' }, - Network accessline 90
const pages = [ { url: 'https://a.com/1', markdown: '# Unique A\n\nOnly here.' }, { url: 'https://a.com/2', markdown: '# Unique B\n\nAlso unique.' }, - Network accessline 91
{ url: 'https://a.com/1', markdown: '# Unique A\n\nOnly here.' }, - Network accessline 92
{ url: 'https://a.com/2', markdown: '# Unique B\n\nAlso unique.' }, - Network accessline 93
{ url: 'https://a.com/3', markdown: '# Unique C\n\nDifferent.' }, - Network accessline 104
const footer = 'Copyright 2024 Example Inc. All rights reserved.'; const pages = [ { url: 'https://a.com/1', markdown: `Content A.\n\n${footer}` }, - Network accessline 105
const pages = [ { url: 'https://a.com/1', markdown: `Content A.\n\n${footer}` }, { url: 'https://a.com/2', markdown: `Content B.\n\n${footer}` }, - Network accessline 106
{ url: 'https://a.com/1', markdown: `Content A.\n\n${footer}` }, - Network accessline 107
{ url: 'https://a.com/2', markdown: `Content B.\n\n${footer}` }, - Network accessline 108
{ url: 'https://a.com/3', markdown: `Content C.\n\n${footer}` }, - Network accessline 122
it('returns unchanged for single page', () => { const pages = [{ url: 'https://a.com', markdown: '# Solo\n\nContent.' }]; - Network accessline 123
const pages = [{ url: 'https://a.com', markdown: '# Solo\n\nContent.' }]; - Network accessline 140
].join('\n'); const pages = Array.from({ length: 5 }, (_, i) => ({ url: `https://example.com/p${i}`, - Network accessline 141
const pages = Array.from({ length: 5 }, (_, i) => ({ url: `https://example.com/p${i}`, markdown: `${nav}\n\n# Page ${i}\n\nUnique content for page ${i}.`, - Network accessline 142
url: `https://example.com/p${i}`, - Network accessline 161
].join('\n'); const pages = Array.from({ length: 5 }, (_, i) => ({ url: `https://example.com/p${i}`, - Network accessline 162
const pages = Array.from({ length: 5 }, (_, i) => ({ url: `https://example.com/p${i}`, markdown: `# Article ${i}\n\nBody text ${i}.\n\n${footer}`, - Network accessline 163
url: `https://example.com/p${i}`, - Network accessline 186
].join('\n'); const pages = Array.from({ length: 3 }, (_, i) => ({ url: `https://example.com/p${i}`, - Network accessline 187
const pages = Array.from({ length: 3 }, (_, i) => ({ url: `https://example.com/p${i}`, markdown: `${nav}\n\n# Page ${i}\n\nUnique body ${i}.`, - Network accessline 188
url: `https://example.com/p${i}`,
tests/unit/crawl/etag-incremental.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
function makeResult(headers: Record<string, string>): RawFetchResult { return { url: 'https://example.com/page', - Network accessline 13
return { url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 14
url: 'https://example.com/page', - Network accessline 15
finalUrl: 'https://example.com/page', - Network accessline 36
expect(() => saveFetchHeaders('https://example.com/x', { etag: '"abc"' })).not.toThrow(); - Network accessline 39
it('saveFetchHeaders + getCachedHeaders roundtrip', () => { saveFetchHeaders('https://example.com/page', { - Network accessline 40
saveFetchHeaders('https://example.com/page', { - Network accessline 42
'Last-Modified': 'Wed, 01 Jan 2025 00:00:00 GMT', }); const cached = getCachedHeaders('https://example.com/page'); - Network accessline 43
}); const cached = getCachedHeaders('https://example.com/page'); expect(cached).not.toBeNull(); - Network accessline 44
const cached = getCachedHeaders('https://example.com/page'); - Network accessline 51
it('returns null for unknown url', () => { expect(getCachedHeaders('https://example.com/missing')).toBeNull(); - Network accessline 52
expect(getCachedHeaders('https://example.com/missing')).toBeNull(); - Network accessline 55
it('upserts on repeat save', () => { saveFetchHeaders('https://example.com/page', { etag: '"v1"' }); - Network accessline 56
saveFetchHeaders('https://example.com/page', { etag: '"v1"' }); - Network accessline 57
saveFetchHeaders('https://example.com/page', { etag: '"v2"' }); - Network accessline 58
const cached = getCachedHeaders('https://example.com/page'); - Network accessline 62
it('multiple URLs stay independent', () => { saveFetchHeaders('https://a.example.com/x', { etag: '"a"' }); - Network accessline 63
saveFetchHeaders('https://a.example.com/x', { etag: '"a"' }); - Network accessline 64
saveFetchHeaders('https://b.example.com/y', { etag: '"b"' }); - Network accessline 65
expect(getCachedHeaders('https://a.example.com/x')!.etag).toBe('"a"'); - Network accessline 66
expect(getCachedHeaders('https://b.example.com/y')!.etag).toBe('"b"'); - Network accessline 69
it('markFetchedNotModified updates fetched_at only', async () => { saveFetchHeaders('https://example.com/page', { etag: '"v1"' }); - Network accessline 70
saveFetchHeaders('https://example.com/page', { etag: '"v1"' }); - Network accessline 71
const before = getCachedHeaders('https://example.com/page')!.fetchedAt; - Network accessline 72
await new Promise(r => setTimeout(r, 10)); markFetchedNotModified('https://example.com/page'); const after = getCachedHeaders('https://example.com/page')!; - Network accessline 73
markFetchedNotModified('https://example.com/page'); - Network accessline 74
const after = getCachedHeaders('https://example.com/page')!; - Network accessline 80
it('cache empty → full fetch + save', async () => { const fetchFn = vi.fn(async () => makeResult({ etag: '"new"' })); const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 81
const fetchFn = vi.fn(async () => makeResult({ etag: '"new"' })); const result = await conditionalFetch('https://example.com/page', fetchFn); expect(result.notModified).toBeUndefined(); - Network accessline 82
const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 83
expect(result.notModified).toBeUndefined(); expect(fetchFn).toHaveBeenCalledTimes(1); expect(getCachedHeaders('https://example.com/page')!.etag).toBe('"new"'); - Network accessline 84
expect(fetchFn).toHaveBeenCalledTimes(1); expect(getCachedHeaders('https://example.com/page')!.etag).toBe('"new"'); }); - Network accessline 85
expect(getCachedHeaders('https://example.com/page')!.etag).toBe('"new"'); - Network accessline 88
it('cache present + matching etag → notModified=true', async () => { saveFetchHeaders('https://example.com/page', { etag: '"same"' }); - Network accessline 89
saveFetchHeaders('https://example.com/page', { etag: '"same"' }); - Network accessline 90
const fetchFn = vi.fn(async () => makeResult({ etag: '"same"' })); const result = await conditionalFetch('https://example.com/page', fetchFn); expect(result.notModified).toBe(true); - Network accessline 91
const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 95
it('cache present + different etag → no notModified flag', async () => { saveFetchHeaders('https://example.com/page', { etag: '"old"' }); - Network accessline 96
saveFetchHeaders('https://example.com/page', { etag: '"old"' }); - Network accessline 97
const fetchFn = vi.fn(async () => makeResult({ etag: '"new"' })); const result = await conditionalFetch('https://example.com/page', fetchFn); expect(result.notModified).toBeUndefined(); - Network accessline 98
const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 99
expect(result.notModified).toBeUndefined(); expect(getCachedHeaders('https://example.com/page')!.etag).toBe('"new"'); }); - Network accessline 100
expect(getCachedHeaders('https://example.com/page')!.etag).toBe('"new"'); - Network accessline 103
it('falls back to last-modified when etag absent', async () => { saveFetchHeaders('https://example.com/page', { - Network accessline 104
saveFetchHeaders('https://example.com/page', { - Network accessline 108
'last-modified': 'Mon, 01 Jan 2024 00:00:00 GMT', })); const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 109
})); const result = await conditionalFetch('https://example.com/page', fetchFn); expect(result.notModified).toBe(true); - Network accessline 110
const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 114
it('response missing etag/last-modified → marks not-modified on existing row', async () => { saveFetchHeaders('https://example.com/page', { etag: '"prev"' }); - Network accessline 115
saveFetchHeaders('https://example.com/page', { etag: '"prev"' }); - Network accessline 116
const before = getCachedHeaders('https://example.com/page')!.fetchedAt; - Network accessline 119
const fetchFn = vi.fn(async () => makeResult({})); await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 120
await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 122
const after = getCachedHeaders('https://example.com/page')!; - Network accessline 127
it('injects If-None-Match / If-Modified-Since from the cached row', async () => { saveFetchHeaders('https://example.com/page', { - Network accessline 128
saveFetchHeaders('https://example.com/page', { - Network accessline 133
makeResult({ etag: '"v9"' }), ); await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 135
await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 143
it('no cached headers → no conditionalHeaders passed to rawFetchFn', async () => { const fetchFn = vi.fn(async (_url: string, _opts?: unknown) => makeResult({ etag: '"new"' })); await conditionalFetch('https://example.com/page', - Network accessline 144
const fetchFn = vi.fn(async (_url: string, _opts?: unknown) => makeResult({ etag: '"new"' })); await conditionalFetch('https://example.com/page', fetchFn); const call = fetchFn.mock.calls[0]; - Network accessline 145
await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 150
it('statusCode 304 short-circuits to notModified=true', async () => { saveFetchHeaders('https://example.com/page', { etag: '"v1"' }); - Network accessline 151
saveFetchHeaders('https://example.com/page', { etag: '"v1"' }); - Network accessline 152
const fetchFn = vi.fn(async () => ({ url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 153
url: 'https://example.com/page', - Network accessline 154
finalUrl: 'https://example.com/page', - Network accessline 159
headers: {}, })); const result = await conditionalFetch('https://example.com/page', fetchFn); - Network accessline 160
})); const result = await conditionalFetch('https://example.com/page', fetchFn); expect(result.notModified).toBe(true); - Network accessline 161
const result = await conditionalFetch('https://example.com/page', fetchFn);
tests/unit/crawl/index-to-vec.test.ts
- Executable scriptline 1
Executable file - Network accessline 28
function makeItem(overrides: Partial<CrawlResultItem> = {}): CrawlResultItem { return { url: 'https://example.com/page', - Network accessline 29
return { url: 'https://example.com/page', title: 'Sample Page', - Network accessline 30
url: 'https://example.com/page', - Network accessline 75
const [records] = upsertMock.mock.calls[0]; expect(records).toHaveLength(1); expect(records[0].id).toBe('https://example.com/page'); - Network accessline 76
expect(records).toHaveLength(1); expect(records[0].id).toBe('https://example.com/page'); expect(records[0].metadata.url).toBe('https://example.com/page'); - Network accessline 77
expect(records[0].id).toBe('https://example.com/page'); - Network accessline 78
expect(records[0].metadata.url).toBe('https://example.com/page');
tests/unit/crawl/mapper.test.ts
- Executable scriptline 1
Executable file - Network accessline 21
it('extracts same-origin absolute links', () => { const html = htmlPage([ 'https://example.com/docs/intro', - Network accessline 22
const html = htmlPage([ 'https://example.com/docs/intro', 'https://example.com/docs/api', - Network accessline 23
'https://example.com/docs/intro', - Network accessline 24
'https://example.com/docs/api', - Network accessline 25
'https://other.com/page', - Network accessline 26
]); const links = extractLinks(html, 'https://example.com'); expect(links).toContain('https://example.com/docs/intro'); - Network accessline 27
const links = extractLinks(html, 'https://example.com'); - Network accessline 28
expect(links).toContain('https://example.com/docs/intro'); - Network accessline 29
expect(links).toContain('https://example.com/docs/api'); - Network accessline 30
expect(links).not.toContain('https://other.com/page'); - Network accessline 33
it('resolves relative URLs against origin', () => { const html = htmlPage(['/docs/intro', '/docs/api', '../guide']); const links = extractLinks(html, 'https://example.com'); - Network accessline 34
const html = htmlPage(['/docs/intro', '/docs/api', '../guide']); const links = extractLinks(html, 'https://example.com'); expect(links).toContain('https://example.com/docs/intro'); - Network accessline 35
const links = extractLinks(html, 'https://example.com'); - Network accessline 36
expect(links).toContain('https://example.com/docs/intro'); - Network accessline 37
expect(links).toContain('https://example.com/docs/api'); - Network accessline 44
'/docs/intro', ]); const links = extractLinks(html, 'https://example.com'); - Network accessline 46
const links = extractLinks(html, 'https://example.com'); - Network accessline 48
const introCount = links.filter((l) => l === 'https://example.com/docs/intro').length; - Network accessline 52
it('skips javascript: hrefs', () => { const html = htmlPage(['javascript:void(0)', 'javascript:alert(1)']); const links = extractLinks(html, 'https://example.com'); - Network accessline 53
const html = htmlPage(['javascript:void(0)', 'javascript:alert(1)']); const links = extractLinks(html, 'https://example.com'); expect(links).toHaveLength(0); - Network accessline 54
const links = extractLinks(html, 'https://example.com'); - Network accessline 58
it('skips mailto: hrefs', () => { const html = htmlPage(['mailto:user@example.com']); const links = extractLinks(html, 'https://example.com'); - Network accessline 59
const html = htmlPage(['mailto:user@example.com']); const links = extractLinks(html, 'https://example.com'); expect(links).toHaveLength(0); - Network accessline 60
const links = extractLinks(html, 'https://example.com'); - Network accessline 64
it('skips tel: hrefs', () => { const html = htmlPage(['tel:+1234567890']); const links = extractLinks(html, 'https://example.com'); - Network accessline 65
const html = htmlPage(['tel:+1234567890']); const links = extractLinks(html, 'https://example.com'); expect(links).toHaveLength(0); - Network accessline 66
const links = extractLinks(html, 'https://example.com'); - Network accessline 70
it('skips anchors with no href attribute', () => { const html = '<html><body><a>No href</a><a href="">Empty href</a></body></html>'; const links = extractLinks(html, 'https://example.com'); - Network accessline 72
const links = extractLinks(html, 'https://example.com'); - Network accessline 74
expect(links.every((l) => l.startsWith('https://example.com'))).toBe(true); - Network accessline 77
it('skips fragment-only links (#section)', () => { const html = htmlPage(['#section-1', '#top', '#']); const links = extractLinks(html, 'https://example.com'); - Network accessline 79
const links = extractLinks(html, 'https://example.com'); - Network accessline 84
it('deduplicates identical URLs', () => { const html = htmlPage(['/docs/api', '/docs/api', '/docs/api']); const links = extractLinks(html, 'https://example.com'); - Network accessline 85
const html = htmlPage(['/docs/api', '/docs/api', '/docs/api']); const links = extractLinks(html, 'https://example.com'); expect(links.filter((l) => l === 'https://example.com/docs/api')).toHaveLength(1); - Network accessline 86
const links = extractLinks(html, 'https://example.com'); - Network accessline 87
expect(links.filter((l) => l === 'https://example.com/docs/api')).toHaveLength(1); - Network accessline 96
</script> </body></html>`; const links = extractLinks(html, 'https://example.com'); - Network accessline 97
</body></html>`; const links = extractLinks(html, 'https://example.com'); expect(links).toContain('https://example.com/real-link'); - Network accessline 98
const links = extractLinks(html, 'https://example.com'); - Network accessline 99
expect(links).toContain('https://example.com/real-link'); - Network accessline 100
expect(links).not.toContain('https://example.com/script-link'); - Network accessline 101
expect(links).not.toContain('https://example.com/another-script-link'); - Network accessline 104
it('returns empty array for empty HTML', () => { const links = extractLinks('', 'https://example.com'); - Network accessline 105
const links = extractLinks('', 'https://example.com'); - Network accessline 109
it('returns empty array for HTML with no links', () => { const html = '<html><body><p>No links here</p></body></html>'; const links = extractLinks(html, 'https://example.com'); - Network accessline 110
const html = '<html><body><p>No links here</p></body></html>'; const links = extractLinks(html, 'https://example.com'); expect(links).toEqual([]); - Network accessline 111
const links = extractLinks(html, 'https://example.com'); - Network accessline 115
it('handles broken/malformed HTML gracefully', () => { const html = '<html><body><a href="/page1">Link<a href="/page2">Link2</body>'; const links = extractLinks(html, 'https://example.com'); - Network accessline 117
const links = extractLinks(html, 'https://example.com'); - Network accessline 122
it('handles data: URI hrefs without crashing', () => { const html = htmlPage(['data:text/html,<h1>hi</h1>']); const links = extractLinks(html, 'https://example.com'); - Network accessline 123
const html = htmlPage(['data:text/html,<h1>hi</h1>']); const links = extractLinks(html, 'https://example.com'); expect(links).toHaveLength(0); - Network accessline 124
const links = extractLinks(html, 'https://example.com'); - Network accessline 134
it('discovers links from seed page', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/docs/intro', '/docs/api', 'https://external.com']), - Network accessline 135
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/docs/intro', '/docs/api', 'https://external.com']), }); - Network accessline 136
'https://example.com': htmlPage(['/docs/intro', '/docs/api', 'https://external.com']), - Network accessline 139
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 140
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 144
expect(result.urls).toContain('https://example.com'); - Network accessline 145
expect(result.urls).toContain('https://example.com/docs/intro'); - Network accessline 146
expect(result.urls).toContain('https://example.com/docs/api'); - Network accessline 147
expect(result.urls).not.toContain('https://external.com'); - Network accessline 152
it('returns only URLs, no content or titles', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page']), - Network accessline 153
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page']), }); - Network accessline 154
'https://example.com': htmlPage(['/page']), - Network accessline 157
const result = await mapUrls( { url: 'https://example.com', max_depth: 1 }, - Network accessline 158
{ url: 'https://example.com', max_depth: 1 }, - Network accessline 170
it('includes seed URL in results even with no links', async () => { const fetchFn = createMockFetch({ 'https://example.com': '<html><body><p>No links</p></body></html>', - Network accessline 171
const fetchFn = createMockFetch({ 'https://example.com': '<html><body><p>No links</p></body></html>', }); - Network accessline 172
'https://example.com': '<html><body><p>No links</p></body></html>', - Network accessline 175
const result = await mapUrls( { url: 'https://example.com', max_depth: 1 }, - Network accessline 176
{ url: 'https://example.com', max_depth: 1 }, - Network accessline 180
expect(result.urls).toEqual(['https://example.com']); - Network accessline 186
it('follows BFS to max_depth=2', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/level1']), - Network accessline 187
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/level1']), 'https://example.com/level1': htmlPage(['/level2']), - Network accessline 188
'https://example.com': htmlPage(['/level1']), - Network accessline 189
'https://example.com/level1': htmlPage(['/level2']), - Network accessline 190
'https://example.com/level2': htmlPage(['/level3']), - Network accessline 193
const result = await mapUrls( { url: 'https://example.com', max_depth: 2, max_pages: 100 }, - Network accessline 194
{ url: 'https://example.com', max_depth: 2, max_pages: 100 }, - Network accessline 198
expect(result.urls).toContain('https://example.com'); - Network accessline 199
expect(result.urls).toContain('https://example.com/level1'); - Network accessline 200
expect(result.urls).toContain('https://example.com/level2'); - Network accessline 203
expect(result.urls).toContain('https://example.com/level3'); - Network accessline 206
it('depth=0 returns only seed URL links (no traversal beyond seed)', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1', '/page2']), - Network accessline 207
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1', '/page2']), 'https://example.com/page1': htmlPage(['/deep']), - Network accessline 208
'https://example.com': htmlPage(['/page1', '/page2']), - Network accessline 209
'https://example.com/page1': htmlPage(['/deep']), - Network accessline 212
const result = await mapUrls( { url: 'https://example.com', max_depth: 0, max_pages: 100 }, - Network accessline 213
{ url: 'https://example.com', max_depth: 0, max_pages: 100 }, - Network accessline 218
expect(result.urls).toContain('https://example.com'); - Network accessline 219
expect(result.urls).toContain('https://example.com/page1'); - Network accessline 220
expect(result.urls).toContain('https://example.com/page2'); - Network accessline 221
expect(result.urls).not.toContain('https://example.com/deep'); - Network accessline 230
const fetchOrder: string[] = []; const pages: Record<string, string> = { 'https://example.com': htmlPage(['/a', '/b']), - Network accessline 231
const pages: Record<string, string> = { 'https://example.com': htmlPage(['/a', '/b']), 'https://example.com/a': htmlPage(['/a1', '/a2']), - Network accessline 232
'https://example.com': htmlPage(['/a', '/b']), - Network accessline 233
'https://example.com/a': htmlPage(['/a1', '/a2']), - Network accessline 234
'https://example.com/b': htmlPage(['/b1']), - Network accessline 235
'https://example.com/a1': htmlPage([]), - Network accessline 236
'https://example.com/a2': htmlPage([]), - Network accessline 237
'https://example.com/b1': htmlPage([]), - Network accessline 245
await mapUrls( { url: 'https://example.com', max_depth: 2, max_pages: 100 }, - Network accessline 246
{ url: 'https://example.com', max_depth: 2, max_pages: 100 }, - Network accessline 251
const seedIdx = fetchOrder.indexOf('https://example.com'); - Network accessline 252
const aIdx = fetchOrder.indexOf('https://example.com/a'); - Network accessline 253
const bIdx = fetchOrder.indexOf('https://example.com/b'); - Network accessline 254
const a1Idx = fetchOrder.indexOf('https://example.com/a1'); - Network accessline 255
const b1Idx = fetchOrder.indexOf('https://example.com/b1'); - Network accessline 265
it('handles circular links (A -> B -> A) without infinite loop', async () => { const fetchFn = createMockFetch({ 'https://example.com/a': htmlPage(['/b']), - Network accessline 266
const fetchFn = createMockFetch({ 'https://example.com/a': htmlPage(['/b']), 'https://example.com/b': htmlPage(['/a']), - Network accessline 267
'https://example.com/a': htmlPage(['/b']), - Network accessline 268
'https://example.com/b': htmlPage(['/a']), - Network accessline 271
const result = await mapUrls( { url: 'https://example.com/a', max_depth: 10, max_pages: 100 }, - Network accessline 272
{ url: 'https://example.com/a', max_depth: 10, max_pages: 100 }, - Network accessline 276
expect(result.urls).toContain('https://example.com/a'); - Network accessline 277
expect(result.urls).toContain('https://example.com/b'); - Network accessline 281
it('handles self-referencing page (A -> A)', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/', '/page', '/']), - Network accessline 282
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/', '/page', '/']), }); - Network accessline 283
'https://example.com': htmlPage(['/', '/page', '/']), - Network accessline 286
const result = await mapUrls( { url: 'https://example.com', max_depth: 3, max_pages: 100 }, - Network accessline 287
{ url: 'https://example.com', max_depth: 3, max_pages: 100 }, - Network accessline 292
const seedCount = result.urls.filter((u) => u === 'https://example.com' || u === 'https://example.com/').length; - Network accessline 297
it('handles triangle cycle (A -> B -> C -> A)', async () => { const fetchFn = createMockFetch({ 'https://example.com/a': htmlPage(['/b']), - Network accessline 298
const fetchFn = createMockFetch({ 'https://example.com/a': htmlPage(['/b']), 'https://example.com/b': htmlPage(['/c']), - Network accessline 299
'https://example.com/a': htmlPage(['/b']), - Network accessline 300
'https://example.com/b': htmlPage(['/c']), - Network accessline 301
'https://example.com/c': htmlPage(['/a']), - Network accessline 304
const result = await mapUrls( { url: 'https://example.com/a', max_depth: 10, max_pages: 100 }, - Network accessline 305
{ url: 'https://example.com/a', max_depth: 10, max_pages: 100 }, - Network accessline 309
expect(result.urls).toHaveLength(3); expect(result.urls).toContain('https://example.com/a'); - Network accessline 310
expect(result.urls).toContain('https://example.com/a'); - Network accessline 311
expect(result.urls).toContain('https://example.com/b'); - Network accessline 312
expect(result.urls).toContain('https://example.com/c'); - Network accessline 319
const links = Array.from({ length: 50 }, (_, i) => `/page/${i}`); const pages: Record<string, string> = { 'https://example.com': htmlPage(links), - Network accessline 320
const pages: Record<string, string> = { 'https://example.com': htmlPage(links), }; - Network accessline 321
'https://example.com': htmlPage(links), - Network accessline 324
for (const link of links) { pages[`https://example.com${link}`] = htmlPage([]); - Network accessline 325
pages[`https://example.com${link}`] = htmlPage([]); - Network accessline 330
const result = await mapUrls( { url: 'https://example.com', max_pages: 10, max_depth: 1 }, - Network accessline 331
{ url: 'https://example.com', max_pages: 10, max_depth: 1 }, - Network accessline 339
it('max_pages=1 returns only seed URL', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1', '/page2', '/page3']), - Network accessline 340
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1', '/page2', '/page3']), }); - Network accessline 341
'https://example.com': htmlPage(['/page1', '/page2', '/page3']), - Network accessline 344
const result = await mapUrls( { url: 'https://example.com', max_pages: 1, max_depth: 1 }, - Network accessline 345
{ url: 'https://example.com', max_pages: 1, max_depth: 1 }, - Network accessline 349
expect(result.urls).toEqual(['https://example.com']); - Network accessline 353
it('stops BFS traversal when max_pages reached mid-level', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/a', '/b', '/c', '/d', '/e']), - Network accessline 354
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/a', '/b', '/c', '/d', '/e']), 'https://example.com/a': htmlPage(['/a1']), - Network accessline 355
'https://example.com': htmlPage(['/a', '/b', '/c', '/d', '/e']), - Network accessline 356
'https://example.com/a': htmlPage(['/a1']), - Network accessline 357
'https://example.com/b': htmlPage(['/b1']), - Network accessline 358
'https://example.com/c': htmlPage(['/c1']), - Network accessline 359
'https://example.com/d': htmlPage(['/d1']), - Network accessline 360
'https://example.com/e': htmlPage(['/e1']), - Network accessline 363
const result = await mapUrls( { url: 'https://example.com', max_pages: 4, max_depth: 2 }, - Network accessline 364
{ url: 'https://example.com', max_pages: 4, max_depth: 2 }, - Network accessline 373
it('filters by include_patterns', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/docs/guide', '/blog/post', '/docs/api', '/about']), - Network accessline 374
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/docs/guide', '/blog/post', '/docs/api', '/about']), }); - Network accessline 375
'https://example.com': htmlPage(['/docs/guide', '/blog/post', '/docs/api', '/about']), - Network accessline 378
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, include_patterns: ['/docs/'] }, - Network accessline 379
{ url: 'https://example.com', max_depth: 1, include_patterns: ['/docs/'] }, - Network accessline 384
const nonSeedUrls = result.urls.filter((u) => u !== 'https://example.com'); - Network accessline 385
expect(nonSeedUrls.every((u) => u.includes('/docs/'))).toBe(true); expect(nonSeedUrls).not.toContain('https://example.com/blog/post'); expect(nonSeedUrls).not.toContain('https://example.com/about'); - Network accessline 386
expect(nonSeedUrls).not.toContain('https://example.com/blog/post'); - Network accessline 387
expect(nonSeedUrls).not.toContain('https://example.com/about'); - Network accessline 390
it('filters by exclude_patterns', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/docs/guide', '/blog/post', '/docs/api']), - Network accessline 391
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/docs/guide', '/blog/post', '/docs/api']), }); - Network accessline 392
'https://example.com': htmlPage(['/docs/guide', '/blog/post', '/docs/api']), - Network accessline 395
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, exclude_patterns: ['/blog/'] }, - Network accessline 396
{ url: 'https://example.com', max_depth: 1, exclude_patterns: ['/blog/'] }, - Network accessline 400
expect(result.urls).not.toContain('https://example.com/blog/post'); - Network accessline 401
expect(result.urls).toContain('https://example.com/docs/guide'); - Network accessline 404
it('applies include and exclude patterns together', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ - Network accessline 405
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ '/docs/guide', - Network accessline 406
'https://example.com': htmlPage([ - Network accessline 414
const result = await mapUrls( { url: 'https://example.com', - Network accessline 415
{ url: 'https://example.com', max_depth: 1, - Network accessline 416
url: 'https://example.com', - Network accessline 424
const nonSeedUrls = result.urls.filter((u) => u !== 'https://example.com'); - Network accessline 425
expect(nonSeedUrls).toContain('https://example.com/docs/guide'); - Network accessline 426
expect(nonSeedUrls).toContain('https://example.com/docs/api'); - Network accessline 427
expect(nonSeedUrls).not.toContain('https://example.com/docs/changelog'); - Network accessline 428
expect(nonSeedUrls).not.toContain('https://example.com/blog/post'); - Network accessline 431
it('handles regex patterns (not just substring)', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/v2/docs', '/v2/api', '/v1/docs', '/v3/docs']), - Network accessline 432
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/v2/docs', '/v2/api', '/v1/docs', '/v3/docs']), }); - Network accessline 433
'https://example.com': htmlPage(['/v2/docs', '/v2/api', '/v1/docs', '/v3/docs']), - Network accessline 436
const result = await mapUrls( { url: 'https://example.com', - Network accessline 437
{ url: 'https://example.com', max_depth: 1, - Network accessline 438
url: 'https://example.com', - Network accessline 439
max_depth: 1, include_patterns: ['^https://example\\.com/v2/'], }, - Network accessline 440
include_patterns: ['^https://example\\.com/v2/'], - Network accessline 445
const nonSeedUrls = result.urls.filter((u) => u !== 'https://example.com'); - Network accessline 446
expect(nonSeedUrls).toContain('https://example.com/v2/docs'); - Network accessline 447
expect(nonSeedUrls).toContain('https://example.com/v2/api'); - Network accessline 448
expect(nonSeedUrls).not.toContain('https://example.com/v1/docs'); - Network accessline 449
expect(nonSeedUrls).not.toContain('https://example.com/v3/docs'); - Network accessline 454
it('only discovers same-origin URLs', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ - Network accessline 455
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ 'https://example.com/page', - Network accessline 456
'https://example.com': htmlPage([ - Network accessline 457
'https://example.com/page', - Network accessline 458
'https://other.com/page', - Network accessline 459
'https://sub.example.com/page', - Network accessline 460
'http://example.com/insecure', // different protocol = different origin - Network accessline 464
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 465
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 469
expect(result.urls).toContain('https://example.com/page'); - Network accessline 470
expect(result.urls).not.toContain('https://other.com/page'); - Network accessline 471
expect(result.urls).not.toContain('https://sub.example.com/page'); - Network accessline 472
expect(result.urls).not.toContain('http://example.com/insecure'); - Network accessline 477
it('discovers URLs from sitemap.xml', async () => { const sitemapXml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 478
const sitemapXml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/page1</loc></url> - Network accessline 479
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 480
<url><loc>https://example.com/page1</loc></url> - Network accessline 481
<url><loc>https://example.com/page2</loc></url> - Network accessline 482
<url><loc>https://example.com/page3</loc></url> - Network accessline 485
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1']), - Network accessline 486
'https://example.com': htmlPage(['/page1']), - Network accessline 487
'https://example.com/robots.txt': `User-agent: *\nAllow: /\nSitemap: https://example.com/sitemap.xml`, - Network accessline 488
'https://example.com/sitemap.xml': sitemapXml, - Network accessline 491
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 492
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 496
expect(result.sitemap_found).toBe(true); expect(result.urls).toContain('https://example.com/page1'); - Network accessline 497
expect(result.urls).toContain('https://example.com/page1'); - Network accessline 498
expect(result.urls).toContain('https://example.com/page2'); - Network accessline 499
expect(result.urls).toContain('https://example.com/page3'); - Network accessline 502
it('falls back to /sitemap.xml when robots.txt has no sitemap directive', async () => { const sitemapXml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 503
const sitemapXml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/from-sitemap</loc></url> - Network accessline 504
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 505
<url><loc>https://example.com/from-sitemap</loc></url> - Network accessline 508
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([]), - Network accessline 509
'https://example.com': htmlPage([]), - Network accessline 510
'https://example.com/robots.txt': 'User-agent: *\nAllow: /', - Network accessline 511
'https://example.com/sitemap.xml': sitemapXml, - Network accessline 514
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 515
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 519
expect(result.sitemap_found).toBe(true); expect(result.urls).toContain('https://example.com/from-sitemap'); - Network accessline 520
expect(result.urls).toContain('https://example.com/from-sitemap'); - Network accessline 523
it('handles missing sitemap.xml gracefully', async () => { const fetchFn: LightFetchFn = async (url) => { if (url === 'https://example.com') { - Network accessline 524
const fetchFn: LightFetchFn = async (url) => { if (url === 'https://example.com') { return { html: htmlPage(['/page1']), finalUrl: url, statusCode: 200 }; - Network accessline 525
if (url === 'https://example.com') { - Network accessline 532
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 533
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 537
expect(result.sitemap_found).toBe(false); expect(result.urls).toContain('https://example.com'); - Network accessline 538
expect(result.urls).toContain('https://example.com'); - Network accessline 539
expect(result.urls).toContain('https://example.com/page1'); - Network accessline 543
it('handles malformed sitemap XML gracefully', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1']), - Network accessline 544
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1']), 'https://example.com/robots.txt': 'User-agent: *\nAllow: /', - Network accessline 545
'https://example.com': htmlPage(['/page1']), - Network accessline 546
'https://example.com/robots.txt': 'User-agent: *\nAllow: /', - Network accessline 547
'https://example.com/sitemap.xml': '<not-valid-xml>broken garbage', - Network accessline 550
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 551
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 556
expect(result.urls).toContain('https://example.com'); - Network accessline 557
expect(result.urls).toContain('https://example.com/page1'); - Network accessline 561
it('handles sitemap index (nested sitemaps)', async () => { const sitemapIndex = `<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 562
const sitemapIndex = `<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap><loc>https://example.com/sitemap-docs.xml</loc></sitemap> - Network accessline 563
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 564
<sitemap><loc>https://example.com/sitemap-docs.xml</loc></sitemap> - Network accessline 565
<sitemap><loc>https://example.com/sitemap-blog.xml</loc></sitemap> - Network accessline 568
const sitemapDocs = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 569
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 570
<url><loc>https://example.com/docs/intro</loc></url> - Network accessline 573
const sitemapBlog = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 574
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 575
<url><loc>https://example.com/blog/post1</loc></url> - Network accessline 578
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([]), - Network accessline 579
'https://example.com': htmlPage([]), - Network accessline 580
'https://example.com/robots.txt': 'User-agent: *\nSitemap: https://example.com/sitemap.xml', - Network accessline 581
'https://example.com/sitemap.xml': sitemapIndex, - Network accessline 582
'https://example.com/sitemap-docs.xml': sitemapDocs, - Network accessline 583
'https://example.com/sitemap-blog.xml': sitemapBlog, - Network accessline 586
const result = await mapUrls( { url: 'https://example.com', max_depth: 0, max_pages: 100 }, - Network accessline 587
{ url: 'https://example.com', max_depth: 0, max_pages: 100 }, - Network accessline 591
expect(result.sitemap_found).toBe(true); expect(result.urls).toContain('https://example.com/docs/intro'); - Network accessline 592
expect(result.urls).toContain('https://example.com/docs/intro'); - Network accessline 593
expect(result.urls).toContain('https://example.com/blog/post1'); - Network accessline 596
it('respects max_pages when sitemap has many URLs', async () => { const locs = Array.from({ length: 200 }, (_, i) => `<url><loc>https://example.com/page/${i}</loc></url>`, - Network accessline 597
const locs = Array.from({ length: 200 }, (_, i) => `<url><loc>https://example.com/page/${i}</loc></url>`, ).join('\n'); - Network accessline 598
`<url><loc>https://example.com/page/${i}</loc></url>`, - Network accessline 600
const sitemapXml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${locs}</urlset>`; - Network accessline 602
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([]), - Network accessline 603
'https://example.com': htmlPage([]), - Network accessline 604
'https://example.com/robots.txt': 'Sitemap: https://example.com/sitemap.xml', - Network accessline 605
'https://example.com/sitemap.xml': sitemapXml, - Network accessline 608
const result = await mapUrls( { url: 'https://example.com', max_depth: 0, max_pages: 15 }, - Network accessline 609
{ url: 'https://example.com', max_depth: 0, max_pages: 15 }, - Network accessline 616
it('merges sitemap URLs with BFS-discovered URLs without duplicates', async () => { const sitemapXml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 617
const sitemapXml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/page1</loc></url> - Network accessline 618
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 619
<url><loc>https://example.com/page1</loc></url> - Network accessline 620
<url><loc>https://example.com/sitemap-only</loc></url> - Network accessline 623
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1', '/bfs-only']), - Network accessline 624
'https://example.com': htmlPage(['/page1', '/bfs-only']), - Network accessline 625
'https://example.com/robots.txt': 'Sitemap: https://example.com/sitemap.xml', - Network accessline 626
'https://example.com/sitemap.xml': sitemapXml, - Network accessline 629
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 630
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 634
expect(result.urls).toContain('https://example.com/page1'); - Network accessline 635
expect(result.urls).toContain('https://example.com/sitemap-only'); - Network accessline 636
expect(result.urls).toContain('https://example.com/bfs-only'); - Network accessline 638
const page1Count = result.urls.filter((u) => u === 'https://example.com/page1').length; - Network accessline 649
const result = await mapUrls( { url: 'https://example.com', max_depth: 1 }, - Network accessline 650
{ url: 'https://example.com', max_depth: 1 }, - Network accessline 654
expect(result.error).toBeDefined(); expect(result.error).toContain('Connection refused'); expect(result.urls).toEqual(['https://example.com']); - Network accessline 655
expect(result.error).toContain('Connection refused'); expect(result.urls).toEqual(['https://example.com']); expect(result.total_found).toBe(1); - Network accessline 656
expect(result.urls).toEqual(['https://example.com']); - Network accessline 660
it('skips failed child pages and continues BFS', async () => { const fetchFn: LightFetchFn = async (url) => { if (url === 'https://example.com') { - Network accessline 661
const fetchFn: LightFetchFn = async (url) => { if (url === 'https://example.com') { return { html: htmlPage(['/good', '/bad', '/also-good']), finalUrl: url, statusCode: 200 }; - Network accessline 662
if (url === 'https://example.com') { - Network accessline 663
return { html: htmlPage(['/good', '/bad', '/also-good']), finalUrl: url, statusCode: 200 }; } if (url === 'https://example.com/bad') { - Network accessline 664
} if (url === 'https://example.com/bad') { throw new Error('500 Internal Server Error'); - Network accessline 665
if (url === 'https://example.com/bad') { - Network accessline 671
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 672
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 676
expect(result.urls).toContain('https://example.com/good'); expect(result.urls).toContain('https://example.com/bad'); // URL was discovered even though fetch failed - Network accessline 677
expect(result.urls).toContain('https://example.com/bad'); // URL was discovered even though fetch failed - Network accessline 678
expect(result.urls).toContain('https://example.com/also-good'); - Network accessline 682
it('handles fetch timeout on child pages gracefully', async () => { const fetchFn: LightFetchFn = async (url) => { if (url === 'https://example.com') { - Network accessline 683
const fetchFn: LightFetchFn = async (url) => { if (url === 'https://example.com') { return { html: htmlPage(['/slow-page', '/fast-page']), finalUrl: url, statusCode: 200 }; - Network accessline 684
if (url === 'https://example.com') { - Network accessline 685
return { html: htmlPage(['/slow-page', '/fast-page']), finalUrl: url, statusCode: 200 }; } if (url === 'https://example.com/slow-page') { - Network accessline 686
} if (url === 'https://example.com/slow-page') { throw new Error('Request timed out after 10000ms'); - Network accessline 687
if (url === 'https://example.com/slow-page') { - Network accessline 693
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 694
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 699
expect(result.urls).toContain('https://example.com/fast-page'); - Network accessline 705
it('uses default max_depth=3 when not specified', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/d1']), - Network accessline 706
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/d1']), 'https://example.com/d1': htmlPage(['/d2']), - Network accessline 707
'https://example.com': htmlPage(['/d1']), - Network accessline 708
'https://example.com/d1': htmlPage(['/d2']), - Network accessline 709
'https://example.com/d2': htmlPage(['/d3']), - Network accessline 710
'https://example.com/d3': htmlPage(['/d4']), - Network accessline 711
'https://example.com/d4': htmlPage([]), - Network accessline 714
const result = await mapUrls( { url: 'https://example.com', max_pages: 100 }, - Network accessline 715
{ url: 'https://example.com', max_pages: 100 }, - Network accessline 720
expect(result.urls).toContain('https://example.com/d3'); - Network accessline 721
expect(result.urls).toContain('https://example.com/d4'); // discovered from d3's links - Network accessline 726
const fetchFn = createMockFetch({ 'https://example.com': htmlPage(['/page1']), - Network accessline 727
'https://example.com': htmlPage(['/page1']), - Network accessline 730
const result = await mapUrls( { url: 'https://example.com' }, - Network accessline 731
{ url: 'https://example.com' }, - Network accessline 741
it('handles empty HTML page', async () => { const fetchFn = createMockFetch({ 'https://example.com': '', - Network accessline 742
const fetchFn = createMockFetch({ 'https://example.com': '', }); - Network accessline 743
'https://example.com': '', - Network accessline 746
const result = await mapUrls( { url: 'https://example.com', max_depth: 1 }, - Network accessline 747
{ url: 'https://example.com', max_depth: 1 }, - Network accessline 751
expect(result.urls).toEqual(['https://example.com']); - Network accessline 755
it('handles page with only external links', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ - Network accessline 756
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ 'https://google.com', - Network accessline 757
'https://example.com': htmlPage([ - Network accessline 758
'https://google.com', - Network accessline 759
'https://github.com', - Network accessline 760
'https://twitter.com', - Network accessline 764
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 765
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 770
expect(result.urls).toEqual(['https://example.com']); - Network accessline 774
it('collapses trailing-slash duplicates into a single canonical URL', async () => { const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ - Network accessline 775
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ 'https://example.com/docs', - Network accessline 776
'https://example.com': htmlPage([ - Network accessline 777
'https://example.com/docs', - Network accessline 778
'https://example.com/docs/', - Network accessline 779
'https://example.com/api', - Network accessline 780
'https://example.com/api/', - Network accessline 781
]), 'https://example.com/docs': htmlPage([]), 'https://example.com/api': htmlPage([]), - Network accessline 782
'https://example.com/docs': htmlPage([]), - Network accessline 783
'https://example.com/api': htmlPage([]), - Network accessline 786
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 787
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 791
expect(result.urls).toContain('https://example.com/docs'); - Network accessline 792
expect(result.urls).toContain('https://example.com/api'); - Network accessline 801
const fetchFn = createMockFetch({ 'https://example.com': htmlPage([ - Network accessline 802
'https://example.com': htmlPage([ - Network accessline 803
'https://example.com/', - Network accessline 804
'https://example.com', - Network accessline 805
'https://example.com/page', - Network accessline 806
]), 'https://example.com/page': htmlPage([]), }); - Network accessline 807
'https://example.com/page': htmlPage([]), - Network accessline 810
const result = await mapUrls( { url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 811
{ url: 'https://example.com', max_depth: 1, max_pages: 100 }, - Network accessline 815
const rootMatches = result.urls.filter((u) => u === 'https://example.com' || u === 'https://example.com/'); - Network accessline 816
expect(rootMatches).toHaveLength(1); expect(result.urls).toContain('https://example.com/page'); }); - Network accessline 817
expect(result.urls).toContain('https://example.com/page');
tests/unit/crawl/rate-limiter.test.ts
- Executable scriptline 1
Executable file - Network accessline 27
const running: boolean[] = []; const tasks = Array.from({ length: 2 }, (_, i) => limiter.acquire('https://example.com/page' + i).then((release) => { - Network accessline 28
const tasks = Array.from({ length: 2 }, (_, i) => limiter.acquire('https://example.com/page' + i).then((release) => { running.push(true); - Network accessline 29
limiter.acquire('https://example.com/page' + i).then((release) => { - Network accessline 40
it('blocks beyond concurrency limit until slot freed', async () => { const release1 = await limiter.acquire('https://example.com/a'); - Network accessline 41
const release1 = await limiter.acquire('https://example.com/a'); - Network accessline 42
const release2 = await limiter.acquire('https://example.com/b'); - Network accessline 44
let thirdAcquired = false; const thirdPromise = limiter.acquire('https://example.com/c').then((r) => { - Network accessline 45
const thirdPromise = limiter.acquire('https://example.com/c').then((r) => { - Network accessline 66
const releases: (() => void)[] = []; for (let i = 0; i < 5; i++) { const release = await limiterPrivate.acquire(`http://localhost:3000/page${i}`); - Network accessline 67
for (let i = 0; i < 5; i++) { const release = await limiterPrivate.acquire(`http://localhost:3000/page${i}`); releases.push(release); - Network accessline 68
const release = await limiterPrivate.acquire(`http://localhost:3000/page${i}`); - Network accessline 80
const release1 = await limiter.acquire('https://example.com/a'); - Network accessline 83
const release2 = await limiter.acquire('https://example.com/b'); - Network accessline 101
limiter.registerDomain('https://example.com/a'); - Network accessline 106
it('applies max positive jitter when rng returns 1', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 107
limiter.registerDomain('https://example.com/a'); - Network accessline 113
it('applies max negative jitter when rng returns 0', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 114
limiter.registerDomain('https://example.com/a'); - Network accessline 120
it('stays within +/- jitterPct of base for arbitrary rng values', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 121
limiter.registerDomain('https://example.com/a'); - Network accessline 129
it('jitterPct=0 yields exact base delay (backwards compatible)', () => { const noJitter = new RateLimiter({ jitterPct: 0 }); noJitter.registerDomain('https://example.com/a'); - Network accessline 130
const noJitter = new RateLimiter({ jitterPct: 0 }); noJitter.registerDomain('https://example.com/a'); for (const r of [0, 0.3, 0.5, 0.8, 1]) { - Network accessline 131
noJitter.registerDomain('https://example.com/a'); - Network accessline 137
it('never goes below the robots crawl-delay floor', () => { limiter.setRobotsCrawlDelay('example.com', 0.1); // 100ms floor limiter.registerDomain('https://example.com/a'); - Network accessline 139
limiter.registerDomain('https://example.com/a'); - Network accessline 145
it('never returns a negative wait', () => { const bigJitter = new RateLimiter({ jitterPct: 1 }); bigJitter.registerDomain('https://example.com/a'); - Network accessline 147
bigJitter.registerDomain('https://example.com/a'); - Network accessline 162
it('a 429 raises the next wait by the cooldown factor', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 163
limiter.registerDomain('https://example.com/a'); - Network accessline 169
it('a 403 raises the next wait by the cooldown factor', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 170
limiter.registerDomain('https://example.com/a'); - Network accessline 175
it('repeated 429s compound but clamp at the cooldown max', () => { const clamped = new RateLimiter({ jitterPct: 0, cooldownMaxMs: 350 }); clamped.registerDomain('https://example.com/a'); - Network accessline 176
const clamped = new RateLimiter({ jitterPct: 0, cooldownMaxMs: 350 }); clamped.registerDomain('https://example.com/a'); clamped.recordResponse('example.com', 429); // 200 - Network accessline 177
clamped.registerDomain('https://example.com/a'); - Network accessline 184
it('consecutive successes decay the cooldown back toward base', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 185
limiter.registerDomain('https://example.com/a'); - Network accessline 195
it('cooldown is per-domain: domain A 429 does not slow domain B', () => { limiter.registerDomain('https://a.example.com/x'); - Network accessline 196
limiter.registerDomain('https://a.example.com/x'); - Network accessline 197
limiter.registerDomain('https://b.example.com/y'); - Network accessline 203
it('2xx on a fresh domain keeps it at base', () => { limiter.registerDomain('https://example.com/a'); - Network accessline 204
limiter.registerDomain('https://example.com/a'); - Network accessline 219
it('does not grow the multiplier without bound on repeated blocks', () => { const rl = new RateLimiter({ cooldownFactor: 2, cooldownMaxMs: 30_000, jitterPct: 0, rng: () => 0.5 }); rl.registerDomain('http://zero.example/a'); - Network accessline 221
rl.registerDomain('http://zero.example/a'); - Network accessline 235
it('still caps a NON-zero base delay at cooldownMaxMs', () => { const rl = new RateLimiter({ cooldownFactor: 2, cooldownMaxMs: 4_000, jitterPct: 0, rng: () => 0.5 }); rl.registerDomain('http://slow.example/a'); - Network accessline 236
const rl = new RateLimiter({ cooldownFactor: 2, cooldownMaxMs: 4_000, jitterPct: 0, rng: () => 0.5 }); rl.registerDomain('http://slow.example/a'); (rl as unknown as { domains: Map<string, { delayMs: number }> }).domains.get('slow.ex - Network accessline 237
rl.registerDomain('http://slow.example/a');
tests/unit/crawl/robots.test.ts
- Executable scriptline 1
Executable file
tests/unit/crawl/sitemap-first.test.ts
- Executable scriptline 1
Executable file - Network accessline 29
function makeSitemapXml(count: number, prefix = 'https://example.com/p'): string { - Network accessline 30
const urls = Array.from({ length: count }, (_, i) => `<url><loc>${prefix}${i}</loc></url>`).join('\n'); return `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls}</urlset>`; } - Network accessline 31
return `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls}</urlset>`; - Network accessline 35
it('uses robots.txt Sitemap directive when present', async () => { const sitemap = makeSitemapXml(8); const robotsTxt = `User-agent: *\nSitemap: https://example.com/custom-sitemap.xml\n`; - Network accessline 37
const robotsTxt = `User-agent: *\nSitemap: https://example.com/custom-sitemap.xml\n`; - Network accessline 45
const result = await probeSitemap('https://example.com', rawFetch); - Network accessline 46
expect(result).not.toBeNull(); expect(result!.length).toBe(8); expect(result![0]).toBe('https://example.com/p0'); - Network accessline 47
expect(result!.length).toBe(8); expect(result![0]).toBe('https://example.com/p0'); }); - Network accessline 48
expect(result![0]).toBe('https://example.com/p0'); - Network accessline 60
const result = await probeSitemap('https://example.com', rawFetch); - Network accessline 65
it('walks sitemap index and aggregates children', async () => { const indexXml = `<?xml version="1.0"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 66
const indexXml = `<?xml version="1.0"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 67
<sitemap><loc>https://example.com/sitemap-a.xml</loc></sitemap> - Network accessline 68
<sitemap><loc>https://example.com/sitemap-b.xml</loc></sitemap> - Network accessline 72
if (url.endsWith('/robots.txt')) return raw404(); if (url.endsWith('/sitemap.xml')) return rawOk(indexXml); if (url.endsWith('/sitemap-a.xml')) return rawOk(makeSitemapXml(3, 'https://example.com/a')); - Network accessline 73
if (url.endsWith('/sitemap.xml')) return rawOk(indexXml); if (url.endsWith('/sitemap-a.xml')) return rawOk(makeSitemapXml(3, 'https://example.com/a')); if (url.endsWith('/sitemap-b.xml')) return rawOk(makeSitemapXml(4, 'https:// - Network accessline 74
if (url.endsWith('/sitemap-a.xml')) return rawOk(makeSitemapXml(3, 'https://example.com/a')); - Network accessline 75
if (url.endsWith('/sitemap-b.xml')) return rawOk(makeSitemapXml(4, 'https://example.com/b')); - Network accessline 79
const result = await probeSitemap('https://example.com', rawFetch); - Network accessline 84
it('caps recursion at MAX_INDEX_CHILDREN children', async () => { const children = Array.from({ length: 10 }, (_, i) => `<sitemap><loc>https://example.com/sm-${i}.xml</loc></sitemap>`).join(''); - Network accessline 85
const children = Array.from({ length: 10 }, (_, i) => `<sitemap><loc>https://example.com/sm-${i}.xml</loc></sitemap>`).join(''); - Network accessline 99
await probeSitemap('https://example.com', rawFetch); - Network accessline 103
it('returns null when all probe paths 404', async () => { const rawFetch: RawFetchFn = vi.fn(async () => raw404()); const result = await probeSitemap('https://example.com', rawFetch); - Network accessline 104
const rawFetch: RawFetchFn = vi.fn(async () => raw404()); const result = await probeSitemap('https://example.com', rawFetch); expect(result).toBeNull(); - Network accessline 105
const result = await probeSitemap('https://example.com', rawFetch); - Network accessline 117
const result = await probeSitemap('https://example.com', rawFetch); - Network accessline 128
await probeSitemap('https://example.com', rawFetch); - Network accessline 140
const result = await probeSitemap('https://example.com', rawFetch);
tests/unit/crawl/sitemap.test.ts
- Executable scriptline 1
Executable file - Network accessline 11
it('extracts URLs from a standard sitemap.xml', () => { const xml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 12
const xml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>https://example.com/</loc></url> - Network accessline 13
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 14
<url><loc>https://example.com/</loc></url> - Network accessline 15
<url><loc>https://example.com/docs</loc></url> - Network accessline 16
<url><loc>https://example.com/api</loc></url> - Network accessline 19
const urls = parseSitemap(xml); expect(urls).toEqual([ 'https://example.com/', - Network accessline 20
expect(urls).toEqual([ 'https://example.com/', 'https://example.com/docs', - Network accessline 21
'https://example.com/', - Network accessline 22
'https://example.com/docs', - Network accessline 23
'https://example.com/api', - Network accessline 31
it('returns empty array for empty urlset', () => { const xml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>`; - Network accessline 32
const xml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>`; - Network accessline 36
it('handles missing loc elements gracefully', () => { const xml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 37
const xml = `<?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><lastmod>2024-01-01</lastmod></url> - Network accessline 38
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 39
<url><lastmod>2024-01-01</lastmod></url> <url><loc>https://example.com/valid</loc></url> </urlset>`; - Network accessline 40
<url><loc>https://example.com/valid</loc></url> - Network accessline 41
</urlset>`; expect(parseSitemap(xml)).toEqual(['https://example.com/valid']); }); - Network accessline 42
expect(parseSitemap(xml)).toEqual(['https://example.com/valid']); - Network accessline 47
it('extracts sitemap URLs from a sitemapindex', () => { const xml = `<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 48
const xml = `<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap><loc>https://example.com/sitemap-pages.xml</loc></sitemap> - Network accessline 49
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 50
<sitemap><loc>https://example.com/sitemap-pages.xml</loc></sitemap> - Network accessline 51
<sitemap><loc>https://example.com/sitemap-posts.xml</loc></sitemap> - Network accessline 54
const urls = parseSitemapIndex(xml); expect(urls).toEqual([ 'https://example.com/sitemap-pages.xml', - Network accessline 55
expect(urls).toEqual([ 'https://example.com/sitemap-pages.xml', 'https://example.com/sitemap-posts.xml', - Network accessline 56
'https://example.com/sitemap-pages.xml', - Network accessline 57
'https://example.com/sitemap-posts.xml', - Network accessline 61
it('returns empty array for non-index sitemap', () => { const xml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 62
const xml = `<?xml version="1.0"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 63
<url><loc>https://example.com/</loc></url> - Network accessline 70
it('returns url with optional lastmod and priority per entry', () => { const xml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 71
const xml = `<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> - Network accessline 72
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> - Network accessline 73
<url> <loc>https://example.com/a</loc> <lastmod>2026-01-15</lastmod> - Network accessline 74
<loc>https://example.com/a</loc> - Network accessline 77
</url> <url> <loc>https://example.com/b</loc> - Network accessline 78
<url> <loc>https://example.com/b</loc> <lastmod>2026-05-20</lastmod> - Network accessline 79
<loc>https://example.com/b</loc> - Network accessline 81
</url> <url> <loc>https://example.com/c</loc> - Network accessline 82
<url> <loc>https://example.com/c</loc> <priority>0.5</priority> - Network accessline 83
<loc>https://example.com/c</loc> - Network accessline 85
</url> <url> <loc>https://example.com/d</loc> - Network accessline 86
<url> <loc>https://example.com/d</loc> </url> - Network accessline 87
<loc>https://example.com/d</loc> - Network accessline 91
expect(parseSitemapEntries(xml)).toEqual([ { url: 'https://example.com/a', lastmod: '2026-01-15', priority: 0.8 }, - Network accessline 92
{ url: 'https://example.com/a', lastmod: '2026-01-15', priority: 0.8 }, - Network accessline 93
{ url: 'https://example.com/b', lastmod: '2026-05-20' }, - Network accessline 94
{ url: 'https://example.com/c', priority: 0.5 }, - Network accessline 95
{ url: 'https://example.com/d' }, - Network accessline 106
const entries = [ { url: 'https://example.com/antitrust', lastmod: '2024-01-10' }, - Network accessline 107
{ url: 'https://example.com/antitrust', lastmod: '2024-01-10' }, - Network accessline 108
{ url: 'https://example.com/charter', lastmod: '2024-02-15' }, - Network accessline 109
{ url: 'https://example.com/clients', lastmod: '2024-03-01' }, - Network accessline 110
{ url: 'https://example.com/news-2026-q2', lastmod: '2026-05-20' }, - Network accessline 111
{ url: 'https://example.com/news-2026-q1', lastmod: '2026-03-15' }, - Network accessline 114
const sorted = sortSitemapEntries(entries); expect(sorted.map(e => e.url)).toEqual([ 'https://example.com/news-2026-q2', - Network accessline 115
expect(sorted.map(e => e.url)).toEqual([ 'https://example.com/news-2026-q2', 'https://example.com/news-2026-q1', - Network accessline 116
'https://example.com/news-2026-q2', - Network accessline 117
'https://example.com/news-2026-q1', - Network accessline 118
'https://example.com/clients', - Network accessline 119
'https://example.com/charter', - Network accessline 120
'https://example.com/antitrust', - Network accessline 124
it('falls back to priority descending when lastmod missing', () => { const entries = [ { url: 'https://example.com/low', priority: 0.2 }, - Network accessline 125
const entries = [ { url: 'https://example.com/low', priority: 0.2 }, { url: 'https://example.com/high', priority: 0.9 }, - Network accessline 126
{ url: 'https://example.com/low', priority: 0.2 }, - Network accessline 127
{ url: 'https://example.com/high', priority: 0.9 }, - Network accessline 128
{ url: 'https://example.com/mid', priority: 0.5 }, - Network accessline 131
const sorted = sortSitemapEntries(entries); expect(sorted.map(e => e.url)).toEqual([ 'https://example.com/high', - Network accessline 132
expect(sorted.map(e => e.url)).toEqual([ 'https://example.com/high', 'https://example.com/mid', - Network accessline 133
'https://example.com/high', - Network accessline 134
'https://example.com/mid', - Network accessline 135
'https://example.com/low', - Network accessline 139
it('puts entries with lastmod ahead of entries without lastmod', () => { const entries = [ { url: 'https://example.com/old-doc-no-meta' }, - Network accessline 140
const entries = [ { url: 'https://example.com/old-doc-no-meta' }, { url: 'https://example.com/recent', lastmod: '2026-05-20' }, - Network accessline 141
{ url: 'https://example.com/old-doc-no-meta' }, - Network accessline 142
{ url: 'https://example.com/recent', lastmod: '2026-05-20' }, - Network accessline 143
{ url: 'https://example.com/another-bare' }, - Network accessline 146
const sorted = sortSitemapEntries(entries); expect(sorted[0].url).toBe('https://example.com/recent'); - Network accessline 147
expect(sorted[0].url).toBe('https://example.com/recent'); - Network accessline 150
it('preserves input order for entries with no lastmod or priority (stable sort)', () => { const entries = [ { url: 'https://example.com/a' }, - Network accessline 151
const entries = [ { url: 'https://example.com/a' }, { url: 'https://example.com/b' }, - Network accessline 152
{ url: 'https://example.com/a' }, - Network accessline 153
{ url: 'https://example.com/b' }, - Network accessline 154
{ url: 'https://example.com/c' }, - Network accessline 157
expect(sortSitemapEntries(entries).map(e => e.url)).toEqual([ 'https://example.com/a', - Network accessline 158
'https://example.com/a', - Network accessline 159
'https://example.com/b', - Network accessline 160
'https://example.com/c', - Network accessline 167
const robots = `User-agent: * Disallow: /private/ Sitemap: https://example.com/sitemap.xml - Network accessline 168
Disallow: /private/ Sitemap: https://example.com/sitemap.xml Sitemap: https://example.com/sitemap-news.xml`; - Network accessline 169
Sitemap: https://example.com/sitemap.xml - Network accessline 170
Sitemap: https://example.com/sitemap-news.xml`; - Network accessline 172
const urls = extractSitemapUrlFromRobots(robots); expect(urls).toEqual([ 'https://example.com/sitemap.xml', - Network accessline 173
expect(urls).toEqual([ 'https://example.com/sitemap.xml', 'https://example.com/sitemap-news.xml', - Network accessline 174
'https://example.com/sitemap.xml', - Network accessline 175
'https://example.com/sitemap-news.xml', - Network accessline 184
it('handles case-insensitive Sitemap directive', () => { const robots = `sitemap: https://example.com/sitemap.xml`; - Network accessline 185
const robots = `sitemap: https://example.com/sitemap.xml`; - Network accessline 186
expect(extractSitemapUrlFromRobots(robots)).toEqual(['https://example.com/sitemap.xml']);
tests/unit/crawl/url-utils.test.ts
- Executable scriptline 1
Executable file - Network accessline 4
describe('canonicalForCrawl', () => { it('strips fragment', () => { expect(canonicalForCrawl('https://hono.dev/docs#VPContent')).toBe('https://hono.dev/docs'); - Network accessline 5
it('strips fragment', () => { expect(canonicalForCrawl('https://hono.dev/docs#VPContent')).toBe('https://hono.dev/docs'); }); - Network accessline 6
expect(canonicalForCrawl('https://hono.dev/docs#VPContent')).toBe('https://hono.dev/docs'); - Network accessline 7
}); it('strips trailing slash', () => { expect(canonicalForCrawl('https://hono.dev/docs/')).toBe('https://hono.dev/docs'); - Network accessline 8
it('strips trailing slash', () => { expect(canonicalForCrawl('https://hono.dev/docs/')).toBe('https://hono.dev/docs'); }); - Network accessline 9
expect(canonicalForCrawl('https://hono.dev/docs/')).toBe('https://hono.dev/docs'); - Network accessline 10
}); it('keeps root slash', () => { expect(canonicalForCrawl('https://hono.dev/')).toBe('https://hono.dev/'); - Network accessline 11
it('keeps root slash', () => { expect(canonicalForCrawl('https://hono.dev/')).toBe('https://hono.dev/'); }); - Network accessline 12
expect(canonicalForCrawl('https://hono.dev/')).toBe('https://hono.dev/'); - Network accessline 19
describe('stripFragment', () => { it('removes the hash fragment', () => { expect(stripFragment('https://x.com/intro#section-a')).toBe('https://x.com/intro'); - Network accessline 20
it('removes the hash fragment', () => { expect(stripFragment('https://x.com/intro#section-a')).toBe('https://x.com/intro'); }); - Network accessline 21
expect(stripFragment('https://x.com/intro#section-a')).toBe('https://x.com/intro'); - Network accessline 22
}); it('removes an empty hash', () => { expect(stripFragment('https://x.com/intro#')).toBe('https://x.com/intro'); - Network accessline 23
it('removes an empty hash', () => { expect(stripFragment('https://x.com/intro#')).toBe('https://x.com/intro'); }); - Network accessline 24
expect(stripFragment('https://x.com/intro#')).toBe('https://x.com/intro'); - Network accessline 25
}); it('leaves URLs without a fragment unchanged', () => { expect(stripFragment('https://x.com/intro')).toBe('https://x.com/intro'); - Network accessline 26
it('leaves URLs without a fragment unchanged', () => { expect(stripFragment('https://x.com/intro')).toBe('https://x.com/intro'); }); - Network accessline 27
expect(stripFragment('https://x.com/intro')).toBe('https://x.com/intro'); - Network accessline 28
}); it('preserves query parameters', () => { expect(stripFragment('https://x.com/intro?q=1#a')).toBe('https://x.com/intro?q=1'); - Network accessline 29
it('preserves query parameters', () => { expect(stripFragment('https://x.com/intro?q=1#a')).toBe('https://x.com/intro?q=1'); }); - Network accessline 30
expect(stripFragment('https://x.com/intro?q=1#a')).toBe('https://x.com/intro?q=1'); - Network accessline 42
it('drops anchor fragments', () => { expect(canonicalForOutput('https://x.com/intro#welcome')).toBe('https://x.com/intro'); - Network accessline 43
expect(canonicalForOutput('https://x.com/intro#welcome')).toBe('https://x.com/intro'); - Network accessline 44
}); it('drops fragment together with trailing slash', () => { expect(canonicalForOutput('https://x.com/intro/#section')).toBe('https://x.com/intro'); - Network accessline 45
it('drops fragment together with trailing slash', () => { expect(canonicalForOutput('https://x.com/intro/#section')).toBe('https://x.com/intro'); }); - Network accessline 46
expect(canonicalForOutput('https://x.com/intro/#section')).toBe('https://x.com/intro'); - Network accessline 50
describe('isPrivateUrl', () => { it('detects localhost', () => { expect(isPrivateUrl('http://localhost:3000/docs')).toBe(true); - Network accessline 51
it('detects localhost', () => { expect(isPrivateUrl('http://localhost:3000/docs')).toBe(true); expect(isPrivateUrl('http://localhost/page')).toBe(true); - Network accessline 52
expect(isPrivateUrl('http://localhost:3000/docs')).toBe(true); - Network accessline 53
expect(isPrivateUrl('http://localhost/page')).toBe(true); - Network accessline 56
it('detects 127.0.0.1', () => { expect(isPrivateUrl('http://127.0.0.1:8080/api')).toBe(true); - Network accessline 57
expect(isPrivateUrl('http://127.0.0.1:8080/api')).toBe(true); - Network accessline 60
it('detects ::1 (IPv6 loopback)', () => { expect(isPrivateUrl('http://[::1]:3000/docs')).toBe(true); - Network accessline 61
expect(isPrivateUrl('http://[::1]:3000/docs')).toBe(true); - Network accessline 64
it('detects 192.168.x.x', () => { expect(isPrivateUrl('http://192.168.1.100:8080')).toBe(true); - Network accessline 65
expect(isPrivateUrl('http://192.168.1.100:8080')).toBe(true); - Network accessline 66
expect(isPrivateUrl('http://192.168.0.1/page')).toBe(true); - Network accessline 69
it('detects 10.x.x.x', () => { expect(isPrivateUrl('http://10.0.0.5:3000/docs')).toBe(true); - Network accessline 70
expect(isPrivateUrl('http://10.0.0.5:3000/docs')).toBe(true); - Network accessline 73
it('detects 172.16.0.0/12 range', () => { expect(isPrivateUrl('http://172.16.0.1/page')).toBe(true); - Network accessline 74
expect(isPrivateUrl('http://172.16.0.1/page')).toBe(true); - Network accessline 75
expect(isPrivateUrl('http://172.31.255.255/page')).toBe(true); - Network accessline 76
expect(isPrivateUrl('http://172.32.0.1/page')).toBe(false); - Network accessline 79
it('detects 0.0.0.0', () => { expect(isPrivateUrl('http://0.0.0.0:8080/docs')).toBe(true); - Network accessline 80
expect(isPrivateUrl('http://0.0.0.0:8080/docs')).toBe(true); - Network accessline 83
it('detects .local domains', () => { expect(isPrivateUrl('http://myserver.local:8080/docs')).toBe(true); - Network accessline 84
expect(isPrivateUrl('http://myserver.local:8080/docs')).toBe(true); - Network accessline 87
it('returns false for public URLs', () => { expect(isPrivateUrl('https://docs.example.com')).toBe(false); - Network accessline 88
expect(isPrivateUrl('https://docs.example.com')).toBe(false); - Network accessline 89
expect(isPrivateUrl('https://github.com/repo')).toBe(false); - Network accessline 93
describe('matchesPatterns', () => { it('returns true when no patterns are specified', () => { expect(matchesPatterns('https://example.com/docs/intro', undefined, undefined)).toBe(true); - Network accessline 94
it('returns true when no patterns are specified', () => { expect(matchesPatterns('https://example.com/docs/intro', undefined, undefined)).toBe(true); }); - Network accessline 95
expect(matchesPatterns('https://example.com/docs/intro', undefined, undefined)).toBe(true); - Network accessline 98
it('matches include_patterns (regex)', () => { expect(matchesPatterns('https://example.com/docs/intro', ['/docs/'], undefined)).toBe(true); - Network accessline 99
expect(matchesPatterns('https://example.com/docs/intro', ['/docs/'], undefined)).toBe(true); - Network accessline 100
expect(matchesPatterns('https://example.com/blog/post', ['/docs/'], undefined)).toBe(false); - Network accessline 103
it('rejects exclude_patterns (regex)', () => { expect(matchesPatterns('https://example.com/docs/intro', undefined, ['/blog/'])).toBe(true); - Network accessline 104
expect(matchesPatterns('https://example.com/docs/intro', undefined, ['/blog/'])).toBe(true); - Network accessline 105
expect(matchesPatterns('https://example.com/blog/post', undefined, ['/blog/'])).toBe(false); - Network accessline 108
it('applies both include and exclude (include first, then exclude)', () => { expect(matchesPatterns('https://example.com/docs/changelog', ['/docs/'], ['/changelog'])).toBe(false); - Network accessline 109
expect(matchesPatterns('https://example.com/docs/changelog', ['/docs/'], ['/changelog'])).toBe(false); - Network accessline 110
expect(matchesPatterns('https://example.com/docs/intro', ['/docs/'], ['/changelog'])).toBe(true); - Network accessline 113
it('handles regex special characters in patterns', () => { expect(matchesPatterns('https://example.com/v2.0/docs', ['v2\\.0'], undefined)).toBe(true); - Network accessline 114
expect(matchesPatterns('https://example.com/v2.0/docs', ['v2\\.0'], undefined)).toBe(true); - Network accessline 115
expect(matchesPatterns('https://example.com/v2X0/docs', ['v2\\.0'], undefined)).toBe(false);
tests/unit/daemon/admin-reset-integration.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
const addr = server.address(); const port = typeof addr === 'object' && addr ? addr.port : 0; resolve({ server, url: `http://127.0.0.1:${port}/` }); - Network accessline 34
const port = typeof addr === 'object' && addr ? addr.port : 0; resolve({ server, url: `http://127.0.0.1:${port}/` }); }); - Network accessline 35
resolve({ server, url: `http://127.0.0.1:${port}/` }); - Network accessline 44
name, async search() { const resp = await fetch(url); - Network accessline 45
async search() { const resp = await fetch(url); if (!resp.ok) throw new Error(`engine ${name} upstream returned ${resp.status} Forbidden`); - Network accessline 46
const resp = await fetch(url); - Network accessline 110
[Credential-related source omitted] - Network accessline 111
[Credential-related source omitted] - Network accessline 112
const resp = await fetch(`${daemonUrl}/admin/reset-breakers`, {
tests/unit/daemon/admin-token.test.ts
- Executable scriptline 1
Executable file
tests/unit/daemon/firecrawl-compat.test.ts
- Executable scriptline 1
Executable file - Network accessline 86
ok: true, data: { url: 'https://example.com/', - Network accessline 87
data: { url: 'https://example.com/', title: 'Example', - Network accessline 88
url: 'https://example.com/', - Network accessline 100
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/scrape'); await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/', formats: ['markdown'] }), FAKE_RES, ctx); - Network accessline 102
await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/', formats: ['markdown'] }), FAKE_RES, ctx); - Network accessline 107
expect(body.success).toBe(true); expect(body.data.markdown).toBe('# Hello'); expect(body.data.metadata.sourceURL).toBe('https://example.com/'); - Network accessline 108
expect(body.data.markdown).toBe('# Hello'); expect(body.data.metadata.sourceURL).toBe('https://example.com/'); expect(body.data.metadata.title).toBe('Example'); - Network accessline 109
expect(body.data.metadata.sourceURL).toBe('https://example.com/'); - Network accessline 116
ok: true, data: { url: 'https://example.com/', - Network accessline 117
data: { url: 'https://example.com/', title: 'Example', - Network accessline 118
url: 'https://example.com/', - Network accessline 129
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/scrape'); await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/' }), FAKE_RES, ctx); - Network accessline 130
const { ctx, captured } = makeCtx('/v1/scrape'); await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/' }), FAKE_RES, ctx); const serialized = JSON.stringify(captured[0].body); - Network accessline 131
await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/' }), FAKE_RES, ctx); - Network accessline 155
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/scrape'); await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/' }), FAKE_RES, ctx); - Network accessline 156
const { ctx, captured } = makeCtx('/v1/scrape'); await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/' }), FAKE_RES, ctx); expect(captured[0].status).toBe(502); // fetch-stage upstream → 502 - Network accessline 157
await handleCompatRequest(fakeReq('POST', { url: 'https://example.com/' }), FAKE_RES, ctx); expect(captured[0].status).toBe(502); // fetch-stage upstream → 502 expect((captured[0].body as { success: boolean }).success).toBe(false); - Network accessline 167
data: { results: [ { url: 'https://a.com', title: 'A', snippet: 'about A' }, - Network accessline 168
results: [ { url: 'https://a.com', title: 'A', snippet: 'about A' }, { url: 'https://b.com', title: 'B', snippet: 'about B' }, - Network accessline 169
{ url: 'https://a.com', title: 'A', snippet: 'about A' }, - Network accessline 170
{ url: 'https://b.com', title: 'B', snippet: 'about B' }, - Network accessline 184
expect(body.success).toBe(true); expect(body.data.web).toEqual([ { url: 'https://a.com', title: 'A', description: 'about A' }, - Network accessline 185
expect(body.data.web).toEqual([ { url: 'https://a.com', title: 'A', description: 'about A' }, { url: 'https://b.com', title: 'B', description: 'about B' }, - Network accessline 186
{ url: 'https://a.com', title: 'A', description: 'about A' }, - Network accessline 187
{ url: 'https://b.com', title: 'B', description: 'about B' }, - Network accessline 195
it('limit caps result count (default 5)', async () => { const results = Array.from({ length: 12 }, (_, i) => ({ url: `https://x${i}.com`, title: `T${i}`, snippet: 's' })); - Network accessline 196
const results = Array.from({ length: 12 }, (_, i) => ({ url: `https://x${i}.com`, title: `T${i}`, snippet: 's' })); - Network accessline 231
it('maps crawl(map) output → {success:true, data:{links:[…]}}', async () => { mockHandleCrawl.mockResolvedValue({ urls: ['https://a.com/1', 'https://a.com/2'], - Network accessline 232
mockHandleCrawl.mockResolvedValue({ urls: ['https://a.com/1', 'https://a.com/2'], total_found: 2, - Network accessline 233
urls: ['https://a.com/1', 'https://a.com/2'], - Network accessline 238
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/map'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 239
const { ctx, captured } = makeCtx('/v1/map'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); expect(captured[0].status).toBe(200); - Network accessline 240
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 242
const body = captured[0].body as { success: boolean; data: { links: string[] } }; expect(body.success).toBe(true); expect(body.data.links).toEqual(['https://a.com/1', 'https://a.com/2']); - Network accessline 244
expect(body.data.links).toEqual(['https://a.com/1', 'https://a.com/2']); - Network accessline 250
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/map'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 5000 }), FAKE_RES, ctx); - Network accessline 251
const { ctx, captured } = makeCtx('/v1/map'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 5000 }), FAKE_RES, ctx); expect(captured[0].status).toBe(400); - Network accessline 252
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 5000 }), FAKE_RES, ctx); - Network accessline 266
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/map'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 267
const { ctx, captured } = makeCtx('/v1/map'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); expect(captured[0].status).toBe(400); - Network accessline 268
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 278
const { handleCompatRequest } = await importShim(); const start = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 2 }), FAKE_RES, start.ctx); - Network accessline 279
const start = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 2 }), FAKE_RES, start.ctx); expect(start.captured[0].status).toBe(200); - Network accessline 280
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 2 }), FAKE_RES, start.ctx); - Network accessline 293
resolveCrawl({ pages: [{ url: 'https://a.com/1', title: 'p1', markdown: 'body1', depth: 0 }], - Network accessline 294
pages: [{ url: 'https://a.com/1', title: 'p1', markdown: 'body1', depth: 0 }], - Network accessline 302
const done = poll2.captured[0].body as { status: string; data: Array<{ markdown: string; metadata: { sourceURL: string } }> }; expect(done.status).toBe('completed'); expect(done.data).toEqual([{ markdown: 'body1', metadata: { source - Network accessline 303
expect(done.status).toBe('completed'); expect(done.data).toEqual([{ markdown: 'body1', metadata: { sourceURL: 'https://a.com/1' } }]); }); - Network accessline 304
expect(done.data).toEqual([{ markdown: 'body1', metadata: { sourceURL: 'https://a.com/1' } }]); - Network accessline 309
const { handleCompatRequest } = await importShim(); const start = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, start.ctx); - Network accessline 310
const start = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, start.ctx); const id = (start.captured[0].body as { id: string }).id; - Network accessline 311
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, start.ctx); - Network accessline 329
const { handleCompatRequest } = await importShim(); const start = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 9999 }), FAKE_RES, start.ctx); - Network accessline 330
const start = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 9999 }), FAKE_RES, start.ctx); expect(start.captured[0].status).toBe(400); - Network accessline 331
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com', limit: 9999 }), FAKE_RES, start.ctx); - Network accessline 347
async function postCrawl(handleCompatRequest: typeof import('../../../src/daemon/rest/firecrawl-compat.js').handleCompatRequest): Promise<Captured> { const { ctx, captured } = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq( - Network accessline 348
const { ctx, captured } = makeCtx('/v1/crawl'); await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); return captured[0]; - Network accessline 349
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 414
respond: (_status: number, _body: unknown, headers?: Record<string, string>) => headersCaptured.push(headers), }; await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 415
}; await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); expect(headersCaptured[0]).toEqual({ 'Retry-After': '5' }); - Network accessline 416
await handleCompatRequest(fakeReq('POST', { url: 'https://a.com' }), FAKE_RES, ctx); - Network accessline 444
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/scrape', /* bindIsLoopback */ false); await handleCompatRequest(fakeReq('POST', { url: 'http://127.0.0.1:8080/' }), FAKE_RES, ctx); - Network accessline 445
const { ctx, captured } = makeCtx('/v1/scrape', /* bindIsLoopback */ false); await handleCompatRequest(fakeReq('POST', { url: 'http://127.0.0.1:8080/' }), FAKE_RES, ctx); expect(captured[0].status).toBe(400); - Network accessline 446
await handleCompatRequest(fakeReq('POST', { url: 'http://127.0.0.1:8080/' }), FAKE_RES, ctx); - Network accessline 453
const { handleCompatRequest } = await importShim(); const { ctx, captured } = makeCtx('/v1/scrape', /* bindIsLoopback */ true); await handleCompatRequest(fakeReq('POST', { url: 'http://169.254.169.254/latest/meta-data/' }), FAKE_RES - Network accessline 454
const { ctx, captured } = makeCtx('/v1/scrape', /* bindIsLoopback */ true); await handleCompatRequest(fakeReq('POST', { url: 'http://169.254.169.254/latest/meta-data/' }), FAKE_RES, ctx); expect(captured[0].status).toBe(400); - Network accessline 455
await handleCompatRequest(fakeReq('POST', { url: 'http://169.254.169.254/latest/meta-data/' }), FAKE_RES, ctx); - Network accessline 501
store.settle(oldest, { status: 'completed', data: [{ markdown: big, metadata: { sourceURL: 'https://a.com' } }], - Network accessline 502
status: 'completed', data: [{ markdown: big, metadata: { sourceURL: 'https://a.com' } }], }); - Network accessline 503
data: [{ markdown: big, metadata: { sourceURL: 'https://a.com' } }], - Network accessline 508
store.settle(newer, { status: 'completed', data: [{ markdown: big, metadata: { sourceURL: 'https://b.com' } }], - Network accessline 509
status: 'completed', data: [{ markdown: big, metadata: { sourceURL: 'https://b.com' } }], }); - Network accessline 510
data: [{ markdown: big, metadata: { sourceURL: 'https://b.com' } }],
tests/unit/daemon/health-check.test.ts
- Executable scriptline 1
Executable file
tests/unit/daemon/http-server.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 64
[Credential-related source omitted] - Network accessline 134
try { const url = await daemon.start(); const resp = await fetch(`${url}/health`); - Network accessline 135
const url = await daemon.start(); const resp = await fetch(`${url}/health`); expect(resp.status).toBe(200); - Network accessline 136
const resp = await fetch(`${url}/health`); - Network accessline 149
try { const url = await daemon.start(); const resp = await fetch(`${url}/health`); - Network accessline 150
const url = await daemon.start(); const resp = await fetch(`${url}/health`); expect(resp.headers.get('content-type')).toContain('application/json'); - Network accessline 151
const resp = await fetch(`${url}/health`); - Network accessline 161
try { const url = await daemon.start(); const resp = await fetch(`${url}/nonexistent`); - Network accessline 162
const url = await daemon.start(); const resp = await fetch(`${url}/nonexistent`); expect(resp.status).toBe(404); - Network accessline 163
const resp = await fetch(`${url}/nonexistent`); - Network accessline 177
try { await fetch(`${url}/health`, { signal: AbortSignal.timeout(1000) }); - Network accessline 178
await fetch(`${url}/health`, { signal: AbortSignal.timeout(1000) }); - Network accessline 197
try { const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { - Network accessline 198
const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { method: 'POST', - Network accessline 199
const resp = await fetch(`${url}/mcp`, { - Network accessline 239
try { const url = await daemon.start(); const resp = await fetch(`${url}/health`); - Network accessline 240
const url = await daemon.start(); const resp = await fetch(`${url}/health`); const body = await resp.json(); - Network accessline 241
const resp = await fetch(`${url}/health`); - Network accessline 252
try { const url = await daemon.start(); const resp = await fetch(`${url}/health`); - Network accessline 253
const url = await daemon.start(); const resp = await fetch(`${url}/health`); const body = await resp.json(); - Network accessline 254
const resp = await fetch(`${url}/health`); - Network accessline 265
try { const url = await daemon.start(); const resp = await fetch(`${url}/health`); - Network accessline 266
const url = await daemon.start(); const resp = await fetch(`${url}/health`); const body = await resp.json(); - Network accessline 267
const resp = await fetch(`${url}/health`); - Network accessline 278
try { const url = await daemon.start(); const resp = await fetch(`${url}/health`); - Network accessline 279
const url = await daemon.start(); const resp = await fetch(`${url}/health`); const body = await resp.json(); - Network accessline 280
const resp = await fetch(`${url}/health`); - Network accessline 294
const url = await daemon.start(); const results = await Promise.all( Array.from({ length: 5 }, () => fetch(`${url}/health`).then(r => r.json())), - Network accessline 295
const results = await Promise.all( Array.from({ length: 5 }, () => fetch(`${url}/health`).then(r => r.json())), ); - Network accessline 296
Array.from({ length: 5 }, () => fetch(`${url}/health`).then(r => r.json())), - Network accessline 363
try { const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { - Network accessline 364
const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { method: 'POST', - Network accessline 365
const resp = await fetch(`${url}/mcp`, { - Network accessline 389
try { const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { - Network accessline 390
const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { method: 'POST', - Network accessline 391
const resp = await fetch(`${url}/mcp`, { - Network accessline 405
try { const url = await daemon.start(); const resp = await fetch(`${url}/messages`, { - Network accessline 406
const url = await daemon.start(); const resp = await fetch(`${url}/messages`, { method: 'POST', - Network accessline 407
const resp = await fetch(`${url}/messages`, { - Network accessline 421
try { const url = await daemon.start(); const resp = await fetch(`${url}/messages?sessionId=nonexistent`, { - Network accessline 422
const url = await daemon.start(); const resp = await fetch(`${url}/messages?sessionId=nonexistent`, { method: 'POST', - Network accessline 423
const resp = await fetch(`${url}/messages?sessionId=nonexistent`, { - Access to secretsline 445
[Credential-related source omitted] - Access to secretsline 451
[Credential-related source omitted] - Network accessline 493
try { const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { - Network accessline 494
const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { method: 'POST', - Network accessline 495
const resp = await fetch(`${url}/mcp`, { - Network accessline 496
method: 'POST', headers: { 'Content-Type': 'application/json', Origin: 'https://evil.example.com' }, body: JSON.stringify({ jsonrpc: '2.0', method: 'initialize', id: 1, params: {} }), - Network accessline 497
headers: { 'Content-Type': 'application/json', Origin: 'https://evil.example.com' }, - Access to secretsline 507
[Credential-related source omitted] - Network accessline 511
try { const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { - Network accessline 512
const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { method: 'POST', - Network accessline 513
const resp = await fetch(`${url}/mcp`, { - Network accessline 516
[Credential-related source omitted] - Network accessline 517
[Credential-related source omitted] - Network accessline 518
Origin: 'https://evil.example.com', - Network accessline 539
port: parsed.port, path: parsed.pathname, headers: { Accept: 'text/event-stream', Origin: 'https://evil.example.com' }, - Network accessline 540
path: parsed.pathname, headers: { Accept: 'text/event-stream', Origin: 'https://evil.example.com' }, }, - Network accessline 541
headers: { Accept: 'text/event-stream', Origin: 'https://evil.example.com' }, - Network accessline 620
try { const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { - Network accessline 621
const url = await daemon.start(); const resp = await fetch(`${url}/mcp`, { method: 'POST', - Network accessline 622
const resp = await fetch(`${url}/mcp`, { - Access to secretsline 653
[Credential-related source omitted] - Network accessline 694
[Credential-related source omitted] - Network accessline 695
[Credential-related source omitted] - Network accessline 696
const resp = await fetch(`${url}/admin/reset-breakers`, { - Network accessline 712
try { const url = await daemon.start(); const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'POST' }); - Network accessline 713
const url = await daemon.start(); const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'POST' }); expect(resp.status).toBe(401); - Network accessline 714
const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'POST' }); - Network accessline 724
try { const url = await daemon.start(); const resp = await fetch(`${url}/admin/reset-breakers`, { - Network accessline 725
const url = await daemon.start(); const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'POST', - Network accessline 726
const resp = await fetch(`${url}/admin/reset-breakers`, { - Network accessline 744
[Credential-related source omitted] - Network accessline 745
[Credential-related source omitted] - Network accessline 746
const resp = await fetch(`${url}/admin/reset-breakers`, { - Network accessline 748
[Credential-related source omitted] - Network accessline 749
[Credential-related source omitted] - Network accessline 750
Origin: 'https://evil.example.com', - Network accessline 799
try { const url = await daemon.start(); const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'GET' }); - Network accessline 800
const url = await daemon.start(); const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'GET' }); expect(resp.status).toBe(404); - Network accessline 801
const resp = await fetch(`${url}/admin/reset-breakers`, { method: 'GET' });
tests/unit/daemon/proxy.test.ts
- Executable scriptline 1
Executable file - Network accessline 51
it('DaemonProxy constructor accepts url', async () => { const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:3333'); - Network accessline 52
const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:3333'); expect(proxy).toBeDefined(); - Network accessline 53
const proxy = new DaemonProxy('http://127.0.0.1:3333'); - Network accessline 57
it('DaemonProxy has callTool method', async () => { const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:3333'); - Network accessline 58
const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:3333'); expect(typeof proxy.callTool).toBe('function'); - Network accessline 59
const proxy = new DaemonProxy('http://127.0.0.1:3333'); - Network accessline 63
it('DaemonProxy.callTool throws when daemon is unreachable', async () => { const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:19997'); - Network accessline 64
const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:19997'); await expect(proxy.callTool('fetch', { url: 'https://example.com' })).rejects.toThrow(); - Network accessline 65
const proxy = new DaemonProxy('http://127.0.0.1:19997'); await expect(proxy.callTool('fetch', { url: 'https://example.com' })).rejects.toThrow(); }); - Network accessline 66
await expect(proxy.callTool('fetch', { url: 'https://example.com' })).rejects.toThrow(); - Network accessline 69
it('DaemonProxy has checkHealth method', async () => { const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:3333'); - Network accessline 70
const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:3333'); expect(typeof proxy.checkHealth).toBe('function'); - Network accessline 71
const proxy = new DaemonProxy('http://127.0.0.1:3333'); - Network accessline 75
it('DaemonProxy.checkHealth returns null when unreachable', async () => { const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:19997'); - Network accessline 76
const { DaemonProxy } = await import('../../../src/daemon/proxy.js'); const proxy = new DaemonProxy('http://127.0.0.1:19997'); const result = await proxy.checkHealth(); - Network accessline 77
const proxy = new DaemonProxy('http://127.0.0.1:19997');
tests/unit/daemon/rest-auth.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Network accessline 151
}); it('valid bearer + Origin present → allow (Origin ignored in token mode)', () => { const r = checkAuth(base, { hostHeader: 'my.remote.host', originHeader: 'https://evil.com', authHeader: 'Bearer secret' }); - Network accessline 152
it('valid bearer + Origin present → allow (Origin ignored in token mode)', () => { const r = checkAuth(base, { hostHeader: 'my.remote.host', originHeader: 'https://evil.com', authHeader: 'Bearer secret' }); expect(r.allow).toBe(true - Network accessline 153
const r = checkAuth(base, { hostHeader: 'my.remote.host', originHeader: 'https://evil.com', authHeader: 'Bearer secret' }); - Network accessline 169
}); it('Origin header → 403 (rebinding/CSRF)', () => { const r = checkAuth(base, { hostHeader: '127.0.0.1', originHeader: 'https://evil.com', authHeader: undefined }); - Network accessline 170
it('Origin header → 403 (rebinding/CSRF)', () => { const r = checkAuth(base, { hostHeader: '127.0.0.1', originHeader: 'https://evil.com', authHeader: undefined }); expect(r.allow).toBe(false); - Network accessline 171
const r = checkAuth(base, { hostHeader: '127.0.0.1', originHeader: 'https://evil.com', authHeader: undefined }); - Network accessline 183
}); it('Origin header → 403 (kept)', () => { const r = checkAuth(base, { hostHeader: 'my.remote.host', originHeader: 'https://evil.com', authHeader: undefined }); - Network accessline 184
it('Origin header → 403 (kept)', () => { const r = checkAuth(base, { hostHeader: 'my.remote.host', originHeader: 'https://evil.com', authHeader: undefined }); expect(r.allow).toBe(false); - Network accessline 185
const r = checkAuth(base, { hostHeader: 'my.remote.host', originHeader: 'https://evil.com', authHeader: undefined });
tests/unit/daemon/rest-dispatch.test.ts
- Executable scriptline 1
Executable file - Network accessline 50
describe('dispatchTool — fetch', () => { it('success returns r.data as plain JSON (200)', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: { url: 'https://x.com', markdown: 'hi' } } as never); - Network accessline 51
it('success returns r.data as plain JSON (200)', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: { url: 'https://x.com', markdown: 'hi' } } as never); const r = await dispatchTool('fetch', { url: 'https://x. - Network accessline 52
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: { url: 'https://x.com', markdown: 'hi' } } as never); const r = await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); expect(r.status).toBe(200); - Network accessline 53
const r = await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); - Network accessline 54
expect(r.status).toBe(200); expect(r.body).toEqual({ url: 'https://x.com', markdown: 'hi' }); }); - Network accessline 55
expect(r.body).toEqual({ url: 'https://x.com', markdown: 'hi' }); - Network accessline 60
ok: false, error: 'blocked_by_challenge', error_reason: 'the site returned a bot challenge', stage: 'fetch', } as never); const r = await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); - Network accessline 61
} as never); const r = await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); expect(r.status).toBe(502); - Network accessline 62
const r = await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); - Network accessline 77
const ctx = fakeCtx(); ctx.bindIsLoopback = false; const r = await dispatchTool('fetch', { url: 'http://127.0.0.1/' }, ctx); - Network accessline 78
ctx.bindIsLoopback = false; const r = await dispatchTool('fetch', { url: 'http://127.0.0.1/' }, ctx); expect(r.status).toBe(400); - Network accessline 79
const r = await dispatchTool('fetch', { url: 'http://127.0.0.1/' }, ctx); - Network accessline 84
it('schedules the overdue watch check on a non-watch call', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: {} } as never); await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); - Network accessline 85
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: {} } as never); await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); expect(scheduleOverdueCheck).toHaveBeenCalled(); - Network accessline 86
await dispatchTool('fetch', { url: 'https://x.com' }, fakeCtx()); - Network accessline 113
it('crawl success → 200 with the plain output object', async () => { vi.mocked(handleCrawl).mockResolvedValue({ pages: [], total_found: 0, crawled: 0 } as never); const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeC - Network accessline 114
vi.mocked(handleCrawl).mockResolvedValue({ pages: [], total_found: 0, crawled: 0 } as never); const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeCtx()); expect(r.status).toBe(200); - Network accessline 115
const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeCtx()); - Network accessline 120
it('crawl in-band ssrf error → 400 (shape adapter)', async () => { vi.mocked(handleCrawl).mockResolvedValue({ pages: [], total_found: 0, crawled: 0, error: 'ssrf_private_target' } as never); const r = await dispatchTool('crawl', { u - Network accessline 121
vi.mocked(handleCrawl).mockResolvedValue({ pages: [], total_found: 0, crawled: 0, error: 'ssrf_private_target' } as never); const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeCtx()); expect(r.status).toBe(400); - Network accessline 122
const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeCtx()); - Network accessline 126
it('crawl in-band free-text error → 500 (no substring matching)', async () => { vi.mocked(handleCrawl).mockResolvedValue({ pages: [], total_found: 0, crawled: 0, error: 'a timeout happened while crawling' } as never); const r = awai - Network accessline 127
vi.mocked(handleCrawl).mockResolvedValue({ pages: [], total_found: 0, crawled: 0, error: 'a timeout happened while crawling' } as never); const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeCtx()); expect(r.status).t - Network accessline 128
const r = await dispatchTool('crawl', { url: 'https://x.com' }, fakeCtx()); - Network accessline 190
const ctx = fakeCtx(); ctx.bindIsLoopback = false; const r = await dispatchTool('crawl', { url: 'http://127.0.0.1/' }, ctx); - Network accessline 191
ctx.bindIsLoopback = false; const r = await dispatchTool('crawl', { url: 'http://127.0.0.1/' }, ctx); expect(r.status).toBe(400); - Network accessline 192
const r = await dispatchTool('crawl', { url: 'http://127.0.0.1/' }, ctx); - Network accessline 206
it('agent guards every url in urls[] (metadata → 400, no handler call)', async () => { const ctx = fakeCtx(); const r = await dispatchTool('agent', { prompt: 'x', urls: ['http://169.254.169.254/'] }, ctx); - Network accessline 207
const ctx = fakeCtx(); const r = await dispatchTool('agent', { prompt: 'x', urls: ['http://169.254.169.254/'] }, ctx); expect(r.status).toBe(400); - Network accessline 208
const r = await dispatchTool('agent', { prompt: 'x', urls: ['http://169.254.169.254/'] }, ctx);
tests/unit/daemon/rest-errors.test.ts
- Executable scriptline 1
Executable file
tests/unit/daemon/rest-limits.test.ts
- Executable scriptline 1
Executable file - Network accessline 79
it('over-cap scalar → violation with cap in hint', () => { const v = findClampViolation('crawl', { url: 'https://x.com', max_pages: 500 }); - Network accessline 80
const v = findClampViolation('crawl', { url: 'https://x.com', max_pages: 500 }); - Network accessline 86
it('boundary value passes', () => { expect(findClampViolation('crawl', { url: 'https://x.com', max_pages: 200 })).toBeNull(); - Network accessline 87
expect(findClampViolation('crawl', { url: 'https://x.com', max_pages: 200 })).toBeNull();
tests/unit/daemon/rest-openapi.test.ts
tests/unit/daemon/rest-router.test.ts
- Executable scriptline 1
Executable file - Network accessline 94
const router = loopbackRouter(); const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), res); - Network accessline 95
const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), res); expect(get().status).toBe(200); - Network accessline 96
await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), res); - Network accessline 157
const router = loopbackRouter(); const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/crawl', body: JSON.stringify({ url: 'https://x.com', max_pages: 9999 }) }), res); - Network accessline 158
const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/crawl', body: JSON.stringify({ url: 'https://x.com', max_pages: 9999 }) }), res); const out = get(); - Network accessline 159
await router.handle(makeReq({ url: '/v1/crawl', body: JSON.stringify({ url: 'https://x.com', max_pages: 9999 }) }), res); - Network accessline 167
const router = loopbackRouter(); const { res } = makeRes(); await router.handle(makeReq({ url: '/v1/crawl', body: JSON.stringify({ url: 'https://x.com', max_pages: 200 }) }), res); - Network accessline 168
const { res } = makeRes(); await router.handle(makeReq({ url: '/v1/crawl', body: JSON.stringify({ url: 'https://x.com', max_pages: 200 }) }), res); expect(dispatchTool).toHaveBeenCalled(); - Network accessline 169
await router.handle(makeReq({ url: '/v1/crawl', body: JSON.stringify({ url: 'https://x.com', max_pages: 200 }) }), res); - Network accessline 175
const router = loopbackRouter(); const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com/very/long/path' }) }), res); - Network accessline 176
const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com/very/long/path' }) }), res); expect(get().status).toBe(413); - Network accessline 177
await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com/very/long/path' }) }), res); - Network accessline 204
const router = loopbackRouter(); const { res, get } = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: '{bad json', headers: { host: '127.0.0.1', origin: 'https://evil.com' } }), res); - Network accessline 206
await router.handle(makeReq({ url: '/v1/fetch', body: '{bad json', headers: { host: '127.0.0.1', origin: 'https://evil.com' } }), res); - Network accessline 243
const first = router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), makeRes().res); - Network accessline 247
const second = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), second.res); - Network accessline 248
await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), second.res); - Network accessline 260
vi.mocked(dispatchTool).mockResolvedValue({ status: 200, body: { ok: true } }); const router = loopbackRouter(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), makeRes().res) - Network accessline 261
const router = loopbackRouter(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), makeRes().res); const second = makeRes(); - Network accessline 262
await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), makeRes().res); - Network accessline 263
const second = makeRes(); await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), second.res); expect(second.get().status).toBe(200); - Network accessline 264
await router.handle(makeReq({ url: '/v1/fetch', body: JSON.stringify({ url: 'https://example.com' }) }), second.res);
tests/unit/daemon/rest-target-guard.test.ts
- Executable scriptline 1
Executable file - Network accessline 11
describe('guardServeTarget', () => { it('loopback bind → loopback target allowed (delegates to fetch guard)', () => { const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: true }); - Network accessline 12
it('loopback bind → loopback target allowed (delegates to fetch guard)', () => { const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: true }); expect(r.ok).toBe(true); - Network accessline 13
const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: true }); - Network accessline 17
it('non-loopback bind → loopback literal target refused', () => { const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: false }); - Network accessline 18
const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: false }); - Network accessline 26
it('non-loopback bind → localhost literal target refused', () => { const r = guardServeTarget('http://localhost:3000/', { bindIsLoopback: false }); - Network accessline 27
const r = guardServeTarget('http://localhost:3000/', { bindIsLoopback: false }); - Network accessline 31
it('non-loopback bind + WIGOLO_SERVE_ALLOW_LOCAL_TARGETS=1 → loopback target allowed', () => { process.env.WIGOLO_SERVE_ALLOW_LOCAL_TARGETS = '1'; const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: false }); - Network accessline 32
process.env.WIGOLO_SERVE_ALLOW_LOCAL_TARGETS = '1'; const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: false }); expect(r.ok).toBe(true); - Network accessline 33
const r = guardServeTarget('http://127.0.0.1:8080/', { bindIsLoopback: false }); - Network accessline 37
it('non-loopback bind → public target still passes', () => { const r = guardServeTarget('https://example.com/', { bindIsLoopback: false }); - Network accessline 38
const r = guardServeTarget('https://example.com/', { bindIsLoopback: false }); - Network accessline 42
it('metadata target blocked even under loopback bind (fetch guard)', () => { const r = guardServeTarget('http://169.254.169.254/', { bindIsLoopback: true }); - Network accessline 43
const r = guardServeTarget('http://169.254.169.254/', { bindIsLoopback: true });
tests/unit/daemon/rest-validate.test.ts
- Executable scriptline 1
Executable file - Network accessline 4
describe('validateInput (lazy ajv against tool schemas)', () => { it('accepts a valid fetch body', async () => { const r = await validateInput('fetch', { url: 'https://example.com' }); - Network accessline 5
it('accepts a valid fetch body', async () => { const r = await validateInput('fetch', { url: 'https://example.com' }); expect(r.ok).toBe(true); - Network accessline 6
const r = await validateInput('fetch', { url: 'https://example.com' }); - Network accessline 29
it('rejects a wrong-typed field', async () => { const r = await validateInput('crawl', { url: 'https://x.com', max_pages: 'lots' }); - Network accessline 30
const r = await validateInput('crawl', { url: 'https://x.com', max_pages: 'lots' }); - Network accessline 43
it('all 10 tool schemas compile (accepts a minimal valid body each)', async () => { const minimal: Record<string, unknown> = { fetch: { url: 'https://x.com' }, - Network accessline 44
const minimal: Record<string, unknown> = { fetch: { url: 'https://x.com' }, search: { query: 'x' }, - Network accessline 45
fetch: { url: 'https://x.com' }, - Network accessline 46
search: { query: 'x' }, crawl: { url: 'https://x.com' }, cache: { query: 'x' }, - Network accessline 47
crawl: { url: 'https://x.com' }, - Network accessline 48
cache: { query: 'x' }, extract: { url: 'https://x.com' }, find_similar: { url: 'https://x.com' }, - Network accessline 49
extract: { url: 'https://x.com' }, - Network accessline 50
find_similar: { url: 'https://x.com' },
tests/unit/documentation/docker-image-tags.test.ts
- Executable scriptline 1
Executable file
tests/unit/embedding/background-queue.test.ts
- Executable scriptline 1
Executable file - Network accessline 57
}); const t0 = Date.now(); q.enqueue({ url: 'https://a.example', text: 'hello world body', contentHash: 'h1' }); - Network accessline 58
const t0 = Date.now(); q.enqueue({ url: 'https://a.example', text: 'hello world body', contentHash: 'h1' }); const elapsed = Date.now() - t0; - Network accessline 59
q.enqueue({ url: 'https://a.example', text: 'hello world body', contentHash: 'h1' }); - Network accessline 71
vectorStore: async () => store, }); q.enqueue({ url: 'https://a.example', text: 'doc one body', contentHash: 'h1' }); - Network accessline 72
}); q.enqueue({ url: 'https://a.example', text: 'doc one body', contentHash: 'h1' }); q.enqueue({ url: 'https://b.example', text: 'doc two body', contentHash: 'h2' }); - Network accessline 73
q.enqueue({ url: 'https://a.example', text: 'doc one body', contentHash: 'h1' }); - Network accessline 74
q.enqueue({ url: 'https://b.example', text: 'doc two body', contentHash: 'h2' }); - Network accessline 75
q.enqueue({ url: 'https://c.example', text: 'doc three body', contentHash: 'h3' }); - Network accessline 78
expect(records).toHaveLength(3); expect(records.map((r) => r.id).sort()).toEqual([ 'https://a.example', - Network accessline 79
expect(records.map((r) => r.id).sort()).toEqual([ 'https://a.example', 'https://b.example', - Network accessline 80
'https://a.example', - Network accessline 81
'https://b.example', - Network accessline 82
'https://c.example', - Network accessline 84
expect(records[0].metadata.modelId).toBe('test-model'); expect(records[0].metadata.contentHash).toBe( records.find((r) => r.id === 'https://a.example')!.metadata.contentHash, - Network accessline 85
expect(records[0].metadata.contentHash).toBe( records.find((r) => r.id === 'https://a.example')!.metadata.contentHash, ); - Network accessline 86
records.find((r) => r.id === 'https://a.example')!.metadata.contentHash, - Network accessline 101
autoStart: false, }); q1.enqueue({ url: 'https://restart.example', text: 'persisting across restart', contentHash: 'hx' }); - Network accessline 102
}); q1.enqueue({ url: 'https://restart.example', text: 'persisting across restart', contentHash: 'hx' }); expect(q1.pendingSize()).toBe(1); - Network accessline 103
q1.enqueue({ url: 'https://restart.example', text: 'persisting across restart', contentHash: 'hx' }); - Network accessline 116
expect(embedSpy).toHaveBeenCalledTimes(1); expect(records).toHaveLength(1); expect(records[0].id).toBe('https://restart.example'); - Network accessline 117
expect(records).toHaveLength(1); expect(records[0].id).toBe('https://restart.example'); q2.shutdown(); - Network accessline 118
expect(records[0].id).toBe('https://restart.example'); - Network accessline 129
maxAttempts: 2, }); q.enqueue({ url: 'https://err.example', text: 'will fail repeatedly', contentHash: 'he' }); - Network accessline 130
}); q.enqueue({ url: 'https://err.example', text: 'will fail repeatedly', contentHash: 'he' }); await q.drain(); - Network accessline 131
q.enqueue({ url: 'https://err.example', text: 'will fail repeatedly', contentHash: 'he' }); - Network accessline 145
syncMode: true, }); await q.enqueue({ url: 'https://s.example', text: 'sync mode test body', contentHash: 'hs' }); - Network accessline 146
}); await q.enqueue({ url: 'https://s.example', text: 'sync mode test body', contentHash: 'hs' }); expect(embedSpy).toHaveBeenCalledTimes(1); - Network accessline 147
await q.enqueue({ url: 'https://s.example', text: 'sync mode test body', contentHash: 'hs' }); - Network accessline 148
expect(embedSpy).toHaveBeenCalledTimes(1); expect(records).toHaveLength(1); expect(records[0].id).toBe('https://s.example'); - Network accessline 149
expect(records).toHaveLength(1); expect(records[0].id).toBe('https://s.example'); q.shutdown(); - Network accessline 150
expect(records[0].id).toBe('https://s.example'); - Network accessline 161
autoStart: false, }); q.enqueue({ url: 'https://dup.example', text: 'first version', contentHash: 'v1' }); - Network accessline 162
}); q.enqueue({ url: 'https://dup.example', text: 'first version', contentHash: 'v1' }); q.enqueue({ url: 'https://dup.example', text: 'second version', contentHash: 'v2' }); - Network accessline 163
q.enqueue({ url: 'https://dup.example', text: 'first version', contentHash: 'v1' }); - Network accessline 164
q.enqueue({ url: 'https://dup.example', text: 'second version', contentHash: 'v2' });
tests/unit/embedding/embed-provider-resolution.test.ts
- Executable scriptline 1
Executable file - Network accessline 64
const service = new EmbeddingService(); await service.init(); await service.embedAndStore('https://example.com/a', 'Body A'); - Network accessline 66
await service.embedAndStore('https://example.com/a', 'Body A'); - Network accessline 81
await service.embedAndStore('https://example.com/a', 'Body A'); - Network accessline 85
current = second; await service.embedAndStore('https://example.com/b', 'Body B'); - Network accessline 86
await service.embedAndStore('https://example.com/b', 'Body B'); - Network accessline 95
const service = new EmbeddingService(injected); await service.init(); await service.embedAndStore('https://example.com/a', 'Body A'); - Network accessline 97
await service.embedAndStore('https://example.com/a', 'Body A');
tests/unit/embedding/embed.test.ts
- Executable scriptline 1
Executable file - Network accessline 109
await service.embedAndStore('https://example.com', 'Hello world content'); - Network accessline 111
expect(provider.embed).toHaveBeenCalledWith(['Hello world content']); expect(updateCacheEmbedding).toHaveBeenCalledWith( 'https://example.com', - Network accessline 112
expect(updateCacheEmbedding).toHaveBeenCalledWith( 'https://example.com', expect.any(Buffer), - Network accessline 113
'https://example.com', - Network accessline 124
await service.embedAndStore('https://example.com', 'Content'); - Network accessline 126
const index = service.getIndex(); expect(index.has('https://example.com')).toBe(true); - Network accessline 127
expect(index.has('https://example.com')).toBe(true); - Network accessline 138
await expect(service.embedAndStore('https://error.com', 'Content')).resolves.not.toThrow(); - Network accessline 146
await service.embedAndStore('https://skip.com', 'Content'); - Network accessline 157
await service.embedAndStore('https://empty.com', ''); - Network accessline 167
await service.embedAndStore('https://example.com', 'Content about TypeScript'); - Network accessline 171
expect(results.length).toBeGreaterThan(0); expect(results[0].url).toBe('https://example.com'); - Network accessline 172
expect(results[0].url).toBe('https://example.com'); - Network accessline 192
vi.mocked(getAllEmbeddings).mockReturnValue([ { normalizedUrl: 'https://cached.com', - Network accessline 193
{ normalizedUrl: 'https://cached.com', embedding: Buffer.from(new Float32Array(384).buffer), - Network accessline 194
normalizedUrl: 'https://cached.com', - Network accessline 204
expect(getAllEmbeddings).toHaveBeenCalledWith('BGE-small-en-v1.5'); const index = service.getIndex(); expect(index.has('https://cached.com')).toBe(true); - Network accessline 205
const index = service.getIndex(); expect(index.has('https://cached.com')).toBe(true); expect(index.size()).toBe(1); - Network accessline 206
expect(index.has('https://cached.com')).toBe(true); - Network accessline 214
await service.embedAndStore('https://example.com', 'Content'); - Network accessline 232
const start = Date.now(); service.embedAsync('https://slow.com', 'Slow content'); - Network accessline 233
service.embedAsync('https://slow.com', 'Slow content'); - Network accessline 249
const promises = [ service.embedAndStore('https://a.com', 'Content A'), - Network accessline 250
service.embedAndStore('https://a.com', 'Content A'), - Network accessline 251
service.embedAndStore('https://b.com', 'Content B'), - Network accessline 252
service.embedAndStore('https://c.com', 'Content C'), - Network accessline 411
service.embedAsync('https://fresh.example.com', 'Fresh content to embed'); - Network accessline 414
await vi.waitFor(() => { expect(mockStoreState.records.has('https://fresh.example.com')).toBe(true); - Network accessline 415
expect(mockStoreState.records.has('https://fresh.example.com')).toBe(true); - Network accessline 416
}); expect(updateCacheEmbedding).toHaveBeenCalledWith( 'https://fresh.example.com', - Network accessline 417
expect(updateCacheEmbedding).toHaveBeenCalledWith( 'https://fresh.example.com', expect.any(Buffer), - Network accessline 418
'https://fresh.example.com',
tests/unit/embedding/fastembed-provider-dispose.test.ts
- Executable scriptline 1
Executable file
tests/unit/embedding/fastembed-provider.test.ts
- Executable scriptline 1
Executable file
tests/unit/embedding/key-terms.test.ts
- Executable scriptline 1
Executable file - Network accessline 134
it('strips URLs from content before extraction', () => { const terms = extractKeyTerms( 'Visit https://example.com/very/long/path?query=test for details about **React**.', - Network accessline 135
const terms = extractKeyTerms( 'Visit https://example.com/very/long/path?query=test for details about **React**.', 'Links Page', - Network accessline 136
'Visit https://example.com/very/long/path?query=test for details about **React**.',
tests/unit/extraction/boilerplate.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/brand-async.test.ts
- Executable scriptline 1
Executable file - Network accessline 65
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 66
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 67
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 73
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 74
baseUrl: 'https://acme.example/', - Network accessline 79
expect(out.provenance?.colors).toBe('palette-extraction'); expect(fetcher).toHaveBeenCalledWith( 'https://acme.example/logo.png', - Network accessline 80
expect(fetcher).toHaveBeenCalledWith( 'https://acme.example/logo.png', expect.objectContaining({ timeoutMs: expect.any(Number) }), - Network accessline 81
'https://acme.example/logo.png', - Network accessline 91
<style>:root { --brand-primary: #635bff; --color-accent: #00d4ff; }</style> <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 92
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 93
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 98
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 99
baseUrl: 'https://acme.example/', - Network accessline 115
<style>:root { --brand-primary: #abcdef; }</style> <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 116
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 117
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 123
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 124
baseUrl: 'https://acme.example/', - Network accessline 139
const html = wrap(` <meta property="og:image" content="https://acme.example/social.png"> - Network accessline 140
<meta property="og:image" content="https://acme.example/social.png"> - Network accessline 149
expect(out.provenance?.colors).toBe('palette-extraction'); expect(fetcher).toHaveBeenCalledWith( 'https://acme.example/social.png', - Network accessline 150
expect(fetcher).toHaveBeenCalledWith( 'https://acme.example/social.png', expect.anything(), - Network accessline 151
'https://acme.example/social.png', - Network accessline 161
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 162
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 163
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 164
</script> <meta property="og:image" content="https://acme.example/hero.png"> `); - Network accessline 165
<meta property="og:image" content="https://acme.example/hero.png"> - Network accessline 174
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 175
baseUrl: 'https://acme.example/', - Network accessline 179
expect(out.provenance?.colors).toBe('palette-extraction'); expect(calls).toEqual(['https://acme.example/logo.png']); - Network accessline 180
expect(calls).toEqual(['https://acme.example/logo.png']); - Network accessline 189
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 190
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 191
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 196
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 197
baseUrl: 'https://acme.example/', - Network accessline 210
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 211
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 212
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 222
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 223
baseUrl: 'https://acme.example/', - Network accessline 244
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg"} - Network accessline 245
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg"} </script> - Network accessline 246
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg"} - Network accessline 251
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 252
baseUrl: 'https://acme.example/', - Network accessline 267
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg?v=2"} - Network accessline 268
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg?v=2"} </script> - Network accessline 269
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg?v=2"} - Network accessline 274
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 275
baseUrl: 'https://acme.example/', - Network accessline 304
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 305
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} </script> - Network accessline 306
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.png"} - Network accessline 310
const out = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', - Network accessline 311
baseUrl: 'https://acme.example/', - Network accessline 327
const sync = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 328
const asyncOut = await extractBrandAsync(html, { baseUrl: 'https://acme.example/', imageFetcher: null, - Network accessline 329
baseUrl: 'https://acme.example/', - Network accessline 348
const fixturesMinusCss: Array<{ slug: string; baseUrl: string }> = [ { slug: 'stripe', baseUrl: 'https://stripe.com/' }, - Network accessline 349
{ slug: 'stripe', baseUrl: 'https://stripe.com/' }, - Network accessline 350
{ slug: 'linear', baseUrl: 'https://linear.app/' }, - Network accessline 351
{ slug: 'vercel', baseUrl: 'https://vercel.com/' }, - Network accessline 352
{ slug: 'github', baseUrl: 'https://github.com/' }, - Network accessline 353
{ slug: 'openai', baseUrl: 'https://openai.com/' }, - Network accessline 386
* loopback / RFC 1918 / link-local / IPv6 private hostnames. Without a * dedicated guard, an attacker-controlled page can ship a JSON-LD * `"logo": "http://169.254.169.254/latest/meta-data/"` and trick the - Network accessline 387
* dedicated guard, an attacker-controlled page can ship a JSON-LD * `"logo": "http://169.254.169.254/latest/meta-data/"` and trick the * server into making the request on their behalf. - Network accessline 388
* `"logo": "http://169.254.169.254/latest/meta-data/"` and trick the - Network accessline 400
*/ describe('defaultImageFetcher — SSRF guard', () => { it('returns null for direct loopback IPv4 (http://127.0.0.1/logo.png) without fetching', async () => { - Network accessline 401
describe('defaultImageFetcher — SSRF guard', () => { it('returns null for direct loopback IPv4 (http://127.0.0.1/logo.png) without fetching', async () => { const calls: string[] = []; - Network accessline 402
it('returns null for direct loopback IPv4 (http://127.0.0.1/logo.png) without fetching', async () => { const calls: string[] = []; const realFetch = globalThis.fetch; - Network accessline 408
}) as typeof fetch; try { const result = await defaultImageFetcher('http://127.0.0.1/logo.png'); - Network accessline 409
try { const result = await defaultImageFetcher('http://127.0.0.1/logo.png'); expect(result).toBeNull(); - Network accessline 410
const result = await defaultImageFetcher('http://127.0.0.1/logo.png'); - Network accessline 424
}) as typeof fetch; try { const result = await defaultImageFetcher('http://169.254.169.254/latest/meta-data/'); - Network accessline 425
try { const result = await defaultImageFetcher('http://169.254.169.254/latest/meta-data/'); expect(result).toBeNull(); - Network accessline 426
const result = await defaultImageFetcher('http://169.254.169.254/latest/meta-data/'); - Network accessline 434
it('returns null for IPv6 loopback (http://[::1]/x.png) without fetching', async () => { const calls: string[] = []; const realFetch = globalThis.fetch; - Network accessline 440
}) as typeof fetch; try { const result = await defaultImageFetcher('http://[::1]/x.png'); - Network accessline 441
try { const result = await defaultImageFetcher('http://[::1]/x.png'); expect(result).toBeNull(); - Network accessline 442
const result = await defaultImageFetcher('http://[::1]/x.png'); - Network accessline 472
// We assert: first call to public host returns 302, fetcher // sees the Location header, runs guardUrl on it, sees loopback, // returns null. Crucially: the second fetch (to 127.0.0.1) must - Network accessline 473
// sees the Location header, runs guardUrl on it, sees loopback, // returns null. Crucially: the second fetch (to 127.0.0.1) must // never happen. - Network accessline 474
// returns null. Crucially: the second fetch (to 127.0.0.1) must - Network accessline 478
globalThis.fetch = (async (url: string | URL, init?: RequestInit) => { calls.push({ url: String(url), redirect: init?.redirect }); if (String(url) === 'https://acme.example/logo.png') { - Network accessline 479
calls.push({ url: String(url), redirect: init?.redirect }); if (String(url) === 'https://acme.example/logo.png') { return new Response(null, { - Network accessline 480
if (String(url) === 'https://acme.example/logo.png') { - Network accessline 481
return new Response(null, { status: 302, headers: { Location: 'http://127.0.0.1/evil.png' }, - Network accessline 482
status: 302, headers: { Location: 'http://127.0.0.1/evil.png' }, }); - Network accessline 483
headers: { Location: 'http://127.0.0.1/evil.png' }, - Network accessline 489
}) as typeof fetch; try { const result = await defaultImageFetcher('https://acme.example/logo.png'); - Network accessline 490
try { const result = await defaultImageFetcher('https://acme.example/logo.png'); expect(result).toBeNull(); - Network accessline 491
const result = await defaultImageFetcher('https://acme.example/logo.png'); - Network accessline 494
expect(calls).toHaveLength(1); expect(calls[0].url).toBe('https://acme.example/logo.png'); - Network accessline 495
expect(calls[0].url).toBe('https://acme.example/logo.png'); - Network accessline 509
const u = String(url); calls.push(u); if (u === 'https://acme.example/logo.png') { - Network accessline 510
calls.push(u); if (u === 'https://acme.example/logo.png') { return new Response(null, { - Network accessline 511
if (u === 'https://acme.example/logo.png') { - Network accessline 512
return new Response(null, { status: 302, headers: { Location: 'https://cdn.example/v2/logo.png' }, - Network accessline 513
status: 302, headers: { Location: 'https://cdn.example/v2/logo.png' }, }); - Network accessline 514
headers: { Location: 'https://cdn.example/v2/logo.png' }, - Network accessline 527
}) as typeof fetch; try { const result = await defaultImageFetcher('https://acme.example/logo.png'); - Network accessline 528
try { const result = await defaultImageFetcher('https://acme.example/logo.png'); expect(result).not.toBeNull(); - Network accessline 529
const result = await defaultImageFetcher('https://acme.example/logo.png'); - Network accessline 531
expect(result!.contentType).toBe('image/png'); expect(calls).toEqual([ 'https://acme.example/logo.png', - Network accessline 532
expect(calls).toEqual([ 'https://acme.example/logo.png', 'https://cdn.example/v2/logo.png', - Network accessline 533
'https://acme.example/logo.png', - Network accessline 534
'https://cdn.example/v2/logo.png', - Network accessline 552
const order = [ 'https://a.example/1.png', - Network accessline 553
'https://a.example/1.png', - Network accessline 554
'https://b.example/2.png', - Network accessline 555
'https://c.example/3.png', - Network accessline 556
'https://d.example/4.png', - Network accessline 557
'https://e.example/5.png', - Network accessline 570
}) as typeof fetch; try { const result = await defaultImageFetcher('https://a.example/1.png'); - Network accessline 571
try { const result = await defaultImageFetcher('https://a.example/1.png'); expect(result).toBeNull(); - Network accessline 572
const result = await defaultImageFetcher('https://a.example/1.png');
tests/unit/extraction/brand-fixtures.test.ts
- Executable scriptline 1
Executable file - Network accessline 27
const SITES: Record<string, string> = { stripe: 'https://stripe.com/', - Network accessline 28
stripe: 'https://stripe.com/', - Network accessline 29
linear: 'https://linear.app/', - Network accessline 30
vercel: 'https://vercel.com/', - Network accessline 31
anthropic: 'https://www.anthropic.com/', - Network accessline 32
github: 'https://github.com/', - Network accessline 33
openai: 'https://openai.com/', - Network accessline 34
notion: 'https://www.notion.so/', - Network accessline 35
figma: 'https://www.figma.com/', - Network accessline 36
discord: 'https://discord.com/', - Network accessline 37
slack: 'https://slack.com/', - Network accessline 38
cloudflare: 'https://www.cloudflare.com/', - Network accessline 39
supabase: 'https://supabase.com/', - Network accessline 40
railway: 'https://railway.app/', - Network accessline 41
netlify: 'https://www.netlify.com/', - Network accessline 42
render: 'https://render.com/', - Network accessline 43
fly: 'https://fly.io/', - Network accessline 44
convex: 'https://convex.dev/', - Network accessline 45
resend: 'https://resend.com/', - Network accessline 46
posthog: 'https://posthog.com/', - Network accessline 47
nextjs: 'https://nextjs.org/', - Network accessline 48
tailwind: 'https://tailwindcss.com/',
tests/unit/extraction/brand-fonts-acceptance.test.ts
- Executable scriptline 1
Executable file - Network accessline 38
const out = extractBrand(loadFixture('stripe'), { baseUrl: 'https://stripe.com/' }); - Network accessline 46
const out = extractBrand(loadFixture('linear'), { baseUrl: 'https://linear.app/' }); - Network accessline 54
const out = extractBrand(loadFixture('vercel'), { baseUrl: 'https://vercel.com/' }); - Network accessline 66
const out = extractBrand(loadFixture('hackernews'), { baseUrl: 'https://news.ycombinator.com/' }); - Network accessline 75
const out = extractBrand(loadFixture('figma'), { baseUrl: 'https://www.figma.com/' }); - Network accessline 84
const out = extractBrand(loadFixture('example'), { baseUrl: 'https://example.com/' }); - Network accessline 93
let withFont = 0; for (const slug of brandSites) { const out = extractBrand(loadFixture(slug), { baseUrl: 'https://x.example/' }); - Network accessline 94
for (const slug of brandSites) { const out = extractBrand(loadFixture(slug), { baseUrl: 'https://x.example/' }); const total = (out.fonts?.headings?.length ?? 0) + (out.fonts?.body?.length ?? 0); - Network accessline 95
const out = extractBrand(loadFixture(slug), { baseUrl: 'https://x.example/' });
tests/unit/extraction/brand-honesty.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
<meta property="og:description" content="AI safety company."> `); const out = extractBrand(html, { baseUrl: 'https://anthropic.example/' }); - Network accessline 43
`); const out = extractBrand(html, { baseUrl: 'https://anthropic.example/' }); expect(out.name).toBeUndefined(); - Network accessline 44
const out = extractBrand(html, { baseUrl: 'https://anthropic.example/' }); - Network accessline 57
<title>Build faster | Acme</title> `); const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 58
`); const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); expect(out.name).toBe('Acme'); - Network accessline 59
const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 68
const html = `<!doctype html><html><head><title>Build faster | Acme</title></head> <body><header><a href="/"><img src="/logo.svg" alt="Acme Corp"></a></header></body></html>`; const out = extractBrand(html, { baseUrl: 'https://acm - Network accessline 69
<body><header><a href="/"><img src="/logo.svg" alt="Acme Corp"></a></header></body></html>`; const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); expect(out.name).toBe('Acme Corp'); - Network accessline 70
const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 79
<title>The world's most powerful AI</title> `); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 80
`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.name).toBeUndefined(); - Network accessline 81
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 94
<title>FaviconOnly</title> `); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 95
`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.logo_url).toBeUndefined(); - Network accessline 96
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 97
expect(out.logo_url).toBeUndefined(); expect(out.favicon_url).toBe('https://x.example/favicon.svg'); expect(out.provenance?.logo).toBe('unknown'); - Network accessline 98
expect(out.favicon_url).toBe('https://x.example/favicon.svg'); - Network accessline 105
const html = wrap('<link rel="icon" href="/icon.png">'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 106
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 107
expect(out.favicon_url).toBe('https://x.example/icon.png'); - Network accessline 114
const html = wrap(` <script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg"} - Network accessline 115
<script type="application/ld+json"> {"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg"} </script> - Network accessline 116
{"@type":"Organization","name":"Acme","logo":"https://acme.example/logo.svg"} - Network accessline 118
<link rel="icon" href="/favicon.ico"> `); const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 119
`); const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); expect(out.logo_url).toBe('https://acme.example/logo.svg'); - Network accessline 120
const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 121
expect(out.logo_url).toBe('https://acme.example/logo.svg'); - Network accessline 122
expect(out.favicon_url).toBe('https://acme.example/favicon.ico'); - Network accessline 130
const html = wrap('<title>No icons declared</title>'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 131
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 132
expect(out.favicon_url).toBe('https://x.example/favicon.ico'); - Network accessline 147
{ html: wrap(`<script type="application/ld+json"> {"@type":"Organization","name":"A","logo":"https://a.example/l.svg"} - Network accessline 148
html: wrap(`<script type="application/ld+json"> {"@type":"Organization","name":"A","logo":"https://a.example/l.svg"} </script>`), - Network accessline 149
{"@type":"Organization","name":"A","logo":"https://a.example/l.svg"} - Network accessline 153
{ html: wrap(`<meta property="og:logo" content="https://a.example/l.svg"> - Network accessline 154
html: wrap(`<meta property="og:logo" content="https://a.example/l.svg"> - Network accessline 171
]; for (const c of cases) { const out = extractBrand(c.html, { baseUrl: 'https://a.example/' }); - Network accessline 172
for (const c of cases) { const out = extractBrand(c.html, { baseUrl: 'https://a.example/' }); const val = out.provenance?.logo; - Network accessline 173
const out = extractBrand(c.html, { baseUrl: 'https://a.example/' }); - Network accessline 186
]; for (const c of cases) { const out = extractBrand(c.html, { baseUrl: 'https://x.example/' }); - Network accessline 187
for (const c of cases) { const out = extractBrand(c.html, { baseUrl: 'https://x.example/' }); const val = out.provenance?.colors; - Network accessline 188
const out = extractBrand(c.html, { baseUrl: 'https://x.example/' }); - Network accessline 206
{ html: wrap( `<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter">`, - Network accessline 207
html: wrap( `<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter">`, ), - Network accessline 208
`<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter">`, - Network accessline 213
]; for (const c of cases) { const out = extractBrand(c.html, { baseUrl: 'https://x.example/' }); - Network accessline 214
for (const c of cases) { const out = extractBrand(c.html, { baseUrl: 'https://x.example/' }); const val = out.provenance?.fonts; - Network accessline 215
const out = extractBrand(c.html, { baseUrl: 'https://x.example/' });
tests/unit/extraction/brand-palette.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/brand.test.ts
- Executable scriptline 1
Executable file - Network accessline 29
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 30
{ "@context": "https://schema.org", "@type": "Organization", - Network accessline 31
"@context": "https://schema.org", - Network accessline 33
"name": "Acme", "description": "We make widgets.", "logo": "https://acme.example/logo.svg", - Network accessline 34
"description": "We make widgets.", "logo": "https://acme.example/logo.svg", "sameAs": ["https://twitter.com/acme"] - Network accessline 35
"logo": "https://acme.example/logo.svg", - Network accessline 36
"sameAs": ["https://twitter.com/acme"] - Network accessline 38
</script> `); const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 39
`); const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); expect(out.name).toBe('Acme'); - Network accessline 40
const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 41
expect(out.name).toBe('Acme'); expect(out.description).toBe('We make widgets.'); expect(out.logo_url).toBe('https://acme.example/logo.svg'); - Network accessline 42
expect(out.description).toBe('We make widgets.'); expect(out.logo_url).toBe('https://acme.example/logo.svg'); expect(out.provenance?.logo).toBe('json-ld'); - Network accessline 43
expect(out.logo_url).toBe('https://acme.example/logo.svg'); - Network accessline 44
expect(out.provenance?.logo).toBe('json-ld'); expect(out.social_links?.twitter).toBe('https://twitter.com/acme'); }); - Network accessline 45
expect(out.social_links?.twitter).toBe('https://twitter.com/acme'); - Network accessline 53
<script type="application/ld+json"> { "@context": "https://schema.org", - Network accessline 54
{ "@context": "https://schema.org", "@graph": [ - Network accessline 55
"@context": "https://schema.org", - Network accessline 59
"@type": "Organization", "name": "Deep Brand", "logo": { "@type": "ImageObject", "url": "https://x.example/l.png" } - Network accessline 60
"name": "Deep Brand", "logo": { "@type": "ImageObject", "url": "https://x.example/l.png" } } - Network accessline 61
"logo": { "@type": "ImageObject", "url": "https://x.example/l.png" } - Network accessline 65
</script> `); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 66
`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.name).toBe('Deep Brand'); - Network accessline 67
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 68
expect(out.name).toBe('Deep Brand'); expect(out.logo_url).toBe('https://x.example/l.png'); expect(out.provenance?.logo).toBe('json-ld'); - Network accessline 69
expect(out.logo_url).toBe('https://x.example/l.png'); - Network accessline 77
"@type": "Brand", "name": "B", "logo": { "@type": "ImageObject", "contentUrl": "https://b.example/c.png" } - Network accessline 78
"name": "B", "logo": { "@type": "ImageObject", "contentUrl": "https://b.example/c.png" } } - Network accessline 79
"logo": { "@type": "ImageObject", "contentUrl": "https://b.example/c.png" } - Network accessline 81
</script> `); const out = extractBrand(html, { baseUrl: 'https://b.example/' }); - Network accessline 82
`); const out = extractBrand(html, { baseUrl: 'https://b.example/' }); expect(out.logo_url).toBe('https://b.example/c.png'); - Network accessline 83
const out = extractBrand(html, { baseUrl: 'https://b.example/' }); - Network accessline 84
expect(out.logo_url).toBe('https://b.example/c.png'); - Network accessline 91
<meta property="og:site_name" content="OGOnly"> <meta property="og:description" content="OG-supplied description."> <meta property="og:image" content="https://ogonly.example/hero.png"> - Network accessline 92
<meta property="og:description" content="OG-supplied description."> <meta property="og:image" content="https://ogonly.example/hero.png"> <meta name="twitter:site" content="@ogonly"> - Network accessline 93
<meta property="og:image" content="https://ogonly.example/hero.png"> - Network accessline 94
<meta name="twitter:site" content="@ogonly"> `); const out = extractBrand(html, { baseUrl: 'https://ogonly.example/' }); - Network accessline 95
`); const out = extractBrand(html, { baseUrl: 'https://ogonly.example/' }); expect(out.name).toBe('OGOnly'); - Network accessline 96
const out = extractBrand(html, { baseUrl: 'https://ogonly.example/' }); - Network accessline 97
expect(out.name).toBe('OGOnly'); expect(out.description).toBe('OG-supplied description.'); expect(out.og_image_url).toBe('https://ogonly.example/hero.png'); - Network accessline 99
expect(out.og_image_url).toBe('https://ogonly.example/hero.png'); - Network accessline 102
expect(out.social_links?.twitter).toBe('https://twitter.com/ogonly'); - Network accessline 106
const html = wrap(` <meta property="og:site_name" content="WithOgLogo"> <meta property="og:logo" content="https://wol.example/brand.svg"> - Network accessline 107
<meta property="og:site_name" content="WithOgLogo"> <meta property="og:logo" content="https://wol.example/brand.svg"> `); - Network accessline 108
<meta property="og:logo" content="https://wol.example/brand.svg"> - Network accessline 109
`); const out = extractBrand(html, { baseUrl: 'https://wol.example/' }); expect(out.logo_url).toBe('https://wol.example/brand.svg'); - Network accessline 110
const out = extractBrand(html, { baseUrl: 'https://wol.example/' }); - Network accessline 111
expect(out.logo_url).toBe('https://wol.example/brand.svg'); - Network accessline 115
it('falls back to twitter:image and og:image:secure_url for og_image_url', () => { const html = wrap(` <meta property="og:image:secure_url" content="https://secure.example/img.png"> - Network accessline 116
const html = wrap( <meta property="og:image:secure_url" content="https://secure.example/img.png"> - Network accessline 117
<meta property="og:image:secure_url" content="https://secure.example/img.png"> - Network accessline 118
<meta name="twitter:image" content="https://tw.example/img.png"> - Network accessline 120
const out = extractBrand(html, { baseUrl: 'https://example.com/' }); - Network accessline 123
expect(out.og_image_url).toBe('https://secure.example/img.png'); - Network accessline 136
<link rel="apple-touch-icon" href="/apple-touch.png"> `); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 137
`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.favicon_url).toBe('https://x.example/favicon.svg'); - Network accessline 138
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 139
expect(out.favicon_url).toBe('https://x.example/favicon.svg'); - Network accessline 142
it('falls back to /favicon.ico when nothing is declared but a base URL exists', () => { const html = wrap('<title>No icons</title>'); const out = extractBrand(html, { baseUrl: 'https://noicons.example/path/page' }); - Network accessline 143
const html = wrap('<title>No icons</title>'); const out = extractBrand(html, { baseUrl: 'https://noicons.example/path/page' }); expect(out.favicon_url).toBe('https://noicons.example/favicon.ico'); - Network accessline 144
const out = extractBrand(html, { baseUrl: 'https://noicons.example/path/page' }); - Network accessline 145
expect(out.favicon_url).toBe('https://noicons.example/favicon.ico'); - Network accessline 154
it('uses apple-touch-icon as favicon when no other icon is declared', () => { const html = wrap('<link rel="apple-touch-icon" href="/at.png">'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 155
const html = wrap('<link rel="apple-touch-icon" href="/at.png">'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.favicon_url).toBe('https://x.example/at.png'); - Network accessline 156
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 157
expect(out.favicon_url).toBe('https://x.example/at.png'); - Network accessline 168
</header> </body></html>`; const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 169
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); expect(out.logo_url).toBe('https://acme.example/img/logo.svg'); - Network accessline 170
const out = extractBrand(html, { baseUrl: 'https://acme.example/' }); - Network accessline 171
expect(out.logo_url).toBe('https://acme.example/img/logo.svg'); - Network accessline 179
const html = `<!doctype html><html><head> <script type="application/ld+json">{"@type":"Organization","name":"A","logo":"https://a.example/from-jsonld.svg"}</script> - Network accessline 180
<script type="application/ld+json">{"@type":"Organization","name":"A","logo":"https://a.example/from-jsonld.svg"}</script> - Network accessline 182
<header><a href="/"><img src="/img/from-dom.svg" alt="A"></a></header> </body></html>`; const out = extractBrand(html, { baseUrl: 'https://a.example/' }); - Network accessline 183
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://a.example/' }); expect(out.logo_url).toBe('https://a.example/from-jsonld.svg'); - Network accessline 184
const out = extractBrand(html, { baseUrl: 'https://a.example/' }); - Network accessline 185
expect(out.logo_url).toBe('https://a.example/from-jsonld.svg'); - Network accessline 196
<title>FaviconOnly</title> `); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 197
`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.logo_url).toBeUndefined(); - Network accessline 198
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 199
expect(out.logo_url).toBeUndefined(); expect(out.favicon_url).toBe('https://x.example/favicon.svg'); expect(out.provenance?.logo).toBe('unknown'); - Network accessline 200
expect(out.favicon_url).toBe('https://x.example/favicon.svg'); - Network accessline 205
describe('extractBrand — social links', () => { it('canonicalizes a footer Twitter link to https://twitter.com/{handle}', () => { - Network accessline 206
it('canonicalizes a footer Twitter link to https://twitter.com/{handle}', () => { - Network accessline 207
const html = `<!doctype html><html><head></head><body> <footer><a href="https://twitter.com/myhandle?utm=foo">Twitter</a></footer> </body></html>`; - Network accessline 208
<footer><a href="https://twitter.com/myhandle?utm=foo">Twitter</a></footer> - Network accessline 209
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.social_links?.twitter).toBe('https://twitter.com/myhandle'); - Network accessline 210
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 211
expect(out.social_links?.twitter).toBe('https://twitter.com/myhandle'); - Network accessline 217
const html = `<!doctype html><html><head></head><body> <footer><a href="https://x.com/somebrand">X</a></footer> - Network accessline 218
<footer><a href="https://x.com/somebrand">X</a></footer> - Network accessline 219
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.social_links?.twitter).toBe('https://twitter.com/somebrand'); - Network accessline 220
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 221
expect(out.social_links?.twitter).toBe('https://twitter.com/somebrand'); - Network accessline 224
it('extracts company-style and personal LinkedIn URLs', () => { const html = `<!doctype html><html><head></head><body> <a href="https://www.linkedin.com/company/acme-inc">LinkedIn</a> - Network accessline 225
const html = `<!doctype html><html><head></head><body> <a href="https://www.linkedin.com/company/acme-inc">LinkedIn</a> </body></html>`; - Network accessline 226
<a href="https://www.linkedin.com/company/acme-inc">LinkedIn</a> - Network accessline 227
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.social_links?.linkedin).toContain('linkedin.com/company/acme-inc'); - Network accessline 228
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 236
"@type":"Organization", "name":"A", "sameAs":["https://twitter.com/fromld","https://github.com/fromld"] - Network accessline 237
"name":"A", "sameAs":["https://twitter.com/fromld","https://github.com/fromld"] } - Network accessline 238
"sameAs":["https://twitter.com/fromld","https://github.com/fromld"] - Network accessline 240
</script> `); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 241
`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.social_links?.twitter).toBe('https://twitter.com/fromld'); - Network accessline 242
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 243
expect(out.social_links?.twitter).toBe('https://twitter.com/fromld'); - Network accessline 244
expect(out.social_links?.github).toBe('https://github.com/fromld'); - Network accessline 247
it('derives a Twitter URL from twitter:site meta when no anchor exists', () => { const html = wrap('<meta name="twitter:site" content="@onlymeta">'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 248
const html = wrap('<meta name="twitter:site" content="@onlymeta">'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.social_links?.twitter).toBe('https://twitter.com/onlymeta'); - Network accessline 249
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 250
expect(out.social_links?.twitter).toBe('https://twitter.com/onlymeta'); - Network accessline 259
<meta name="twitter:site" content="@frommeta"> </head><body> <footer><a href="https://twitter.com/fromanchor">Twitter</a></footer> - Network accessline 260
</head><body> <footer><a href="https://twitter.com/fromanchor">Twitter</a></footer> </body></html>`; - Network accessline 261
<footer><a href="https://twitter.com/fromanchor">Twitter</a></footer> - Network accessline 262
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.social_links?.twitter).toBe('https://twitter.com/fromanchor'); - Network accessline 263
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 264
expect(out.social_links?.twitter).toBe('https://twitter.com/fromanchor'); - Network accessline 269
it('extracts the value of --brand-primary as a normalized hex', () => { const html = wrap(`<style>:root { --brand-primary: #635BFF; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 270
const html = wrap(`<style>:root { --brand-primary: #635BFF; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.primary_colors).toContain('#635bff'); - Network accessline 271
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 281
} </style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 283
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 294
const html = wrap(`<style>:root { --primary: 240 5.9% 10%; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 295
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 309
} </style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 310
</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.primary_colors).toBeUndefined(); - Network accessline 311
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 321
const html = wrap('<title>no css vars</title>'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 322
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 332
--font-body: "Sohne", system-ui, sans-serif; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 333
}</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.headings).toContain('Camphor'); - Network accessline 334
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 348
h1, h2 { font-family: "Inter Display", Inter, sans-serif; } </style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 349
</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.body).toContain('Inter'); - Network accessline 350
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 359
const html = wrap(`<style>:root { --font-body: sans-serif, system-ui, "Helvetica Neue"; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 360
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 371
'<h1 style="font-family: \'Whyte\', sans-serif;">Headline</h1>', ); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 372
); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.headings).toContain('Whyte'); - Network accessline 373
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 382
'<!doctype html><html><head></head>' + '<body style="font-family: \'Söhne\', sans-serif;">x</body></html>'; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 383
'<body style="font-family: \'Söhne\', sans-serif;">x</body></html>'; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.body).toContain('Söhne'); - Network accessline 384
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 393
const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap">', - Network accessline 394
'<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap">', - Network accessline 396
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 404
it('extracts multiple families from a Google Fonts <link> with family=A&family=B', () => { const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Inter:wght@400;5 - Network accessline 405
const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Inter:wght@400;500&display=swap">', ); - Network accessline 406
'<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Inter:wght@400;500&display=swap">', - Network accessline 408
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 417
it('handles the legacy Google Fonts css endpoint (family=Inter:400,700)', () => { const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:400,700">', - Network accessline 418
const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:400,700">', ); - Network accessline 419
'<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:400,700">', - Network accessline 420
); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.body).toContain('Inter'); - Network accessline 421
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 431
`<style>:root { --font-body: "Sohne", sans-serif; } body { font-family: "Should Lose", sans-serif; }</style> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Should+Also+Lose&display=swap">`, - Network accessline 432
body { font-family: "Should Lose", sans-serif; }</style> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Should+Also+Lose&display=swap">`, '<body style="font-family: \'Should Lose Too\', sans-serif;"></bod - Network accessline 433
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Should+Also+Lose&display=swap">`, - Network accessline 434
'<body style="font-family: \'Should Lose Too\', sans-serif;"></body>', ); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 435
); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.body).toContain('Sohne'); - Network accessline 436
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 447
'<body style="font-family: \'Wrong\', sans-serif;"></body>', ); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 448
); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.body).toContain('Inter'); - Network accessline 449
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 455
it('inline-style wins over Google Fonts <link> when CSS-rule misses', () => { const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Should+Lose&display=swap">', - Network accessline 456
const html = wrap( '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Should+Lose&display=swap">', '<h1 style="font-family: \'Whyte\', sans-serif;">x</h1>', - Network accessline 457
'<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Should+Lose&display=swap">', - Network accessline 458
'<h1 style="font-family: \'Whyte\', sans-serif;">x</h1>', ); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 459
); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.headings).toContain('Whyte'); - Network accessline 460
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 466
it('returns fonts undefined and provenance "unknown" when no source fires', () => { const html = wrap('<title>no fonts</title>'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 467
const html = wrap('<title>no fonts</title>'); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts).toBeUndefined(); - Network accessline 468
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 476
const html = wrap(`<style>body { font-family: sans-serif; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 477
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 482
it('strips generic families from CSS-rule output (sans-serif from "Inter, sans-serif")', () => { const html = wrap(`<style>body { font-family: "Inter", sans-serif, system-ui; }</style>`); const out = extractBrand(html, { baseUrl: 'h - Network accessline 483
const html = wrap(`<style>body { font-family: "Inter", sans-serif, system-ui; }</style>`); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts?.body).toContain('Inter'); - Network accessline 484
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 493
const html = wrap( '<link rel="stylesheet" href="https://cdn.example/app.css?family=NotAFont">', - Network accessline 494
'<link rel="stylesheet" href="https://cdn.example/app.css?family=NotAFont">', - Network accessline 495
); const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.fonts).toBeUndefined(); - Network accessline 496
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 513
<header><a href="/"><img src="javascript:alert(2)" alt="X"></a></header> </body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 514
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.logo_url ?? '').not.toMatch(/^javascript:/); - Network accessline 515
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 528
<header><a href="/"><img src="file:///etc/shadow" alt="X"></a></header> </body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 529
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.logo_url ?? '').not.toMatch(/^file:/i); - Network accessline 530
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 543
<header><a href="/"><img src="vbscript:msgbox(3)" alt="X"></a></header> </body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 544
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.logo_url ?? '').not.toMatch(/^vbscript:/i); - Network accessline 545
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 554
const html = `<!doctype html><html><head> <link rel="icon" href="blob:https://x.example/abc-123"> - Network accessline 555
<link rel="icon" href="blob:https://x.example/abc-123"> - Network accessline 556
<meta property="og:image" content="blob:https://x.example/def-456"> - Network accessline 557
</head><body> <header><a href="/"><img src="blob:https://x.example/ghi-789" alt="X"></a></header> </body></html>`; - Network accessline 558
<header><a href="/"><img src="blob:https://x.example/ghi-789" alt="X"></a></header> - Network accessline 559
</body></html>`; const out = extractBrand(html, { baseUrl: 'https://x.example/' }); expect(out.logo_url ?? '').not.toMatch(/^blob:/i); - Network accessline 560
const out = extractBrand(html, { baseUrl: 'https://x.example/' }); - Network accessline 569
<script type="application/ld+json">{"@type":"Organization","name":"R","logo":"./logo.svg"}</script> `); const out = extractBrand(html, { baseUrl: 'https://r.example/sub/page' }); - Network accessline 570
`); const out = extractBrand(html, { baseUrl: 'https://r.example/sub/page' }); expect(out.favicon_url).toBe('https://r.example/icon.svg'); - Network accessline 571
const out = extractBrand(html, { baseUrl: 'https://r.example/sub/page' }); - Network accessline 572
expect(out.favicon_url).toBe('https://r.example/icon.svg'); - Network accessline 573
expect(out.logo_url).toBe('https://r.example/sub/logo.svg'); - Network accessline 602
it('categorizes a github.com URL as github', () => { const cat = __internal.categorizeSocial('https://github.com/acme'); - Network accessline 603
const cat = __internal.categorizeSocial('https://github.com/acme'); - Network accessline 604
expect(cat?.key).toBe('github'); expect(cat?.canonical).toBe('https://github.com/acme'); }); - Network accessline 605
expect(cat?.canonical).toBe('https://github.com/acme'); - Network accessline 608
it('categorizes x.com URL as twitter (handle-preserving)', () => { const cat = __internal.categorizeSocial('https://x.com/acme'); - Network accessline 609
const cat = __internal.categorizeSocial('https://x.com/acme'); - Network accessline 610
expect(cat?.key).toBe('twitter'); expect(cat?.canonical).toBe('https://twitter.com/acme'); }); - Network accessline 611
expect(cat?.canonical).toBe('https://twitter.com/acme');
tests/unit/extraction/content-root.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/defuddle.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
describe('defuddleExtract', () => { const url = 'https://example.com/blog/web-scraping'; - Network accessline 10
const url = 'https://example.com/blog/web-scraping'; - Network accessline 50
it('extracts content from pages with tables', async () => { const html = loadFixture('tables.html'); const result = await defuddleExtract(html, 'https://example.com/report'); - Network accessline 51
const html = loadFixture('tables.html'); const result = await defuddleExtract(html, 'https://example.com/report'); expect(result).not.toBeNull(); - Network accessline 52
const result = await defuddleExtract(html, 'https://example.com/report'); - Network accessline 57
it('extracts content from pages with code blocks', async () => { const html = loadFixture('code-blocks.html'); const result = await defuddleExtract(html, 'https://example.com/tutorial'); - Network accessline 58
const html = loadFixture('code-blocks.html'); const result = await defuddleExtract(html, 'https://example.com/tutorial'); expect(result).not.toBeNull(); - Network accessline 59
const result = await defuddleExtract(html, 'https://example.com/tutorial'); - Network accessline 94
</article> </body></html>`; const result = await defuddleExtract(html, 'https://example.com/code'); - Network accessline 95
</body></html>`; const result = await defuddleExtract(html, 'https://example.com/code'); expect(result).not.toBeNull(); - Network accessline 96
const result = await defuddleExtract(html, 'https://example.com/code');
tests/unit/extraction/extract.test.ts
- Executable scriptline 1
Executable file - Network accessline 58
it('extracts og:image', () => { const html = '<html><head><meta property="og:image" content="https://example.com/img.png"></head><body></body></html>'; - Network accessline 59
const html = '<html><head><meta property="og:image" content="https://example.com/img.png"></head><body></body></html>'; - Network accessline 60
const result = extractMetadata(html); expect(result.og_image).toBe('https://example.com/img.png'); }); - Network accessline 61
expect(result.og_image).toBe('https://example.com/img.png'); - Network accessline 75
const html = '<html><head><meta name="twitter:image" content="https://example.com/tw.png"></head><body></body></html>'; - Network accessline 76
const result = extractMetadata(html); expect(result.og_image).toBe('https://example.com/tw.png'); }); - Network accessline 77
expect(result.og_image).toBe('https://example.com/tw.png'); - Network accessline 80
it('prefers og:image over twitter:image when both present', () => { const html = `<html><head> <meta property="og:image" content="https://example.com/og.png"> - Network accessline 81
const html = `<html><head> <meta property="og:image" content="https://example.com/og.png"> <meta name="twitter:image" content="https://example.com/tw.png"> - Network accessline 82
<meta property="og:image" content="https://example.com/og.png"> - Network accessline 83
<meta name="twitter:image" content="https://example.com/tw.png"> - Network accessline 84
</head><body></body></html>`; const result = extractMetadata(html); expect(result.og_image).toBe('https://example.com/og.png'); - Network accessline 85
const result = extractMetadata(html); expect(result.og_image).toBe('https://example.com/og.png'); }); - Network accessline 86
expect(result.og_image).toBe('https://example.com/og.png'); - Network accessline 89
it('falls back to og:image:secure_url when og:image missing', () => { const html = '<html><head><meta property="og:image:secure_url" content="https://example.com/secure.png"></head><body></body></html>'; - Network accessline 90
const html = '<html><head><meta property="og:image:secure_url" content="https://example.com/secure.png"></head><body></body></html>'; - Network accessline 91
const result = extractMetadata(html); expect(result.og_image).toBe('https://example.com/secure.png'); }); - Network accessline 92
expect(result.og_image).toBe('https://example.com/secure.png'); - Network accessline 95
it('extracts canonical url from link[rel=canonical]', () => { const html = '<html><head><link rel="canonical" href="https://example.com/page"></head><body></body></html>'; - Network accessline 96
const html = '<html><head><link rel="canonical" href="https://example.com/page"></head><body></body></html>'; - Network accessline 97
const result = extractMetadata(html); expect(result.canonical_url).toBe('https://example.com/page'); }); - Network accessline 98
expect(result.canonical_url).toBe('https://example.com/page'); - Network accessline 114
<meta name="date" content="2025-01-01"> <meta name="keywords" content="a, b, c"> <meta property="og:image" content="https://example.com/full.png"> - Network accessline 115
<meta name="keywords" content="a, b, c"> <meta property="og:image" content="https://example.com/full.png"> </head><body></body></html>`; - Network accessline 116
<meta property="og:image" content="https://example.com/full.png"> - Network accessline 123
date: '2025-01-01', keywords: ['a', 'b', 'c'], og_image: 'https://example.com/full.png', - Network accessline 124
keywords: ['a', 'b', 'c'], og_image: 'https://example.com/full.png', }); - Network accessline 125
og_image: 'https://example.com/full.png', - Network accessline 520
<td class="title"><span class="rank">${rank}.</span></td> <td class="votelinks"><center><a href="vote?id=${id}"><div class="votearrow"></div></a></center></td> <td class="title"><span class="titleline"><a href="https://${site}/a - Network accessline 521
<td class="votelinks"><center><a href="vote?id=${id}"><div class="votearrow"></div></a></center></td> <td class="title"><span class="titleline"><a href="https://${site}/a/${id}">${title}</a><span class="sitebit comhead"> (<a href="fro - Network accessline 522
<td class="title"><span class="titleline"><a href="https://${site}/a/${id}">${title}</a><span class="sitebit comhead"> (<a href="from?site=${site}"><span class="sitestr">${site}</span></a>)</span></span></td>
tests/unit/extraction/interleaved-binding.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/jsonld.test.ts
- Executable scriptline 1
Executable file - Network accessline 70
const html = `<html><head> <script type="application/ld+json">{ "@context": "https://schema.org", - Network accessline 71
<script type="application/ld+json">{ "@context": "https://schema.org", "@graph": [ - Network accessline 72
"@context": "https://schema.org",
tests/unit/extraction/lang-hints.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/list-detector.test.ts
- Executable scriptline 1
Executable file - Network accessline 29
it('captures the anchor href of each list item', () => { const html = `<html><body><ul class="results"> <li><a href="https://example.com/a">Alpha article</a> <span>10 votes</span></li> - Network accessline 30
const html = `<html><body><ul class="results"> <li><a href="https://example.com/a">Alpha article</a> <span>10 votes</span></li> <li><a href="https://example.com/b">Beta article</a> <span>20 votes</span></li> - Network accessline 31
<li><a href="https://example.com/a">Alpha article</a> <span>10 votes</span></li> - Network accessline 32
<li><a href="https://example.com/b">Beta article</a> <span>20 votes</span></li> - Network accessline 33
<li><a href="https://example.com/c">Gamma article</a> <span>30 votes</span></li> - Network accessline 38
const hrefs = tables[0].rows.map((r) => r.href); expect(hrefs).toEqual([ 'https://example.com/a', - Network accessline 39
expect(hrefs).toEqual([ 'https://example.com/a', 'https://example.com/b', - Network accessline 40
'https://example.com/a', - Network accessline 41
'https://example.com/b', - Network accessline 42
'https://example.com/c',
tests/unit/extraction/listing-vs-grid-regression.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm-fallback.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted] - Access to secretsline 130
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted] - Access to secretsline 182
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 207
[Credential-related source omitted] - Access to secretsline 227
[Credential-related source omitted]
tests/unit/extraction/llm/anthropic.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm/cache.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm/gemini.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm/groq.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm/hash.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm/openai.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/llm/select.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Access to secretsline 95
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted]
tests/unit/extraction/llm/types.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/markdown-sanitize.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/markdown.test.ts
- Executable scriptline 1
Executable file - Network accessline 70
it('converts links', () => { const html = '<a href="https://example.com">Example</a>'; - Network accessline 71
const html = '<a href="https://example.com">Example</a>'; - Network accessline 72
const result = htmlToMarkdown(html); expect(result).toContain('[Example](https://example.com)'); }); - Network accessline 73
expect(result).toContain('[Example](https://example.com)'); - Network accessline 76
it('converts images', () => { const html = '<img src="https://example.com/img.png" alt="Image">'; - Network accessline 77
const html = '<img src="https://example.com/img.png" alt="Image">'; - Network accessline 78
const result = htmlToMarkdown(html); expect(result).toContain(''); }); - Network accessline 79
expect(result).toContain(''); - Network accessline 242
describe('extractLinksAndImages', () => { it('extracts links from markdown', () => { const md = 'See [Google](https://google.com) and [GitHub](https://github.com)'; - Network accessline 243
it('extracts links from markdown', () => { const md = 'See [Google](https://google.com) and [GitHub](https://github.com)'; const result = extractLinksAndImages(md); - Network accessline 244
const md = 'See [Google](https://google.com) and [GitHub](https://github.com)'; - Network accessline 245
const result = extractLinksAndImages(md); expect(result.links).toContain('https://google.com'); expect(result.links).toContain('https://github.com'); - Network accessline 246
expect(result.links).toContain('https://google.com'); - Network accessline 247
expect(result.links).toContain('https://github.com'); - Network accessline 251
it('extracts images from markdown', () => { const md = ' and '; - Network accessline 252
const md = ' and '; - Network accessline 253
const result = extractLinksAndImages(md); expect(result.images).toContain('https://example.com/logo.png'); expect(result.images).toContain('https://example.com/banner.png'); - Network accessline 254
expect(result.images).toContain('https://example.com/logo.png'); - Network accessline 255
expect(result.images).toContain('https://example.com/banner.png'); - Network accessline 259
it('does not include image URLs in links array', () => { const md = ' [Link](https://example.com/page)'; - Network accessline 260
const md = ' [Link](https://example.com/page)'; - Network accessline 261
const result = extractLinksAndImages(md); expect(result.links).not.toContain('https://example.com/img.png'); expect(result.links).toContain('https://example.com/page'); - Network accessline 262
expect(result.links).not.toContain('https://example.com/img.png'); - Network accessline 263
expect(result.links).toContain('https://example.com/page'); - Network accessline 266
it('deduplicates URLs', () => { const md = '[A](https://example.com) [B](https://example.com)'; - Network accessline 267
const md = '[A](https://example.com) [B](https://example.com)'; - Network accessline 268
const result = extractLinksAndImages(md); expect(result.links.filter(l => l === 'https://example.com')).toHaveLength(1); }); - Network accessline 269
expect(result.links.filter(l => l === 'https://example.com')).toHaveLength(1); - Network accessline 272
it('deduplicates image URLs', () => { const md = ' '; - Network accessline 273
const md = ' '; - Network accessline 274
const result = extractLinksAndImages(md); expect(result.images.filter(i => i === 'https://example.com/img.png')).toHaveLength(1); }); - Network accessline 275
expect(result.images.filter(i => i === 'https://example.com/img.png')).toHaveLength(1); - Network accessline 291
it('returns separate arrays for links and images', () => { const md = '[Link](https://link.com) '; - Network accessline 292
const md = '[Link](https://link.com) '; - Network accessline 293
const result = extractLinksAndImages(md); expect(result.links).toContain('https://link.com'); expect(result.images).toContain('https://img.com/a.png'); - Network accessline 294
expect(result.links).toContain('https://link.com'); - Network accessline 295
expect(result.images).toContain('https://img.com/a.png'); - Network accessline 296
expect(result.links).not.toContain('https://img.com/a.png'); - Network accessline 297
expect(result.images).not.toContain('https://link.com'); - Network accessline 301
describe('filterDecorativeImages', () => { it('drops images with no alt text', () => { const md = 'Before  after'; - Network accessline 302
it('drops images with no alt text', () => { const md = 'Before  after'; expect(filterDecorativeImages(md)).toBe('Before after'); - Network accessline 303
const md = 'Before  after'; - Network accessline 307
it('keeps images with meaningful alt text', () => { const md = ''; - Network accessline 308
const md = ''; - Network accessline 312
it('drops avatar/icon/logo/tracking marked urls even with alt', () => { const md = [ '', - Network accessline 313
const md = [ '', '', - Network accessline 314
'', - Network accessline 315
'', - Network accessline 316
'', - Network accessline 317
'', - Network accessline 318
'', - Network accessline 333
it('preserves non-image markdown and text around images', () => { const md = 'Leading text  trailing'; - Network accessline 334
const md = 'Leading text  trailing'; - Network accessline 340
it('resolves relative link paths against the base url', () => { const md = 'See [Docs](/guide/index.html) and [FAQ](../faq.html)'; const resolved = resolveRelativeUrls(md, 'https://astro.build/v2/getting-started/'); - Network accessline 341
const md = 'See [Docs](/guide/index.html) and [FAQ](../faq.html)'; const resolved = resolveRelativeUrls(md, 'https://astro.build/v2/getting-started/'); expect(resolved).toContain('https://astro.build/guide/index.html'); - Network accessline 342
const resolved = resolveRelativeUrls(md, 'https://astro.build/v2/getting-started/'); - Network accessline 343
expect(resolved).toContain('https://astro.build/guide/index.html'); - Network accessline 344
expect(resolved).toContain('https://astro.build/v2/faq.html'); - Network accessline 347
it('leaves absolute urls unchanged', () => { const md = '[Abs](https://example.com/page) and [Mail](mailto:a@b.com)'; - Network accessline 348
const md = '[Abs](https://example.com/page) and [Mail](mailto:a@b.com)'; - Network accessline 349
expect(resolveRelativeUrls(md, 'https://foo.com/')).toBe(md); - Network accessline 352
it('resolves fragment-only links against the base url', () => { const md = '[Top](#toc)'; expect(resolveRelativeUrls(md, 'https://x.com/page')).toBe('[Top](https://x.com/page#toc)'); - Network accessline 353
const md = '[Top](#toc)'; expect(resolveRelativeUrls(md, 'https://x.com/page')).toBe('[Top](https://x.com/page#toc)'); }); - Network accessline 354
expect(resolveRelativeUrls(md, 'https://x.com/page')).toBe('[Top](https://x.com/page#toc)'); - Network accessline 357
it('resolves bare fragment anchors to absolute urls', () => { const md = '[See logs](#logs)'; expect(resolveRelativeUrls(md, 'https://react.dev/learn/managing-state')).toBe( - Network accessline 358
const md = '[See logs](#logs)'; expect(resolveRelativeUrls(md, 'https://react.dev/learn/managing-state')).toBe( '[See logs](https://react.dev/learn/managing-state#logs)', - Network accessline 359
expect(resolveRelativeUrls(md, 'https://react.dev/learn/managing-state')).toBe( - Network accessline 360
'[See logs](https://react.dev/learn/managing-state#logs)', - Network accessline 364
it('resolves relative path with fragment', () => { const md = '[Other](./effects#cleanup)'; expect(resolveRelativeUrls(md, 'https://react.dev/learn/managing-state')).toBe( - Network accessline 365
const md = '[Other](./effects#cleanup)'; expect(resolveRelativeUrls(md, 'https://react.dev/learn/managing-state')).toBe( '[Other](https://react.dev/learn/effects#cleanup)', - Network accessline 366
expect(resolveRelativeUrls(md, 'https://react.dev/learn/managing-state')).toBe( - Network accessline 367
'[Other](https://react.dev/learn/effects#cleanup)', - Network accessline 371
it('resolves query+fragment relative links', () => { const md = '[Same path](?tab=usage#a)'; expect(resolveRelativeUrls(md, 'https://x.com/y')).toBe( - Network accessline 372
const md = '[Same path](?tab=usage#a)'; expect(resolveRelativeUrls(md, 'https://x.com/y')).toBe( '[Same path](https://x.com/y?tab=usage#a)', - Network accessline 373
expect(resolveRelativeUrls(md, 'https://x.com/y')).toBe( - Network accessline 374
'[Same path](https://x.com/y?tab=usage#a)', - Network accessline 378
it('resolves relative image sources', () => { const md = ''; expect(resolveRelativeUrls(md, 'https://example.com/docs/intro')).toContain( - Network accessline 379
const md = ''; expect(resolveRelativeUrls(md, 'https://example.com/docs/intro')).toContain( 'https://example.com/assets/diagram.png', - Network accessline 380
expect(resolveRelativeUrls(md, 'https://example.com/docs/intro')).toContain( - Network accessline 381
'https://example.com/assets/diagram.png', - Network accessline 385
it('resolves protocol-relative urls', () => { const md = '[CDN](//cdn.example.com/foo)'; expect(resolveRelativeUrls(md, 'https://site.com/')).toContain('https://cdn.example.com/foo'); - Network accessline 386
const md = '[CDN](//cdn.example.com/foo)'; expect(resolveRelativeUrls(md, 'https://site.com/')).toContain('https://cdn.example.com/foo'); }); - Network accessline 387
expect(resolveRelativeUrls(md, 'https://site.com/')).toContain('https://cdn.example.com/foo');
tests/unit/extraction/readability.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
describe('readabilityExtract', () => { const url = 'https://example.com/blog/web-scraping'; - Network accessline 10
const url = 'https://example.com/blog/web-scraping'; - Network accessline 50
it('extracts content from pages with tables', () => { const html = loadFixture('tables.html'); const result = readabilityExtract(html, 'https://example.com/report'); - Network accessline 51
const html = loadFixture('tables.html'); const result = readabilityExtract(html, 'https://example.com/report'); expect(result).not.toBeNull(); - Network accessline 52
const result = readabilityExtract(html, 'https://example.com/report'); - Network accessline 57
it('extracts content from pages with code blocks', () => { const html = loadFixture('code-blocks.html'); const result = readabilityExtract(html, 'https://example.com/tutorial'); - Network accessline 58
const html = loadFixture('code-blocks.html'); const result = readabilityExtract(html, 'https://example.com/tutorial'); expect(result).not.toBeNull(); - Network accessline 59
const result = readabilityExtract(html, 'https://example.com/tutorial');
tests/unit/extraction/schema-confidence.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/schema-evidence-only.test.ts
tests/unit/extraction/schema-truth-perf.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/schema.test.ts
- Executable scriptline 1
Executable file - Network accessline 159
it('handles nested microdata with itemprop on child elements', () => { const html = ` <div itemscope itemtype="https://schema.org/Product"> - Network accessline 160
const html = <div itemscope itemtype="https://schema.org/Product"> - Network accessline 161
<div itemscope itemtype="https://schema.org/Product"> - Network accessline 162
<span itemprop="name">Gadget</span> <div itemprop="offers" itemscope itemtype="https://schema.org/Offer"> <span itemprop="price" content="15.00">$15.00</span> - Network accessline 163
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer"> - Network accessline 296
it('marks fields sourced from microdata-only HTML as microdata', () => { const html = '<html><body><div itemscope itemtype="https://schema.org/Product"><span itemprop="name">Foo</span></div></body></html>'; - Network accessline 297
const html = '<html><body><div itemscope itemtype="https://schema.org/Product"><span itemprop="name">Foo</span></div></body></html>'; - Network accessline 409
it('prefers JSON-LD/microdata over structure fuzzy-match when both present', () => { const html = `<html><body> <div itemscope itemtype="https://schema.org/Product"> - Network accessline 410
const html = `<html><body> <div itemscope itemtype="https://schema.org/Product"> <span itemprop="price">$10</span> - Network accessline 411
<div itemscope itemtype="https://schema.org/Product">
tests/unit/extraction/site-extractors/amazon.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
describe('amazonExtractor.canHandle', () => { it('matches amazon.com product URLs because Amazon products live under /dp/<asin>/', () => { expect(amazonExtractor.canHandle('https://www.amazon.com/dp/B08N5WRWNW/')).toBe(true); - Network accessline 20
it('matches amazon.com product URLs because Amazon products live under /dp/<asin>/', () => { expect(amazonExtractor.canHandle('https://www.amazon.com/dp/B08N5WRWNW/')).toBe(true); }); - Network accessline 21
expect(amazonExtractor.canHandle('https://www.amazon.com/dp/B08N5WRWNW/')).toBe(true); - Network accessline 24
it('matches amazon.com /gp/product/ URLs because that is the legacy product path still in use', () => { expect(amazonExtractor.canHandle('https://www.amazon.com/gp/product/B08N5WRWNW')).toBe(true); - Network accessline 25
expect(amazonExtractor.canHandle('https://www.amazon.com/gp/product/B08N5WRWNW')).toBe(true); - Network accessline 28
it('matches amazon.co.uk because UK is the highest non-US Amazon market by volume', () => { expect(amazonExtractor.canHandle('https://www.amazon.co.uk/dp/B09KETTLE1/')).toBe(true); - Network accessline 29
expect(amazonExtractor.canHandle('https://www.amazon.co.uk/dp/B09KETTLE1/')).toBe(true); - Network accessline 32
it('matches amazon.de because the EU template is identical to US and selectors must work there', () => { expect(amazonExtractor.canHandle('https://www.amazon.de/dp/B09KETTLE1/')).toBe(true); - Network accessline 33
expect(amazonExtractor.canHandle('https://www.amazon.de/dp/B09KETTLE1/')).toBe(true); - Network accessline 36
it('matches the amzn.to short-link domain because shared product links use it', () => { expect(amazonExtractor.canHandle('https://amzn.to/3xYz9aB')).toBe(true); - Network accessline 37
expect(amazonExtractor.canHandle('https://amzn.to/3xYz9aB')).toBe(true); - Network accessline 40
it('rejects non-amazon hosts so the fallback extractor chain stays in charge of them', () => { expect(amazonExtractor.canHandle('https://www.example.com/dp/B08N5WRWNW/')).toBe(false); - Network accessline 41
expect(amazonExtractor.canHandle('https://www.example.com/dp/B08N5WRWNW/')).toBe(false); - Network accessline 44
it('rejects amazon-shaped paths on unrelated domains so a path collision cannot hijack extraction', () => { expect(amazonExtractor.canHandle('https://example.com/amazon.com/dp/B08N5WRWNW')).toBe(false); - Network accessline 45
expect(amazonExtractor.canHandle('https://example.com/amazon.com/dp/B08N5WRWNW')).toBe(false); - Network accessline 48
it('rejects spoofed hosts like amazon.com.attacker.com because hostname suffix matching must be boundary-anchored', () => { expect(amazonExtractor.canHandle('https://amazon.com.attacker.com/dp/B08N5WRWNW')).toBe(false); - Network accessline 49
expect(amazonExtractor.canHandle('https://amazon.com.attacker.com/dp/B08N5WRWNW')).toBe(false); - Network accessline 52
it('rejects amazon.com signin and account paths because they are not product pages', () => { expect(amazonExtractor.canHandle('https://www.amazon.com/ap/signin')).toBe(false); - Network accessline 53
expect(amazonExtractor.canHandle('https://www.amazon.com/ap/signin')).toBe(false); - Network accessline 61
describe('amazonExtractor — electronics fixture', () => { const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 62
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 96
describe('extractAmazonProduct — electronics fixture', () => { const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 97
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 158
describe('extractAmazonProduct — book fixture', () => { const url = 'https://www.amazon.com/dp/0135957052/'; - Network accessline 159
const url = 'https://www.amazon.com/dp/0135957052/'; - Network accessline 189
describe('extractAmazonProduct — grocery fixture', () => { const url = 'https://www.amazon.com/dp/B0042NS3I8/'; - Network accessline 190
const url = 'https://www.amazon.com/dp/B0042NS3I8/'; - Network accessline 208
describe('extractAmazonProduct — out-of-stock fixture', () => { const url = 'https://www.amazon.com/dp/B07XYZ1234/'; - Network accessline 209
const url = 'https://www.amazon.com/dp/B07XYZ1234/'; - Network accessline 238
describe('extractAmazonProduct — UK locale fixture', () => { const url = 'https://www.amazon.co.uk/dp/B09KETTLE1/'; - Network accessline 239
const url = 'https://www.amazon.co.uk/dp/B09KETTLE1/'; - Network accessline 257
describe('extractAmazonProduct — error / edge cases', () => { it('returns null on empty HTML because the registry uses null to mean "I cannot handle this"', () => { expect(extractAmazonProduct('', 'https://www.amazon.com/dp/B08N5WRWNW - Network accessline 258
it('returns null on empty HTML because the registry uses null to mean "I cannot handle this"', () => { expect(extractAmazonProduct('', 'https://www.amazon.com/dp/B08N5WRWNW/')).toBeNull(); }); - Network accessline 259
expect(extractAmazonProduct('', 'https://www.amazon.com/dp/B08N5WRWNW/')).toBeNull(); - Network accessline 262
it('returns null when productTitle is missing because we should not fabricate a title', () => { const html = '<html><body><div>nothing useful here</div></body></html>'; expect(extractAmazonProduct(html, 'https://www.amazon.com/dp/B0 - Network accessline 263
const html = '<html><body><div>nothing useful here</div></body></html>'; expect(extractAmazonProduct(html, 'https://www.amazon.com/dp/B08N5WRWNW/')).toBeNull(); }); - Network accessline 264
expect(extractAmazonProduct(html, 'https://www.amazon.com/dp/B08N5WRWNW/')).toBeNull(); - Network accessline 271
</div> </body></html>`; const p = extractAmazonProduct(html, 'https://www.amazon.com/some/other/path'); - Network accessline 272
</body></html>`; const p = extractAmazonProduct(html, 'https://www.amazon.com/some/other/path'); expect(p?.asin).toBe('B0FALLBACK'); - Network accessline 273
const p = extractAmazonProduct(html, 'https://www.amazon.com/some/other/path'); - Network accessline 278
describe('extractAmazonProduct — DE locale (EUR) fixture', () => { const url = 'https://www.amazon.de/dp/B08N5WRWNW/'; - Network accessline 279
const url = 'https://www.amazon.de/dp/B08N5WRWNW/'; - Network accessline 297
describe('extractAmazonProduct — image filtering edge cases', () => { const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 298
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 302
<span id="productTitle">X-Locale Filter Test</span> <div id="imageBlock"> <img id="landingImage" src="https://m.media-amazon.com/images/I/hero.jpg" alt="Hero"> - Network accessline 303
<div id="imageBlock"> <img id="landingImage" src="https://m.media-amazon.com/images/I/hero.jpg" alt="Hero"> <img src="https://example.com/x-locale/strings.png"> - Network accessline 304
<img id="landingImage" src="https://m.media-amazon.com/images/I/hero.jpg" alt="Hero"> - Network accessline 305
<img src="https://example.com/x-locale/strings.png"> - Network accessline 306
<img src="https://m.media-amazon.com/images/I/alt-1.jpg"> - Network accessline 315
describe('extractAmazonProduct — features soft cap', () => { const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 316
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 330
describe('extractAmazonProduct — prototype pollution guards on specifications', () => { const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 331
const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 396
describe('amazonExtractor — anti-bot / not-found detection', () => { const BLOCKED_HTML = loadFixture('blocked.html'); const url = 'https://www.amazon.com/dp/B08N5WRWNW/'; - Network accessline 398
const url = 'https://www.amazon.com/dp/B08N5WRWNW/';
tests/unit/extraction/site-extractors/docs-generic.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
it('detects Docusaurus via .docs-sidebar class', () => { const html = '<html><body><nav class="docs-sidebar"></nav></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 13
const html = '<html><body><nav class="docs-sidebar"></nav></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); }); - Network accessline 14
expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 17
it('detects Docusaurus via data-docusaurus-page attribute', () => { const html = '<html data-docusaurus-page="true"><body></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 18
const html = '<html data-docusaurus-page="true"><body></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); }); - Network accessline 19
expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 22
it('detects MkDocs via .md-content class', () => { const html = '<html><body><div class="md-content"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 23
const html = '<html><body><div class="md-content"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); }); - Network accessline 24
expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 27
it('detects Sphinx via .document class', () => { const html = '<html><body><div class="document"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 28
const html = '<html><body><div class="document"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); }); - Network accessline 29
expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 32
it('detects Sphinx via .highlight inside .body', () => { const html = '<html><body><div class="body"><div class="highlight"></div></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)). - Network accessline 33
const html = '<html><body><div class="body"><div class="highlight"></div></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); }); - Network accessline 34
expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 37
it('detects GitBook via .page-body class', () => { const html = '<html><body><div class="page-body"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 38
const html = '<html><body><div class="page-body"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); }); - Network accessline 39
expect(docsGenericExtractor.canHandle('https://docs.example.com/intro', html)).toBe(true); - Network accessline 42
it('returns false for unrecognised HTML', () => { const html = '<html><body><p>Just some content.</p></body></html>'; expect(docsGenericExtractor.canHandle('https://example.com', html)).toBe(false); - Network accessline 43
const html = '<html><body><p>Just some content.</p></body></html>'; expect(docsGenericExtractor.canHandle('https://example.com', html)).toBe(false); }); - Network accessline 44
expect(docsGenericExtractor.canHandle('https://example.com', html)).toBe(false); - Network accessline 47
it('returns false for GitHub HTML', () => { const html = '<html><body><div class="repository-content"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://github.com/foo/bar', html)).toBe(false); - Network accessline 48
const html = '<html><body><div class="repository-content"></div></body></html>'; expect(docsGenericExtractor.canHandle('https://github.com/foo/bar', html)).toBe(false); }); - Network accessline 49
expect(docsGenericExtractor.canHandle('https://github.com/foo/bar', html)).toBe(false); - Network accessline 53
describe('docsGenericExtractor — Docusaurus extraction', () => { const url = 'https://docs.example.com/getting-started'; - Network accessline 54
const url = 'https://docs.example.com/getting-started'; - Network accessline 87
describe('docsGenericExtractor — code block preservation', () => { const url = 'https://docs.example.com/getting-started'; - Network accessline 88
const url = 'https://docs.example.com/getting-started'; - Network accessline 106
describe('docsGenericExtractor — strip nav/TOC/version picker', () => { const url = 'https://docs.example.com/getting-started'; - Network accessline 107
const url = 'https://docs.example.com/getting-started'; - Network accessline 125
describe('docsGenericExtractor — MkDocs extraction', () => { const url = 'https://docs.example.com/page'; - Network accessline 126
const url = 'https://docs.example.com/page'; - Network accessline 156
describe('docsGenericExtractor — Sphinx extraction', () => { const url = 'https://docs.example.com/sphinx-page'; - Network accessline 157
const url = 'https://docs.example.com/sphinx-page'; - Network accessline 190
describe('docsGenericExtractor — GitBook extraction', () => { const url = 'https://docs.example.com/gitbook-page'; - Network accessline 191
const url = 'https://docs.example.com/gitbook-page'; - Network accessline 217
describe('docsGenericExtractor — edge cases', () => { it('returns null for empty HTML', () => { const result = docsGenericExtractor.extract('', 'https://docs.example.com/page'); - Network accessline 218
it('returns null for empty HTML', () => { const result = docsGenericExtractor.extract('', 'https://docs.example.com/page'); expect(result).toBeNull(); - Network accessline 219
const result = docsGenericExtractor.extract('', 'https://docs.example.com/page'); - Network accessline 224
const result = docsGenericExtractor.extract( '<html><body><p>Nothing here</p></body></html>', 'https://docs.example.com/page', - Network accessline 225
'<html><body><p>Nothing here</p></body></html>', 'https://docs.example.com/page', ); - Network accessline 226
'https://docs.example.com/page',
tests/unit/extraction/site-extractors/github.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
describe('githubExtractor.canHandle', () => { it('matches GitHub issue URLs', () => { expect(githubExtractor.canHandle('https://github.com/owner/repo/issues/42')).toBe(true); - Network accessline 19
it('matches GitHub issue URLs', () => { expect(githubExtractor.canHandle('https://github.com/owner/repo/issues/42')).toBe(true); }); - Network accessline 20
expect(githubExtractor.canHandle('https://github.com/owner/repo/issues/42')).toBe(true); - Network accessline 23
it('matches GitHub PR URLs', () => { expect(githubExtractor.canHandle('https://github.com/owner/repo/pull/7')).toBe(true); - Network accessline 24
expect(githubExtractor.canHandle('https://github.com/owner/repo/pull/7')).toBe(true); - Network accessline 27
it('matches GitHub blob URLs', () => { expect(githubExtractor.canHandle('https://github.com/owner/repo/blob/main/README.md')).toBe(true); - Network accessline 28
expect(githubExtractor.canHandle('https://github.com/owner/repo/blob/main/README.md')).toBe(true); - Network accessline 31
it('matches GitHub repo root (README)', () => { expect(githubExtractor.canHandle('https://github.com/owner/repo')).toBe(true); - Network accessline 32
expect(githubExtractor.canHandle('https://github.com/owner/repo')).toBe(true); - Network accessline 35
it('does not match non-GitHub URLs', () => { expect(githubExtractor.canHandle('https://stackoverflow.com/questions/123')).toBe(false); - Network accessline 36
expect(githubExtractor.canHandle('https://stackoverflow.com/questions/123')).toBe(false); - Network accessline 39
it('does not match URLs that merely mention github in path', () => { expect(githubExtractor.canHandle('https://example.com/github/stuff')).toBe(false); - Network accessline 40
expect(githubExtractor.canHandle('https://example.com/github/stuff')).toBe(false); - Network accessline 43
it('does not match GitLab URLs', () => { expect(githubExtractor.canHandle('https://gitlab.com/owner/repo/issues/1')).toBe(false); - Network accessline 44
expect(githubExtractor.canHandle('https://gitlab.com/owner/repo/issues/1')).toBe(false); - Network accessline 48
describe('githubExtractor — issue extraction', () => { const url = 'https://github.com/owner/repo/issues/42'; - Network accessline 49
const url = 'https://github.com/owner/repo/issues/42'; - Network accessline 88
describe('githubExtractor — PR extraction', () => { const url = 'https://github.com/owner/repo/pull/7'; - Network accessline 89
const url = 'https://github.com/owner/repo/pull/7'; - Network accessline 102
describe('githubExtractor — README extraction', () => { const url = 'https://github.com/owner/awesome-lib'; - Network accessline 103
const url = 'https://github.com/owner/awesome-lib'; - Network accessline 132
describe('githubExtractor — modern blob (embedded React payload)', () => { const url = 'https://github.com/sindresorhus/is/blob/main/source/index.ts'; - Network accessline 133
const url = 'https://github.com/sindresorhus/is/blob/main/source/index.ts'; - Network accessline 169
describe('githubExtractor — legacy blob (server-rendered selectors)', () => { const url = 'https://github.com/acme/legacy-repo/blob/v1/config.yml'; - Network accessline 170
const url = 'https://github.com/acme/legacy-repo/blob/v1/config.yml'; - Network accessline 185
describe('extractGithubBlobWithRawFallback — raw.githubusercontent fallback', () => { const truncatedUrl = 'https://github.com/acme/repo/blob/main/big-data.json'; - Network accessline 186
const truncatedUrl = 'https://github.com/acme/repo/blob/main/big-data.json'; - Network accessline 187
const modernUrl = 'https://github.com/sindresorhus/is/blob/main/source/index.ts'; - Network accessline 197
expect(fetchImpl).toHaveBeenCalledWith( 'https://raw.githubusercontent.com/acme/repo/main/big-data.json', - Network accessline 198
'https://raw.githubusercontent.com/acme/repo/main/big-data.json', - Network accessline 211
expect(fetchImpl).toHaveBeenCalledTimes(1); expect(fetchImpl).toHaveBeenCalledWith( 'https://raw.githubusercontent.com/sindresorhus/is/main/source/index.ts', - Network accessline 212
expect(fetchImpl).toHaveBeenCalledWith( 'https://raw.githubusercontent.com/sindresorhus/is/main/source/index.ts', ); - Network accessline 213
'https://raw.githubusercontent.com/sindresorhus/is/main/source/index.ts', - Network accessline 233
const result = await extractGithubBlobWithRawFallback( BLOB_LEGACY_HTML, 'https://github.com/acme/legacy-repo/blob/v1/config.yml', - Network accessline 234
BLOB_LEGACY_HTML, 'https://github.com/acme/legacy-repo/blob/v1/config.yml', fetchImpl, - Network accessline 235
'https://github.com/acme/legacy-repo/blob/v1/config.yml', - Network accessline 253
describe('githubExtractor — edge cases', () => { it('returns null for empty HTML', () => { const result = githubExtractor.extract('', 'https://github.com/owner/repo/issues/1'); - Network accessline 254
it('returns null for empty HTML', () => { const result = githubExtractor.extract('', 'https://github.com/owner/repo/issues/1'); expect(result).toBeNull(); - Network accessline 255
const result = githubExtractor.extract('', 'https://github.com/owner/repo/issues/1'); - Network accessline 259
it('returns null for HTML with no recognizable GitHub structure', () => { const result = githubExtractor.extract('<html><body><p>Nothing here</p></body></html>', 'https://github.com/owner/repo/issues/1'); - Network accessline 260
const result = githubExtractor.extract('<html><body><p>Nothing here</p></body></html>', 'https://github.com/owner/repo/issues/1');
tests/unit/extraction/site-extractors/mdn.test.ts
- Executable scriptline 1
Executable file - Network accessline 11
describe('mdnExtractor.canHandle', () => { it('matches developer.mozilla.org URLs', () => { expect(mdnExtractor.canHandle('https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map')).toBe(true); - Network accessline 12
it('matches developer.mozilla.org URLs', () => { expect(mdnExtractor.canHandle('https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map')).toBe(true); }); - Network accessline 13
expect(mdnExtractor.canHandle('https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map')).toBe(true); - Network accessline 16
it('matches any path under developer.mozilla.org', () => { expect(mdnExtractor.canHandle('https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API')).toBe(true); - Network accessline 17
expect(mdnExtractor.canHandle('https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API')).toBe(true); - Network accessline 20
it('does not match other mozilla.org subdomains', () => { expect(mdnExtractor.canHandle('https://www.mozilla.org/en-US/firefox/')).toBe(false); - Network accessline 21
expect(mdnExtractor.canHandle('https://www.mozilla.org/en-US/firefox/')).toBe(false); - Network accessline 24
it('does not match GitHub URLs', () => { expect(mdnExtractor.canHandle('https://github.com/mdn/content')).toBe(false); - Network accessline 25
expect(mdnExtractor.canHandle('https://github.com/mdn/content')).toBe(false); - Network accessline 28
it('does not match Stack Overflow URLs', () => { expect(mdnExtractor.canHandle('https://stackoverflow.com/questions/123')).toBe(false); - Network accessline 29
expect(mdnExtractor.canHandle('https://stackoverflow.com/questions/123')).toBe(false); - Network accessline 32
it('does not match URLs that merely mention mozilla in path', () => { expect(mdnExtractor.canHandle('https://example.com/mozilla/docs')).toBe(false); - Network accessline 33
expect(mdnExtractor.canHandle('https://example.com/mozilla/docs')).toBe(false); - Network accessline 37
describe('mdnExtractor — article extraction', () => { const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 38
const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 71
describe('mdnExtractor — code examples', () => { const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 72
const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 95
describe('mdnExtractor — strip unwanted elements', () => { const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 96
const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 119
describe('mdnExtractor — specification tables', () => { const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 120
const url = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'; - Network accessline 133
describe('mdnExtractor — edge cases', () => { it('returns null for empty HTML', () => { const result = mdnExtractor.extract('', 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API'); - Network accessline 134
it('returns null for empty HTML', () => { const result = mdnExtractor.extract('', 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API'); expect(result).toBeNull(); - Network accessline 135
const result = mdnExtractor.extract('', 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API'); - Network accessline 140
const result = mdnExtractor.extract( '<html><body><p>Nothing here</p></body></html>', 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API', - Network accessline 141
'<html><body><p>Nothing here</p></body></html>', 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API', ); - Network accessline 142
'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API', - Network accessline 166
</body> </html>`; const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'); - Network accessline 167
</html>`; const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'); expect(result).not.toBeNull(); - Network accessline 168
const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map'); - Network accessline 178
const html = `<html> <head> <title>fetch() - Web APIs | MDN</title> - Network accessline 179
<head> <title>fetch() - Web APIs | MDN</title> <meta property="og:title" content="fetch() global function"> - Network accessline 180
<title>fetch() - Web APIs | MDN</title> - Network accessline 181
<meta property="og:title" content="fetch() global function"> - Network accessline 183
<body> <main id="content"> <p>The fetch() method starts the process of fetching a resource from the network.</p> - Network accessline 184
<main id="content"> <p>The fetch() method starts the process of fetching a resource from the network.</p> </main> - Network accessline 185
<p>The fetch() method starts the process of fetching a resource from the network.</p> - Network accessline 187
</body> </html>`; const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Web/API/fetch'); - Network accessline 188
</html>`; const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Web/API/fetch'); expect(result).not.toBeNull(); - Network accessline 189
const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Web/API/fetch'); - Network accessline 190
expect(result).not.toBeNull(); expect(result!.title).toBe('fetch() global function'); }); - Network accessline 191
expect(result!.title).toBe('fetch() global function'); - Network accessline 201
</article> </body></html>`; const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Foo'); - Network accessline 202
</body></html>`; const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Foo'); expect(result).not.toBeNull(); - Network accessline 203
const result = mdnExtractor.extract(html, 'https://developer.mozilla.org/en-US/docs/Foo');
tests/unit/extraction/site-extractors/reddit.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
expect( redditExtractor.canHandle( 'https://www.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', - Network accessline 19
redditExtractor.canHandle( 'https://www.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', ), - Network accessline 20
'https://www.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', - Network accessline 25
it('matches reddit.com (no www)', () => { expect( redditExtractor.canHandle('https://reddit.com/r/programming/comments/abc123/title/'), - Network accessline 26
expect( redditExtractor.canHandle('https://reddit.com/r/programming/comments/abc123/title/'), ).toBe(true); - Network accessline 27
redditExtractor.canHandle('https://reddit.com/r/programming/comments/abc123/title/'), - Network accessline 31
it('matches old.reddit.com thread URLs', () => { expect( redditExtractor.canHandle('https://old.reddit.com/r/movies/comments/xyz789/some_title/'), - Network accessline 32
expect( redditExtractor.canHandle('https://old.reddit.com/r/movies/comments/xyz789/some_title/'), ).toBe(true); - Network accessline 33
redditExtractor.canHandle('https://old.reddit.com/r/movies/comments/xyz789/some_title/'), - Network accessline 37
it('matches np.reddit.com (no participation) subdomain', () => { expect( redditExtractor.canHandle('https://np.reddit.com/r/movies/comments/xyz789/'), - Network accessline 38
expect( redditExtractor.canHandle('https://np.reddit.com/r/movies/comments/xyz789/'), ).toBe(true); - Network accessline 39
redditExtractor.canHandle('https://np.reddit.com/r/movies/comments/xyz789/'), - Network accessline 43
it('matches redd.it short URLs', () => { expect(redditExtractor.canHandle('https://redd.it/abc123')).toBe(true); - Network accessline 44
expect(redditExtractor.canHandle('https://redd.it/abc123')).toBe(true); - Network accessline 47
it('does not match the front page (no /comments/ segment)', () => { expect(redditExtractor.canHandle('https://www.reddit.com/r/programming/')).toBe(false); - Network accessline 48
expect(redditExtractor.canHandle('https://www.reddit.com/r/programming/')).toBe(false); - Network accessline 51
it('does not match GitHub URLs', () => { expect(redditExtractor.canHandle('https://github.com/owner/repo/issues/1')).toBe(false); - Network accessline 52
expect(redditExtractor.canHandle('https://github.com/owner/repo/issues/1')).toBe(false); - Network accessline 55
it('does not match arbitrary URLs that mention reddit in the path', () => { expect(redditExtractor.canHandle('https://example.com/reddit/comments/abc/')).toBe(false); - Network accessline 56
expect(redditExtractor.canHandle('https://example.com/reddit/comments/abc/')).toBe(false); - Network accessline 64
describe('redditExtractor.extract — happy path', () => { const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 66
'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 126
describe('extractRedditThread — structured output (spec shape)', () => { const url = 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 128
'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/'; - Network accessline 187
describe('redditExtractor — deleted post', () => { const url = 'https://old.reddit.com/r/AskReddit/comments/del123/removed/'; - Network accessline 188
const url = 'https://old.reddit.com/r/AskReddit/comments/del123/removed/'; - Network accessline 214
describe('redditExtractor — deleted comments', () => { const url = 'https://old.reddit.com/r/movies/comments/xyz789/what_is_the_worst_movie_sequel/'; - Network accessline 215
const url = 'https://old.reddit.com/r/movies/comments/xyz789/what_is_the_worst_movie_sequel/'; - Network accessline 236
it('returns null for empty HTML', () => { expect( redditExtractor.extract('', 'https://www.reddit.com/r/x/comments/1/y/'), - Network accessline 237
expect( redditExtractor.extract('', 'https://www.reddit.com/r/x/comments/1/y/'), ).toBeNull(); - Network accessline 238
redditExtractor.extract('', 'https://www.reddit.com/r/x/comments/1/y/'), - Network accessline 244
redditExtractor.extract( '<html><body><p>Nothing here</p></body></html>', 'https://www.reddit.com/r/x/comments/1/y/', - Network accessline 245
'<html><body><p>Nothing here</p></body></html>', 'https://www.reddit.com/r/x/comments/1/y/', ), - Network accessline 246
'https://www.reddit.com/r/x/comments/1/y/', - Network accessline 256
const BLOCKED_HTML = loadFixture('reddit-blocked.html'); const url = 'https://old.reddit.com/r/programming/comments/abc123/something/'; - Network accessline 258
'https://old.reddit.com/r/programming/comments/abc123/something/';
tests/unit/extraction/site-extractors/stackoverflow.test.ts
- Executable scriptline 1
Executable file - Network accessline 11
describe('stackoverflowExtractor.canHandle', () => { it('matches stackoverflow.com URLs', () => { expect(stackoverflowExtractor.canHandle('https://stackoverflow.com/questions/958908/how-do-i-reverse')).toBe(true); - Network accessline 12
it('matches stackoverflow.com URLs', () => { expect(stackoverflowExtractor.canHandle('https://stackoverflow.com/questions/958908/how-do-i-reverse')).toBe(true); }); - Network accessline 13
expect(stackoverflowExtractor.canHandle('https://stackoverflow.com/questions/958908/how-do-i-reverse')).toBe(true); - Network accessline 16
it('matches stackexchange.com subdomains', () => { expect(stackoverflowExtractor.canHandle('https://superuser.stackexchange.com/questions/123/something')).toBe(true); - Network accessline 17
expect(stackoverflowExtractor.canHandle('https://superuser.stackexchange.com/questions/123/something')).toBe(true); - Network accessline 20
it('matches meta.stackoverflow.com', () => { expect(stackoverflowExtractor.canHandle('https://meta.stackoverflow.com/questions/456/meta-thing')).toBe(true); - Network accessline 21
expect(stackoverflowExtractor.canHandle('https://meta.stackoverflow.com/questions/456/meta-thing')).toBe(true); - Network accessline 24
it('does not match GitHub URLs', () => { expect(stackoverflowExtractor.canHandle('https://github.com/owner/repo/issues/1')).toBe(false); - Network accessline 25
expect(stackoverflowExtractor.canHandle('https://github.com/owner/repo/issues/1')).toBe(false); - Network accessline 28
it('does not match arbitrary URLs mentioning stackoverflow in path', () => { expect(stackoverflowExtractor.canHandle('https://example.com/stackoverflow/something')).toBe(false); - Network accessline 29
expect(stackoverflowExtractor.canHandle('https://example.com/stackoverflow/something')).toBe(false); - Network accessline 33
describe('stackoverflowExtractor — question extraction', () => { const url = 'https://stackoverflow.com/questions/958908/how-do-i-reverse-a-string-in-javascript'; - Network accessline 34
const url = 'https://stackoverflow.com/questions/958908/how-do-i-reverse-a-string-in-javascript'; - Network accessline 74
describe('stackoverflowExtractor — answers', () => { const url = 'https://stackoverflow.com/questions/958908/how-do-i-reverse-a-string-in-javascript'; - Network accessline 75
const url = 'https://stackoverflow.com/questions/958908/how-do-i-reverse-a-string-in-javascript'; - Network accessline 117
describe('stackoverflowExtractor — edge cases', () => { it('returns null for empty HTML', () => { const result = stackoverflowExtractor.extract('', 'https://stackoverflow.com/questions/1/test'); - Network accessline 118
it('returns null for empty HTML', () => { const result = stackoverflowExtractor.extract('', 'https://stackoverflow.com/questions/1/test'); expect(result).toBeNull(); - Network accessline 119
const result = stackoverflowExtractor.extract('', 'https://stackoverflow.com/questions/1/test'); - Network accessline 124
const result = stackoverflowExtractor.extract( '<html><body><p>Nothing here</p></body></html>', 'https://stackoverflow.com/questions/1/test', - Network accessline 125
'<html><body><p>Nothing here</p></body></html>', 'https://stackoverflow.com/questions/1/test', ); - Network accessline 126
'https://stackoverflow.com/questions/1/test',
tests/unit/extraction/site-extractors/youtube.test.ts
- Executable scriptline 1
Executable file - Network accessline 15
describe('youtubeExtractor.canHandle', () => { it('matches standard youtube.com/watch URLs', () => { expect(youtubeExtractor.canHandle('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true); - Network accessline 16
it('matches standard youtube.com/watch URLs', () => { expect(youtubeExtractor.canHandle('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true); }); - Network accessline 17
expect(youtubeExtractor.canHandle('https://www.youtube.com/watch?v=dQw4w9WgXcQ')).toBe(true); - Network accessline 20
it('matches youtube.com without www', () => { expect(youtubeExtractor.canHandle('https://youtube.com/watch?v=abc123')).toBe(true); - Network accessline 21
expect(youtubeExtractor.canHandle('https://youtube.com/watch?v=abc123')).toBe(true); - Network accessline 24
it('matches mobile m.youtube.com', () => { expect(youtubeExtractor.canHandle('https://m.youtube.com/watch?v=abc123')).toBe(true); - Network accessline 25
expect(youtubeExtractor.canHandle('https://m.youtube.com/watch?v=abc123')).toBe(true); - Network accessline 28
it('matches youtu.be short links', () => { expect(youtubeExtractor.canHandle('https://youtu.be/dQw4w9WgXcQ')).toBe(true); - Network accessline 29
expect(youtubeExtractor.canHandle('https://youtu.be/dQw4w9WgXcQ')).toBe(true); - Network accessline 32
it('matches music.youtube.com watch URLs', () => { expect(youtubeExtractor.canHandle('https://music.youtube.com/watch?v=abc123')).toBe(true); - Network accessline 33
expect(youtubeExtractor.canHandle('https://music.youtube.com/watch?v=abc123')).toBe(true); - Network accessline 36
it('does not match youtube channel pages (no watch path)', () => { expect(youtubeExtractor.canHandle('https://www.youtube.com/@ChannelName')).toBe(false); - Network accessline 37
expect(youtubeExtractor.canHandle('https://www.youtube.com/@ChannelName')).toBe(false); - Network accessline 40
it('does not match unrelated domains', () => { expect(youtubeExtractor.canHandle('https://example.com/watch?v=abc')).toBe(false); - Network accessline 41
expect(youtubeExtractor.canHandle('https://example.com/watch?v=abc')).toBe(false); - Network accessline 44
it('does not match URLs that merely mention youtube in path', () => { expect(youtubeExtractor.canHandle('https://example.com/youtube/watch')).toBe(false); - Network accessline 45
expect(youtubeExtractor.canHandle('https://example.com/youtube/watch')).toBe(false); - Network accessline 58
it('extracts video_id from ytInitialPlayerResponse', () => { const result = youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 59
const result = youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 67
describe('youtubeExtractor — metadata fields', () => { const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 68
const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 125
describe('youtubeExtractor — chapters', () => { const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 126
const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 141
it('returns empty chapters array when none present in HTML', () => { const result = youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-')!; - Network accessline 142
const result = youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-')!; - Network accessline 150
describe('youtubeExtractor — captions / transcript', () => { const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 151
const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; - Network accessline 173
it('returns empty caption_tracks when the video has no captions', () => { const result = youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-')!; - Network accessline 174
const result = youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-')!; - Network accessline 178
it('does not throw on no-captions videos', () => { expect(() => youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-'), - Network accessline 179
expect(() => youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-'), ).not.toThrow(); - Network accessline 180
youtubeExtractor.extract(NO_CAPTIONS, 'https://www.youtube.com/watch?v=abc123XYZ_-'), - Network accessline 188
describe('youtubeExtractor — age-restricted / unavailable videos', () => { const url = 'https://www.youtube.com/watch?v=restricted1'; - Network accessline 189
const url = 'https://www.youtube.com/watch?v=restricted1'; - Network accessline 214
describe('youtubeExtractor — markdown body', () => { it('includes the title in markdown', () => { const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 215
it('includes the title in markdown', () => { const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; expect(result.markdown).toContain('Example Video Title'); - Network accessline 216
const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 220
it('includes channel in markdown', () => { const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 221
const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 225
it('includes description in markdown', () => { const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 226
const result = youtubeExtractor.extract(WITH_CAPTIONS, 'https://www.youtube.com/watch?v=dQw4w9WgXcQ')!; - Network accessline 234
describe('youtubeExtractor — edge cases', () => { it('returns null for empty HTML', () => { expect(youtubeExtractor.extract('', 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 235
it('returns null for empty HTML', () => { expect(youtubeExtractor.extract('', 'https://www.youtube.com/watch?v=abc')).toBeNull(); }); - Network accessline 236
expect(youtubeExtractor.extract('', 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 239
it('returns null when ytInitialPlayerResponse is missing', () => { const html = '<html><body><p>nothing here</p></body></html>'; expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 240
const html = '<html><body><p>nothing here</p></body></html>'; expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); }); - Network accessline 241
expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 244
it('returns null when ytInitialPlayerResponse is malformed JSON', () => { const html = '<script>var ytInitialPlayerResponse = {bad json;</script>'; expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNu - Network accessline 245
const html = '<script>var ytInitialPlayerResponse = {bad json;</script>'; expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); }); - Network accessline 246
expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 266
describe('youtubeExtractor.canHandle — spoofed-host regressions', () => { it('does not match spoofed subdomain suffix (youtube.com.evil.com)', () => { expect(youtubeExtractor.canHandle('https://youtube.com.evil.com/watch?v=abc')).toBe - Network accessline 267
it('does not match spoofed subdomain suffix (youtube.com.evil.com)', () => { expect(youtubeExtractor.canHandle('https://youtube.com.evil.com/watch?v=abc')).toBe(false); }); - Network accessline 268
expect(youtubeExtractor.canHandle('https://youtube.com.evil.com/watch?v=abc')).toBe(false); - Network accessline 271
it('does not match URLs that put youtube.com in the path or query', () => { expect(youtubeExtractor.canHandle('https://evil.com/?youtube.com/watch?v=abc')).toBe(false); - Network accessline 272
expect(youtubeExtractor.canHandle('https://evil.com/?youtube.com/watch?v=abc')).toBe(false); - Network accessline 285
expect(() => youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc'), - Network accessline 286
youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc'), - Network accessline 287
).not.toThrow(); expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); }); - Network accessline 288
expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 295
const html = `<script>var ytInitialPlayerResponse = ${runaway}</script>`; expect(() => youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc'), - Network accessline 296
expect(() => youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc'), ).not.toThrow(); - Network accessline 297
youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc'), - Network accessline 298
).not.toThrow(); expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); }); - Network accessline 299
expect(youtubeExtractor.extract(html, 'https://www.youtube.com/watch?v=abc')).toBeNull(); - Network accessline 303
// WHY: caption_tracks[].base_url is taken straight from parsed JSON and emitted // to callers. Spoofed YouTube HTML could supply file://, http://169.254.169.254 - Network accessline 304
// to callers. Spoofed YouTube HTML could supply file://, http://169.254.169.254 - Network accessline 307
describe('youtubeExtractor — caption_tracks URL allow-list', () => { const url = 'https://www.youtube.com/watch?v=spoofed1'; - Network accessline 308
const url = 'https://www.youtube.com/watch?v=spoofed1'; - Network accessline 330
it('allows https://www.youtube.com/api/timedtext URLs', () => { - Network accessline 331
const html = makeFixture('https://www.youtube.com/api/timedtext?v=spoofed1&lang=en'); - Network accessline 335
}>; expect(tracks).toHaveLength(1); expect(tracks[0].base_url).toBe('https://www.youtube.com/api/timedtext?v=spoofed1&lang=en'); - Network accessline 336
expect(tracks).toHaveLength(1); expect(tracks[0].base_url).toBe('https://www.youtube.com/api/timedtext?v=spoofed1&lang=en'); }); - Network accessline 337
expect(tracks[0].base_url).toBe('https://www.youtube.com/api/timedtext?v=spoofed1&lang=en'); - Network accessline 340
it('allows https://*.googlevideo.com URLs', () => { - Network accessline 341
const html = makeFixture('https://r1---sn-abc.googlevideo.com/api/timedtext?v=spoofed1'); - Network accessline 350
it('drops caption tracks pointing at AWS metadata (http://169.254.169.254/...)', () => { - Network accessline 351
const html = makeFixture('http://169.254.169.254/latest/meta-data/'); - Network accessline 362
it('drops caption tracks whose host merely contains youtube.com (https://attacker.com/youtube.com/...)', () => { - Network accessline 363
const html = makeFixture('https://attacker.com/youtube.com/api/timedtext?v=spoofed1');
tests/unit/extraction/structured-data-logging.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/structured-data.test.ts
- Executable scriptline 1
Executable file
tests/unit/extraction/structured.test.ts
- Executable scriptline 1
Executable file - Network accessline 124
it('extracts microdata itemprop key-value pairs', () => { const html = ` <div itemscope itemtype="https://schema.org/Product"> - Network accessline 125
const html = <div itemscope itemtype="https://schema.org/Product"> - Network accessline 126
<div itemscope itemtype="https://schema.org/Product"> - Network accessline 179
const html = ` <script type="application/ld+json"> { "@context":"https://schema.org", "@type":"Article", "headline":"Hello" } - Network accessline 180
<script type="application/ld+json"> { "@context":"https://schema.org", "@type":"Article", "headline":"Hello" } </script> - Network accessline 181
{ "@context":"https://schema.org", "@type":"Article", "headline":"Hello" }
tests/unit/extraction/v1/classifier.test.ts
- Executable scriptline 1
Executable file - Network accessline 4
function withJsonLd(type: string | string[]): string { const obj = JSON.stringify({ '@context': 'https://schema.org', '@type': type, name: 'x' }); - Network accessline 5
const obj = JSON.stringify({ '@context': 'https://schema.org', '@type': type, name: 'x' }); - Network accessline 13
describe('classifyContent — JSON-LD signals', () => { it('classifies Recipe schema as recipe', () => { expect(classifyContent('https://example.com/cookies', withJsonLd('Recipe'))).toBe('recipe'); - Network accessline 14
it('classifies Recipe schema as recipe', () => { expect(classifyContent('https://example.com/cookies', withJsonLd('Recipe'))).toBe('recipe'); }); - Network accessline 15
expect(classifyContent('https://example.com/cookies', withJsonLd('Recipe'))).toBe('recipe'); - Network accessline 18
it('classifies Product schema as product', () => { expect(classifyContent('https://example.com/widget', withJsonLd('Product'))).toBe('product'); - Network accessline 19
expect(classifyContent('https://example.com/widget', withJsonLd('Product'))).toBe('product'); - Network accessline 22
it('classifies NewsArticle schema as news', () => { expect(classifyContent('https://example.com/story', withJsonLd('NewsArticle'))).toBe('news'); - Network accessline 23
expect(classifyContent('https://example.com/story', withJsonLd('NewsArticle'))).toBe('news'); - Network accessline 26
it('classifies Article schema as news', () => { expect(classifyContent('https://example.com/post', withJsonLd('Article'))).toBe('news'); - Network accessline 27
expect(classifyContent('https://example.com/post', withJsonLd('Article'))).toBe('news'); - Network accessline 30
it('classifies BlogPosting schema as news', () => { expect(classifyContent('https://example.com/blog/1', withJsonLd('BlogPosting'))).toBe('news'); - Network accessline 31
expect(classifyContent('https://example.com/blog/1', withJsonLd('BlogPosting'))).toBe('news'); - Network accessline 34
it('classifies TechArticle schema as docs', () => { expect(classifyContent('https://example.com/guide', withJsonLd('TechArticle'))).toBe('docs'); - Network accessline 35
expect(classifyContent('https://example.com/guide', withJsonLd('TechArticle'))).toBe('docs'); - Network accessline 38
it('classifies APIReference schema as docs', () => { expect(classifyContent('https://example.com/api', withJsonLd('APIReference'))).toBe('docs'); - Network accessline 39
expect(classifyContent('https://example.com/api', withJsonLd('APIReference'))).toBe('docs'); - Network accessline 42
it('classifies QAPage schema as code', () => { expect(classifyContent('https://example.com/q/42', withJsonLd('QAPage'))).toBe('code'); - Network accessline 43
expect(classifyContent('https://example.com/q/42', withJsonLd('QAPage'))).toBe('code'); - Network accessline 46
it('classifies Question schema as code', () => { expect(classifyContent('https://example.com/q/42', withJsonLd('Question'))).toBe('code'); - Network accessline 47
expect(classifyContent('https://example.com/q/42', withJsonLd('Question'))).toBe('code'); - Network accessline 50
it('classifies Answer schema as code', () => { expect(classifyContent('https://example.com/a/42', withJsonLd('Answer'))).toBe('code'); - Network accessline 51
expect(classifyContent('https://example.com/a/42', withJsonLd('Answer'))).toBe('code'); - Network accessline 54
it('handles JSON-LD @type as an array', () => { const html = withJsonLd(['CreativeWork', 'Recipe']); expect(classifyContent('https://example.com/r', html)).toBe('recipe'); - Network accessline 55
const html = withJsonLd(['CreativeWork', 'Recipe']); expect(classifyContent('https://example.com/r', html)).toBe('recipe'); }); - Network accessline 56
expect(classifyContent('https://example.com/r', html)).toBe('recipe'); - Network accessline 59
it('handles JSON-LD @type with schema.org URI prefix', () => { const html = `<html><head><script type="application/ld+json">${JSON.stringify({ '@type': 'http://schema.org/Recipe', - Network accessline 60
const html = `<html><head><script type="application/ld+json">${JSON.stringify({ '@type': 'http://schema.org/Recipe', })}</script></head><body></body></html>`; - Network accessline 61
'@type': 'http://schema.org/Recipe', - Network accessline 62
})}</script></head><body></body></html>`; expect(classifyContent('https://example.com/r', html)).toBe('recipe'); }); - Network accessline 63
expect(classifyContent('https://example.com/r', html)).toBe('recipe'); - Network accessline 69
<meta property="og:type" content="article"> </head><body></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('news'); - Network accessline 70
</head><body></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('news'); }); - Network accessline 71
expect(classifyContent('https://example.com/x', html)).toBe('news'); - Network accessline 74
it('walks @graph entries to find a useful @type', () => { const html = `<html><head><script type="application/ld+json">${JSON.stringify({ '@context': 'https://schema.org', - Network accessline 75
const html = `<html><head><script type="application/ld+json">${JSON.stringify({ '@context': 'https://schema.org', '@graph': [ - Network accessline 76
'@context': 'https://schema.org', - Network accessline 80
], })}</script></head><body></body></html>`; expect(classifyContent('https://example.com/r', html)).toBe('recipe'); - Network accessline 81
})}</script></head><body></body></html>`; expect(classifyContent('https://example.com/r', html)).toBe('recipe'); }); - Network accessline 82
expect(classifyContent('https://example.com/r', html)).toBe('recipe'); - Network accessline 86
describe('classifyContent — og:type signals', () => { it('classifies og:type=article as news', () => { expect(classifyContent('https://example.com/x', withOgType('article'))).toBe('news'); - Network accessline 87
it('classifies og:type=article as news', () => { expect(classifyContent('https://example.com/x', withOgType('article'))).toBe('news'); }); - Network accessline 88
expect(classifyContent('https://example.com/x', withOgType('article'))).toBe('news'); - Network accessline 91
it('classifies og:type=product as product', () => { expect(classifyContent('https://example.com/x', withOgType('product'))).toBe('product'); - Network accessline 92
expect(classifyContent('https://example.com/x', withOgType('product'))).toBe('product'); - Network accessline 95
it('classifies og:type=recipe as recipe', () => { expect(classifyContent('https://example.com/x', withOgType('recipe'))).toBe('recipe'); - Network accessline 96
expect(classifyContent('https://example.com/x', withOgType('recipe'))).toBe('recipe'); - Network accessline 99
it('ignores irrelevant og:type values and falls through', () => { expect(classifyContent('https://example.com/x', withOgType('website'))).toBe('generic'); - Network accessline 100
expect(classifyContent('https://example.com/x', withOgType('website'))).toBe('generic'); - Network accessline 107
it('classifies github.com URLs as code', () => { expect(classifyContent('https://github.com/anthropics/claude', empty)).toBe('code'); - Network accessline 108
expect(classifyContent('https://github.com/anthropics/claude', empty)).toBe('code'); - Network accessline 111
it('classifies gist.github.com URLs as code', () => { expect(classifyContent('https://gist.github.com/u/abc', empty)).toBe('code'); - Network accessline 112
expect(classifyContent('https://gist.github.com/u/abc', empty)).toBe('code'); - Network accessline 115
it('classifies stackoverflow.com URLs as code', () => { expect(classifyContent('https://stackoverflow.com/questions/123', empty)).toBe('code'); - Network accessline 116
expect(classifyContent('https://stackoverflow.com/questions/123', empty)).toBe('code'); - Network accessline 119
it('classifies *.stackexchange.com URLs as code', () => { expect(classifyContent('https://serverfault.stackexchange.com/q/1', empty)).toBe('code'); - Network accessline 120
expect(classifyContent('https://serverfault.stackexchange.com/q/1', empty)).toBe('code'); - Network accessline 123
it('classifies developer.mozilla.org URLs as docs', () => { expect(classifyContent('https://developer.mozilla.org/en-US/docs/Web', empty)).toBe('docs'); - Network accessline 124
expect(classifyContent('https://developer.mozilla.org/en-US/docs/Web', empty)).toBe('docs'); - Network accessline 127
it('classifies devdocs.io URLs as docs', () => { expect(classifyContent('https://devdocs.io/javascript/', empty)).toBe('docs'); - Network accessline 128
expect(classifyContent('https://devdocs.io/javascript/', empty)).toBe('docs'); - Network accessline 131
it('classifies hosts starting with docs. as docs', () => { expect(classifyContent('https://docs.example.com/', empty)).toBe('docs'); - Network accessline 132
expect(classifyContent('https://docs.example.com/', empty)).toBe('docs'); - Network accessline 135
it('classifies /docs/ path as docs', () => { expect(classifyContent('https://example.com/docs/intro', empty)).toBe('docs'); - Network accessline 136
expect(classifyContent('https://example.com/docs/intro', empty)).toBe('docs'); - Network accessline 139
it('classifies /documentation/ path as docs', () => { expect(classifyContent('https://example.com/documentation/intro', empty)).toBe('docs'); - Network accessline 140
expect(classifyContent('https://example.com/documentation/intro', empty)).toBe('docs'); - Network accessline 143
it('classifies /reference/ path as docs', () => { expect(classifyContent('https://example.com/reference/widgets', empty)).toBe('docs'); - Network accessline 144
expect(classifyContent('https://example.com/reference/widgets', empty)).toBe('docs'); - Network accessline 147
it('classifies /api/ path as docs', () => { expect(classifyContent('https://example.com/api/v1', empty)).toBe('docs'); - Network accessline 148
expect(classifyContent('https://example.com/api/v1', empty)).toBe('docs'); - Network accessline 157
it('JSON-LD beats og:type', () => { const html = `<html><head>${recipeJsonLd}<meta property="og:type" content="article"></head><body></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('recipe'); - Network accessline 158
const html = `<html><head>${recipeJsonLd}<meta property="og:type" content="article"></head><body></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('recipe'); }); - Network accessline 159
expect(classifyContent('https://example.com/x', html)).toBe('recipe'); - Network accessline 162
it('JSON-LD beats host', () => { const html = `<html><head>${recipeJsonLd}</head><body></body></html>`; expect(classifyContent('https://github.com/foo/bar', html)).toBe('recipe'); - Network accessline 163
const html = `<html><head>${recipeJsonLd}</head><body></body></html>`; expect(classifyContent('https://github.com/foo/bar', html)).toBe('recipe'); }); - Network accessline 164
expect(classifyContent('https://github.com/foo/bar', html)).toBe('recipe'); - Network accessline 167
it('og:type beats host', () => { expect(classifyContent('https://github.com/foo/bar', withOgType('article'))).toBe('news'); - Network accessline 168
expect(classifyContent('https://github.com/foo/bar', withOgType('article'))).toBe('news'); - Network accessline 171
it('host beats body markers', () => { const html = `<html><head></head><body><div itemtype="https://schema.org/Recipe"></div></body></html>`; - Network accessline 172
const html = `<html><head></head><body><div itemtype="https://schema.org/Recipe"></div></body></html>`; - Network accessline 173
expect(classifyContent('https://github.com/foo/bar', html)).toBe('code'); - Network accessline 177
describe('classifyContent — body marker fallback', () => { it('classifies microdata Recipe itemtype as recipe', () => { const html = `<html><head></head><body><div itemscope itemtype="https://schema.org/Recipe"></div></body></html>`; - Network accessline 178
it('classifies microdata Recipe itemtype as recipe', () => { const html = `<html><head></head><body><div itemscope itemtype="https://schema.org/Recipe"></div></body></html>`; expect(classifyContent('https://example.com/x', html)).to - Network accessline 179
const html = `<html><head></head><body><div itemscope itemtype="https://schema.org/Recipe"></div></body></html>`; - Network accessline 180
expect(classifyContent('https://example.com/x', html)).toBe('recipe'); - Network accessline 183
it('classifies microdata Product itemtype as product', () => { const html = `<html><head></head><body><div itemscope itemtype="http://schema.org/Product"></div></body></html>`; - Network accessline 184
const html = `<html><head></head><body><div itemscope itemtype="http://schema.org/Product"></div></body></html>`; - Network accessline 185
expect(classifyContent('https://example.com/x', html)).toBe('product'); - Network accessline 188
it('classifies <article> + <time datetime> as news', () => { const html = `<html><head></head><body><article><time datetime="2024-01-01">Jan 1</time><p>Body</p></article></body></html>`; expect(classifyContent('https://example.com/x - Network accessline 189
const html = `<html><head></head><body><article><time datetime="2024-01-01">Jan 1</time><p>Body</p></article></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('news'); }); - Network accessline 190
expect(classifyContent('https://example.com/x', html)).toBe('news'); - Network accessline 193
it('does not classify lone <article> without <time datetime> as news', () => { const html = `<html><head></head><body><article><p>Body</p></article></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('generi - Network accessline 194
const html = `<html><head></head><body><article><p>Body</p></article></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('generic'); }); - Network accessline 195
expect(classifyContent('https://example.com/x', html)).toBe('generic'); - Network accessline 200
it('returns generic when no signals match', () => { const html = `<html><head><title>Hello</title></head><body><p>Hi</p></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('generic'); - Network accessline 201
const html = `<html><head><title>Hello</title></head><body><p>Hi</p></body></html>`; expect(classifyContent('https://example.com/x', html)).toBe('generic'); }); - Network accessline 202
expect(classifyContent('https://example.com/x', html)).toBe('generic'); - Network accessline 205
it('returns generic for empty HTML', () => { expect(classifyContent('https://example.com/x', '')).toBe('generic'); - Network accessline 206
expect(classifyContent('https://example.com/x', '')).toBe('generic');
tests/unit/extraction/v1/news.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
describe('extractNews — readability path', () => { const url = 'https://example.com/news/distributed'; - Network accessline 31
const url = 'https://example.com/news/distributed'; - Network accessline 47
describe('extractNews — date heuristics', () => { const url = 'https://example.com/news/article'; - Network accessline 48
const url = 'https://example.com/news/article'; - Network accessline 79
it('falls back to JSON-LD datePublished', async () => { const jsonLd = `<script type="application/ld+json">${JSON.stringify({ '@context': 'https://schema.org', - Network accessline 80
const jsonLd = `<script type="application/ld+json">${JSON.stringify({ '@context': 'https://schema.org', '@type': 'NewsArticle', - Network accessline 81
'@context': 'https://schema.org', - Network accessline 112
<script type="application/ld+json">{not valid json</script> </head><body><article>${ARTICLE_BODY}</article></body></html>`; const result = await extractNews(html, 'https://example.com/x'); - Network accessline 113
</head><body><article>${ARTICLE_BODY}</article></body></html>`; const result = await extractNews(html, 'https://example.com/x'); expect(result).not.toBeNull(); - Network accessline 114
const result = await extractNews(html, 'https://example.com/x');
tests/unit/extraction/v1/pdf.test.ts
- Executable scriptline 1
Executable file - Network accessline 45
it('extracts text from a PDF buffer (regression for pdf-parse v2 API)', async () => { const extractor = new V1Extractor(); const result = await extractor.extract('', 'https://arxiv.org/pdf/2301.00001v1', { - Network accessline 46
const extractor = new V1Extractor(); const result = await extractor.extract('', 'https://arxiv.org/pdf/2301.00001v1', { contentType: 'application/pdf', - Network accessline 47
const result = await extractor.extract('', 'https://arxiv.org/pdf/2301.00001v1', { - Network accessline 64
const result = await extractor.extract( '<html><body><h1>Hi</h1><p>Some article content that should run through readability.</p></body></html>', 'https://example.com/article', - Network accessline 65
'<html><body><h1>Hi</h1><p>Some article content that should run through readability.</p></body></html>', 'https://example.com/article', { contentType: 'text/html' }, - Network accessline 66
'https://example.com/article',
tests/unit/extraction/v1/product.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
const FULL_PRODUCT = { '@context': 'https://schema.org', - Network accessline 9
'@context': 'https://schema.org', - Network accessline 13
brand: { '@type': 'Brand', name: 'Acme' }, sku: 'AWP-001', image: 'https://example.com/img/widget.jpg', - Network accessline 14
sku: 'AWP-001', image: 'https://example.com/img/widget.jpg', offers: { - Network accessline 15
image: 'https://example.com/img/widget.jpg', - Network accessline 29
it('builds markdown from a full Product JSON-LD block', async () => { const html = htmlWithJsonLd(FULL_PRODUCT); const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 30
const html = htmlWithJsonLd(FULL_PRODUCT); const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 31
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 39
expect(result!.markdown).toContain('**Rating:** 4.5 (321 reviews)'); expect(result!.markdown).toContain('**SKU:** AWP-001'); expect(result!.metadata.og_image).toBe('https://example.com/img/widget.jpg'); - Network accessline 40
expect(result!.markdown).toContain('**SKU:** AWP-001'); expect(result!.metadata.og_image).toBe('https://example.com/img/widget.jpg'); }); - Network accessline 41
expect(result!.metadata.og_image).toBe('https://example.com/img/widget.jpg'); - Network accessline 44
it('handles brand as a plain string', async () => { const html = htmlWithJsonLd({ ...FULL_PRODUCT, brand: 'BrandName' }); const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 45
const html = htmlWithJsonLd({ ...FULL_PRODUCT, brand: 'BrandName' }); const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 46
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 52
const html = htmlWithJsonLd({ ...FULL_PRODUCT, image: ['https://example.com/a.jpg', 'https://example.com/b.jpg'], - Network accessline 53
...FULL_PRODUCT, image: ['https://example.com/a.jpg', 'https://example.com/b.jpg'], }); - Network accessline 54
image: ['https://example.com/a.jpg', 'https://example.com/b.jpg'], - Network accessline 55
}); const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 56
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 57
expect(result).not.toBeNull(); expect(result!.metadata.og_image).toBe('https://example.com/a.jpg'); }); - Network accessline 58
expect(result!.metadata.og_image).toBe('https://example.com/a.jpg'); - Network accessline 67
], }); const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 68
}); const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 69
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 78
description: 'A widget with absolutely no extra metadata to speak of in this product listing, but enough description text to clear the minimum content length threshold easily.', }); const result = await extractProduct(html, 'https:/ - Network accessline 79
}); const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 80
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 95
<meta property="product:price:amount" content="49.50"> <meta property="product:price:currency" content="USD"> <meta property="og:image" content="https://example.com/og.jpg"> - Network accessline 96
<meta property="product:price:currency" content="USD"> <meta property="og:image" content="https://example.com/og.jpg"> </head><body></body></html>`; - Network accessline 97
<meta property="og:image" content="https://example.com/og.jpg"> - Network accessline 98
</head><body></body></html>`; const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 99
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 103
expect(result!.markdown).toContain('OpenGraph widget'); expect(result!.markdown).toContain('**Price:** USD 49.50'); expect(result!.metadata.og_image).toBe('https://example.com/og.jpg'); - Network accessline 104
expect(result!.markdown).toContain('**Price:** USD 49.50'); expect(result!.metadata.og_image).toBe('https://example.com/og.jpg'); }); - Network accessline 105
expect(result!.metadata.og_image).toBe('https://example.com/og.jpg'); - Network accessline 112
<meta property="og:description" content="Legacy openGraph widget content with enough body to clear the minimum content threshold easily."> </head><body></body></html>`; const result = await extractProduct(html, 'https://example.com/ - Network accessline 113
</head><body></body></html>`; const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 114
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 123
<script type="application/ld+json">${JSON.stringify(FULL_PRODUCT)}</script> </head><body></body></html>`; const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 124
</head><body></body></html>`; const result = await extractProduct(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 125
const result = await extractProduct(html, 'https://example.com/p'); - Network accessline 132
it('returns null when JSON-LD type is not Product and no OG', async () => { const html = htmlWithJsonLd({ '@type': 'Recipe', name: 'Cake' }); expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); - Network accessline 133
const html = htmlWithJsonLd({ '@type': 'Recipe', name: 'Cake' }); expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); }); - Network accessline 134
expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); - Network accessline 137
it('returns null on totally empty HTML', async () => { expect(await extractProduct('', 'https://example.com/p')).toBeNull(); - Network accessline 138
expect(await extractProduct('', 'https://example.com/p')).toBeNull(); - Network accessline 143
<script type="application/ld+json">{not valid</script> </head><body></body></html>`; expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); - Network accessline 144
</head><body></body></html>`; expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); }); - Network accessline 145
expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); - Network accessline 148
it('returns null when markdown is below threshold', async () => { const html = htmlWithJsonLd({ '@type': 'Product', name: 'X' }); expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); - Network accessline 149
const html = htmlWithJsonLd({ '@type': 'Product', name: 'X' }); expect(await extractProduct(html, 'https://example.com/p')).toBeNull(); }); - Network accessline 150
expect(await extractProduct(html, 'https://example.com/p')).toBeNull();
tests/unit/extraction/v1/recipe.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
const FULL_RECIPE = { '@context': 'https://schema.org', - Network accessline 10
'@context': 'https://schema.org', - Network accessline 37
it('builds markdown from a full Recipe JSON-LD block', async () => { const html = htmlWithJsonLd(FULL_RECIPE); const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 38
const html = htmlWithJsonLd(FULL_RECIPE); const result = await extractRecipe(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 39
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 61
recipeInstructions: ['Step one.', 'Step two.', 'Step three.'], }); const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 62
}); const result = await extractRecipe(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 63
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 69
it('handles author as a plain string', async () => { const html = htmlWithJsonLd({ ...FULL_RECIPE, author: 'Plain Author' }); const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 70
const html = htmlWithJsonLd({ ...FULL_RECIPE, author: 'Plain Author' }); const result = await extractRecipe(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 71
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 76
it('handles @type as schema.org URI', async () => { const html = htmlWithJsonLd({ ...FULL_RECIPE, '@type': 'http://schema.org/Recipe' }); - Network accessline 77
const html = htmlWithJsonLd({ ...FULL_RECIPE, '@type': 'http://schema.org/Recipe' }); - Network accessline 78
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 82
it('handles @type as array containing Recipe', async () => { const html = htmlWithJsonLd({ ...FULL_RECIPE, '@type': ['CreativeWork', 'Recipe'] }); const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 83
const html = htmlWithJsonLd({ ...FULL_RECIPE, '@type': ['CreativeWork', 'Recipe'] }); const result = await extractRecipe(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 84
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 94
void cookTime; const html = htmlWithJsonLd(partial); const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 95
const html = htmlWithJsonLd(partial); const result = await extractRecipe(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 96
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 105
void description; const html = htmlWithJsonLd(partial); const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 106
const html = htmlWithJsonLd(partial); const result = await extractRecipe(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 107
const result = await extractRecipe(html, 'https://example.com/r'); - Network accessline 114
it('returns null when JSON-LD type is not Recipe', async () => { const html = htmlWithJsonLd({ '@type': 'Product', name: 'Widget' }); expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); - Network accessline 115
const html = htmlWithJsonLd({ '@type': 'Product', name: 'Widget' }); expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); }); - Network accessline 116
expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); - Network accessline 119
it('returns null when there is no JSON-LD at all', async () => { const html = '<html><head></head><body><p>nothing</p></body></html>'; expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); - Network accessline 120
const html = '<html><head></head><body><p>nothing</p></body></html>'; expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); }); - Network accessline 121
expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); - Network accessline 126
<script type="application/ld+json">{not valid</script> </head><body></body></html>`; expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); - Network accessline 127
</head><body></body></html>`; expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); }); - Network accessline 128
expect(await extractRecipe(html, 'https://example.com/x')).toBeNull(); - Network accessline 131
it('returns null when generated markdown is below threshold', async () => { const html = htmlWithJsonLd({ '@type': 'Recipe', name: 'X' }); const result = await extractRecipe(html, 'https://example.com/x'); - Network accessline 132
const html = htmlWithJsonLd({ '@type': 'Recipe', name: 'X' }); const result = await extractRecipe(html, 'https://example.com/x'); expect(result).toBeNull(); - Network accessline 133
const result = await extractRecipe(html, 'https://example.com/x');
tests/unit/extraction/v1/routed.test.ts
- Executable scriptline 1
Executable file - Network accessline 56
const HTML = '<html><body><article><p>some body content here</p></article></body></html>'; const URL = 'https://example.com/some/page'; - Network accessline 57
const URL = 'https://example.com/some/page'; - Network accessline 195
const result = await routedExtract({ html: githubHtml, url: 'https://github.com/owner/repo', - Network accessline 196
html: githubHtml, url: 'https://github.com/owner/repo', }); - Network accessline 197
url: 'https://github.com/owner/repo', - Network accessline 230
const result = await routedExtract({ html: fx, url: 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', - Network accessline 231
html: fx, url: 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', }); - Network accessline 232
url: 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', - Network accessline 252
const result = await routedExtract({ html: fx, url: 'https://www.amazon.com/dp/B08N5WRWNW/', - Network accessline 253
html: fx, url: 'https://www.amazon.com/dp/B08N5WRWNW/', }); - Network accessline 254
url: 'https://www.amazon.com/dp/B08N5WRWNW/', - Network accessline 275
const result = await routedExtract({ html: HTML, url: 'https://example.com/some/random/page', - Network accessline 276
html: HTML, url: 'https://example.com/some/random/page', }); - Network accessline 277
url: 'https://example.com/some/random/page', - Network accessline 290
const result = await routedExtract({ html: fx, url: 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', - Network accessline 291
html: fx, url: 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', }); - Network accessline 292
url: 'https://old.reddit.com/r/programming/comments/abc123/whats_your_favorite_typescript_trick/', - Network accessline 309
const result = await routedExtract({ html: fx, url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', - Network accessline 310
html: fx, url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', }); - Network accessline 311
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', - Network accessline 328
const result = await routedExtract({ html: fx, url: 'https://www.amazon.com/dp/B08N5WRWNW/', - Network accessline 329
html: fx, url: 'https://www.amazon.com/dp/B08N5WRWNW/', }); - Network accessline 330
url: 'https://www.amazon.com/dp/B08N5WRWNW/',
tests/unit/extraction/v1/schemas/Article.test.ts
- Executable scriptline 1
Executable file - Network accessline 17
describe('extractArticle', () => { const url = 'https://example.com/article'; - Network accessline 18
const url = 'https://example.com/article'; - Network accessline 72
'', '## External links', '- https://example.com', - Network accessline 73
'## External links', '- https://example.com', '', - Network accessline 74
'- https://example.com',
tests/unit/extraction/v1/schemas/CodeSnippet.test.ts
tests/unit/extraction/v1/schemas/EventListing.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
it('extracts an Event with nested location', async () => { const html = htmlWithJsonLd({ '@context': 'https://schema.org', - Network accessline 10
const html = htmlWithJsonLd({ '@context': 'https://schema.org', '@type': 'Event', - Network accessline 11
'@context': 'https://schema.org', - Network accessline 27
}, }); const result = await extractEventListing(html, 'https://example.com/e'); - Network accessline 28
}); const result = await extractEventListing(html, 'https://example.com/e'); expect(result).not.toBeNull(); - Network accessline 29
const result = await extractEventListing(html, 'https://example.com/e'); - Network accessline 34
expect(result!.location).toBe('Convention Center'); expect(result!.description).toBe('Annual tech conference.'); expect(result!.url).toBe('https://example.com/e'); - Network accessline 35
expect(result!.description).toBe('Annual tech conference.'); expect(result!.url).toBe('https://example.com/e'); }); - Network accessline 36
expect(result!.url).toBe('https://example.com/e'); - Network accessline 46
<meta property="og:description" content="Annual gathering"> </head><body><h1>TechConf 2025</h1></body></html>`; const result = await extractEventListing(html, 'https://example.com/e'); - Network accessline 47
</head><body><h1>TechConf 2025</h1></body></html>`; const result = await extractEventListing(html, 'https://example.com/e'); expect(result).not.toBeNull(); - Network accessline 48
const result = await extractEventListing(html, 'https://example.com/e'); - Network accessline 59
<time itemprop="startDate" datetime="2025-10-01T18:00:00Z">Oct 1</time> </body></html>`; const result = await extractEventListing(html, 'https://example.com/e'); - Network accessline 60
</body></html>`; const result = await extractEventListing(html, 'https://example.com/e'); expect(result!.startDate).toBe('2025-10-01T18:00:00Z'); - Network accessline 61
const result = await extractEventListing(html, 'https://example.com/e'); - Network accessline 65
it('returns null when name and startDate are both missing', async () => { expect(await extractEventListing('<!doctype html><html><body></body></html>', 'https://e.com')).toBeNull(); - Network accessline 66
expect(await extractEventListing('<!doctype html><html><body></body></html>', 'https://e.com')).toBeNull(); - Network accessline 69
it('returns null on empty input', async () => { expect(await extractEventListing('', 'https://e.com')).toBeNull(); - Network accessline 70
expect(await extractEventListing('', 'https://e.com')).toBeNull();
tests/unit/extraction/v1/schemas/JobPosting.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
it('extracts a JobPosting with nested organization, location, and salary', async () => { const html = htmlWithJsonLd({ '@context': 'https://schema.org', - Network accessline 10
const html = htmlWithJsonLd({ '@context': 'https://schema.org', '@type': 'JobPosting', - Network accessline 11
'@context': 'https://schema.org', - Network accessline 41
}, }); const result = await extractJobPosting(html, 'https://example.com/jobs/1'); - Network accessline 42
}); const result = await extractJobPosting(html, 'https://example.com/jobs/1'); expect(result).not.toBeNull(); - Network accessline 43
const result = await extractJobPosting(html, 'https://example.com/jobs/1'); - Network accessline 51
expect(result!.baseSalary).toBe('USD 120000-160000/YEAR'); expect(result!.description).toBe('Build and maintain backend services.'); expect(result!.url).toBe('https://example.com/jobs/1'); - Network accessline 52
expect(result!.description).toBe('Build and maintain backend services.'); expect(result!.url).toBe('https://example.com/jobs/1'); }); - Network accessline 53
expect(result!.url).toBe('https://example.com/jobs/1'); - Network accessline 64
<meta property="og:description" content="Join our team"> </head><body><h1>Senior Software Engineer</h1></body></html>`; const result = await extractJobPosting(html, 'https://example.com/jobs/1'); - Network accessline 65
</head><body><h1>Senior Software Engineer</h1></body></html>`; const result = await extractJobPosting(html, 'https://example.com/jobs/1'); expect(result).not.toBeNull(); - Network accessline 66
const result = await extractJobPosting(html, 'https://example.com/jobs/1'); - Network accessline 78
<meta property="og:title" content="Backend Engineer"> </head><body></body></html>`; const result = await extractJobPosting(html, 'https://example.com/jobs/2'); - Network accessline 79
</head><body></body></html>`; const result = await extractJobPosting(html, 'https://example.com/jobs/2'); expect(result!.title).toBe('Backend Engineer'); - Network accessline 80
const result = await extractJobPosting(html, 'https://example.com/jobs/2'); - Network accessline 84
it('returns null when title is missing', async () => { expect(await extractJobPosting('<!doctype html><html><body></body></html>', 'https://e.com')).toBeNull(); - Network accessline 85
expect(await extractJobPosting('<!doctype html><html><body></body></html>', 'https://e.com')).toBeNull(); - Network accessline 88
it('returns null on empty input', async () => { expect(await extractJobPosting('', 'https://e.com')).toBeNull(); - Network accessline 89
expect(await extractJobPosting('', 'https://e.com')).toBeNull();
tests/unit/extraction/v1/schemas/Paper.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
it('extracts a ScholarlyArticle', async () => { const html = htmlWithJsonLd({ '@context': 'https://schema.org', - Network accessline 10
const html = htmlWithJsonLd({ '@context': 'https://schema.org', '@type': 'ScholarlyArticle', - Network accessline 11
'@context': 'https://schema.org', - Network accessline 20
identifier: 'doi:10.1234/abcd.5678', }); const result = await extractPaper(html, 'https://journal.example.com/p'); - Network accessline 21
}); const result = await extractPaper(html, 'https://journal.example.com/p'); expect(result).not.toBeNull(); - Network accessline 22
const result = await extractPaper(html, 'https://journal.example.com/p'); - Network accessline 41
<meta name="citation_arxiv_id" content="2301.00001"> </head><body></body></html>`; const result = await extractPaper(html, 'https://example.com/x'); - Network accessline 42
</head><body></body></html>`; const result = await extractPaper(html, 'https://example.com/x'); expect(result).not.toBeNull(); - Network accessline 43
const result = await extractPaper(html, 'https://example.com/x'); - Network accessline 55
<meta name="citation_title" content="From arxiv"> </head><body></body></html>`; const result = await extractPaper(html, 'https://arxiv.org/abs/2401.12345'); - Network accessline 56
</head><body></body></html>`; const result = await extractPaper(html, 'https://arxiv.org/abs/2401.12345'); expect(result!.arxivId).toBe('2401.12345'); - Network accessline 57
const result = await extractPaper(html, 'https://arxiv.org/abs/2401.12345'); - Network accessline 64
<p class="abstract">DOM-derived abstract goes here and is sufficiently long.</p> </body></html>`; const result = await extractPaper(html, 'https://example.com/p'); - Network accessline 65
</body></html>`; const result = await extractPaper(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 66
const result = await extractPaper(html, 'https://example.com/p'); - Network accessline 72
it('returns null when both title and abstract are missing', async () => { expect(await extractPaper('<!doctype html><html><body></body></html>', 'https://e.com')).toBeNull(); - Network accessline 73
expect(await extractPaper('<!doctype html><html><body></body></html>', 'https://e.com')).toBeNull(); - Network accessline 76
it('returns null on empty input', async () => { expect(await extractPaper('', 'https://e.com')).toBeNull(); - Network accessline 77
expect(await extractPaper('', 'https://e.com')).toBeNull();
tests/unit/extraction/v1/schemas/Product.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
const PRODUCT = { '@context': 'https://schema.org', - Network accessline 9
'@context': 'https://schema.org', - Network accessline 13
brand: { '@type': 'Brand', name: 'Acme' }, sku: 'AWP-001', image: 'https://example.com/img/widget.jpg', - Network accessline 14
sku: 'AWP-001', image: 'https://example.com/img/widget.jpg', offers: { '@type': 'Offer', price: '129.99', priceCurrency: 'USD' }, - Network accessline 15
image: 'https://example.com/img/widget.jpg', - Network accessline 21
it('extracts a full Product JSON-LD block', async () => { const html = htmlWithJsonLd(PRODUCT); const result = await extractProductSchema(html, 'https://example.com/p'); - Network accessline 22
const html = htmlWithJsonLd(PRODUCT); const result = await extractProductSchema(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 23
const result = await extractProductSchema(html, 'https://example.com/p'); - Network accessline 27
expect(result!.brand).toBe('Acme'); expect(result!.sku).toBe('AWP-001'); expect(result!.image).toBe('https://example.com/img/widget.jpg'); - Network accessline 28
expect(result!.sku).toBe('AWP-001'); expect(result!.image).toBe('https://example.com/img/widget.jpg'); expect(result!.price).toEqual({ amount: 129.99, currency: 'USD' }); - Network accessline 29
expect(result!.image).toBe('https://example.com/img/widget.jpg'); - Network accessline 40
], }); const result = await extractProductSchema(html, 'https://example.com/p'); - Network accessline 41
}); const result = await extractProductSchema(html, 'https://example.com/p'); expect(result!.price).toEqual({ amount: 49.5, currency: 'EUR' }); - Network accessline 42
const result = await extractProductSchema(html, 'https://example.com/p'); - Network accessline 48
<meta property="og:title" content="OG Widget"> <meta property="og:description" content="OG description"> <meta property="og:image" content="https://example.com/og.jpg"> - Network accessline 49
<meta property="og:description" content="OG description"> <meta property="og:image" content="https://example.com/og.jpg"> <meta property="product:price:amount" content="19.99"> - Network accessline 50
<meta property="og:image" content="https://example.com/og.jpg"> - Network accessline 52
<meta property="product:price:currency" content="USD"> </head><body></body></html>`; const result = await extractProductSchema(html, 'https://example.com/p'); - Network accessline 53
</head><body></body></html>`; const result = await extractProductSchema(html, 'https://example.com/p'); expect(result).not.toBeNull(); - Network accessline 54
const result = await extractProductSchema(html, 'https://example.com/p'); - Network accessline 56
expect(result!.name).toBe('OG Widget'); expect(result!.price).toEqual({ amount: 19.99, currency: 'USD' }); expect(result!.image).toBe('https://example.com/og.jpg'); - Network accessline 57
expect(result!.price).toEqual({ amount: 19.99, currency: 'USD' }); expect(result!.image).toBe('https://example.com/og.jpg'); }); - Network accessline 58
expect(result!.image).toBe('https://example.com/og.jpg'); - Network accessline 61
it('returns null when no signals are present', async () => { expect(await extractProductSchema('<!doctype html><html><body></body></html>', 'https://example.com/p')).toBeNull(); - Network accessline 62
expect(await extractProductSchema('<!doctype html><html><body></body></html>', 'https://example.com/p')).toBeNull(); - Network accessline 65
it('returns null when @type is wrong and no OG', async () => { const html = htmlWithJsonLd({ ...PRODUCT, '@type': 'Article' }); expect(await extractProductSchema(html, 'https://example.com/p')).toBeNull(); - Network accessline 66
const html = htmlWithJsonLd({ ...PRODUCT, '@type': 'Article' }); expect(await extractProductSchema(html, 'https://example.com/p')).toBeNull(); }); - Network accessline 67
expect(await extractProductSchema(html, 'https://example.com/p')).toBeNull(); - Network accessline 70
it('returns null on empty input', async () => { expect(await extractProductSchema('', 'https://example.com/p')).toBeNull(); - Network accessline 71
expect(await extractProductSchema('', 'https://example.com/p')).toBeNull();
tests/unit/extraction/v1/schemas/Recipe.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
const VALID_RECIPE = { '@context': 'https://schema.org', - Network accessline 9
'@context': 'https://schema.org', - Network accessline 28
it('extracts a valid Recipe JSON-LD block', async () => { const html = htmlWithJsonLd(VALID_RECIPE); const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 29
const html = htmlWithJsonLd(VALID_RECIPE); const result = await extractRecipeSchema(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 30
const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 49
const html = htmlWithJsonLd({ ...VALID_RECIPE, '@type': 'https://schema.org/Recipe', - Network accessline 50
...VALID_RECIPE, '@type': 'https://schema.org/Recipe', }); - Network accessline 51
'@type': 'https://schema.org/Recipe', - Network accessline 52
}); const result = await extractRecipeSchema(html, 'https://example.com/r'); expect(result).not.toBeNull(); - Network accessline 53
const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 58
it('returns null when no JSON-LD recipe and no markdown fallback', async () => { const html = '<!doctype html><html><body><h1>nothing</h1></body></html>'; const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 59
const html = '<!doctype html><html><body><h1>nothing</h1></body></html>'; const result = await extractRecipeSchema(html, 'https://example.com/r'); expect(result).toBeNull(); - Network accessline 60
const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 64
it('returns null when @type is wrong', async () => { const html = htmlWithJsonLd({ ...VALID_RECIPE, '@type': 'Article' }); const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 65
const html = htmlWithJsonLd({ ...VALID_RECIPE, '@type': 'Article' }); const result = await extractRecipeSchema(html, 'https://example.com/r'); expect(result).toBeNull(); - Network accessline 66
const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 70
it('returns null on empty input', async () => { expect(await extractRecipeSchema('', 'https://example.com/r')).toBeNull(); - Network accessline 71
expect(await extractRecipeSchema('', 'https://example.com/r')).toBeNull(); - Network accessline 75
const html = '<!doctype html><html><head><script type="application/ld+json">{ not json }</script></head><body></body></html>'; const result = await extractRecipeSchema(html, 'https://example.com/r'); - Network accessline 76
'<!doctype html><html><head><script type="application/ld+json">{ not json }</script></head><body></body></html>'; const result = await extractRecipeSchema(html, 'https://example.com/r'); expect(result).toBeNull(); - Network accessline 77
const result = await extractRecipeSchema(html, 'https://example.com/r');
tests/unit/extraction/v1/schemas/index.test.ts
- Executable scriptline 1
Executable file - Network accessline 28
it('dispatches to each extractor without throwing', async () => { for (const schema of NAMED_SCHEMAS) { const result = await extractNamedSchema(schema, '<html><body></body></html>', 'https://example.com/'); - Network accessline 30
const result = await extractNamedSchema(schema, '<html><body></body></html>', 'https://example.com/'); - Network accessline 40
<p>Another paragraph adds enough body text to make extraction succeed.</p> </article></body></html>`; const result = await extractNamedSchema('Article', html, 'https://example.com/a'); - Network accessline 41
</article></body></html>`; const result = await extractNamedSchema('Article', html, 'https://example.com/a'); if (result !== null) { - Network accessline 42
const result = await extractNamedSchema('Article', html, 'https://example.com/a');
tests/unit/extraction/v1/schemas/local-llm.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
const TIER: LocalModelTier = { available: true, endpoint: 'http://localhost:1234', - Network accessline 9
available: true, endpoint: 'http://localhost:1234', model: 'test-model', - Network accessline 10
endpoint: 'http://localhost:1234', - Network accessline 67
schema: { type: 'object', properties: { plan: { type: 'string' } } }, html: HTML, url: 'https://acme.example/pricing', - Network accessline 68
html: HTML, url: 'https://acme.example/pricing', tier: TIER, - Network accessline 69
url: 'https://acme.example/pricing', - Network accessline 100
expect(fetchSpy.mock.calls[0]![0]).toBe('http://localhost:1234/v1/chat/completions'); - Network accessline 215
schema: { type: 'object', properties: { plan: { type: 'string' } } }, html: buriedHtml, url: 'https://x.test/pricing', - Network accessline 216
html: buriedHtml, url: 'https://x.test/pricing', tier: TIER, - Network accessline 217
url: 'https://x.test/pricing',
tests/unit/fetch/action-executor.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/ai-solve.test.ts
- Executable scriptline 1
Executable file - Instruction override signalline 270
// WHY: readInstruction returns attacker-controlled text scraped from the // challenge page. If it is interpolated verbatim as instructions, a page // could hijack the vision model ("ignore previous instructions, return …"). - Instruction override signalline 271
// challenge page. If it is interpolated verbatim as instructions, a page // could hijack the vision model ("ignore previous instructions, return …"). // The prompt must quote it AS DATA between explicit markers, and the JSON - Instruction override signalline 272
// could hijack the vision model ("ignore previous instructions, return …").
tests/unit/fetch/auth.test.ts
- Executable scriptline 1
Executable file - Network accessline 127
it('returns sessions from CDP client when cdpUrl is configured', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 128
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 131
vi.mocked(discoverSessions).mockResolvedValue([ { id: '1', url: 'https://google.com', title: 'Google', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 132
{ id: '1', url: 'https://google.com', title: 'Google', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 133
{ id: '2', url: 'https://github.com', title: 'GitHub', webSocketDebuggerUrl: 'ws://localhost:9222/2' }, - Network accessline 137
expect(sessions).toHaveLength(2); expect(sessions[0].title).toBe('Google'); expect(sessions[1].url).toBe('https://github.com'); - Network accessline 138
expect(sessions[0].title).toBe('Google'); expect(sessions[1].url).toBe('https://github.com'); }); - Network accessline 139
expect(sessions[1].url).toBe('https://github.com'); - Network accessline 151
it('returns empty array when CDP discovery fails', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 152
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 161
it('handles CDP discovery throwing', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 162
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 190
it('handles concurrent calls', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 191
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 194
vi.mocked(discoverSessions).mockResolvedValue([ { id: '1', url: 'https://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x/1' }, - Network accessline 195
{ id: '1', url: 'https://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x/1' }, - Network accessline 229
it('falls back to CDP when no storage state or profile configured but CDP is reachable', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 230
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 235
const result = await getAuthOptions(); expect(result).not.toBeNull(); expect(result?.cdpUrl).toBe('http://localhost:9222'); - Network accessline 236
expect(result).not.toBeNull(); expect(result?.cdpUrl).toBe('http://localhost:9222'); }); - Network accessline 237
expect(result?.cdpUrl).toBe('http://localhost:9222'); - Network accessline 240
it('returns null when CDP is configured but not reachable', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 241
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 252
writeFileSync(stateFile, JSON.stringify({ cookies: [] })); process.env.WIGOLO_AUTH_STATE_PATH = stateFile; process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 253
process.env.WIGOLO_AUTH_STATE_PATH = stateFile; process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; resetConfig(); - Network accessline 254
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 263
it('prefers Chrome profile over CDP', async () => { process.env.WIGOLO_CHROME_PROFILE_PATH = tempDir; process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 264
process.env.WIGOLO_CHROME_PROFILE_PATH = tempDir; process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; resetConfig(); - Network accessline 265
process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 279
it('handles isCDPReachable throwing', async () => { process.env.WIGOLO_CDP_URL = 'http://localhost:9222'; - Network accessline 280
process.env.WIGOLO_CDP_URL = 'http://localhost:9222';
tests/unit/fetch/auto-pass.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/behavior-slow-runner.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/behavior.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/browser-acquire.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/browser-pool-multi.test.ts
- Executable scriptline 1
Executable file - Network accessline 17
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 18
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 19
url: () => 'https://example.com', - Access to secretsline 81
[Credential-related source omitted] - Network accessline 84
const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); await pool.fetchWithBrowser('https://example.com'); - Network accessline 85
await pool.fetchWithBrowser('https://example.com'); - Access to secretsline 94
[Credential-related source omitted] - Network accessline 99
it('fetchWithBrowser uses default type when none specified', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com'); - Network accessline 100
const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com'); expect(result.html).toContain('chromium page'); - Network accessline 101
const result = await pool.fetchWithBrowser('https://example.com'); - Network accessline 107
it('fetchWithBrowser uses specified browser type', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox - Network accessline 108
const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' }); expect(result.html).toContain('firefox page'); - Network accessline 109
const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' }); - Network accessline 114
it('fetchWithBrowser falls back to first type for unknown type', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'webk - Network accessline 116
const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'webkit' }); - Network accessline 128
const r1 = await pool.fetchWithBrowser('https://example.com'); - Network accessline 129
const r2 = await pool.fetchWithBrowser('https://example.com'); - Network accessline 130
const r3 = await pool.fetchWithBrowser('https://example.com'); - Network accessline 145
const r1 = await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' }); - Network accessline 150
it('shutdown closes all browser instances', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); await pool.fetchWithBrowser('https://example.com'); - Network accessline 151
const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); await pool.fetchWithBrowser('https://example.com'); await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' }); - Network accessline 152
await pool.fetchWithBrowser('https://example.com'); - Network accessline 153
await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' }); - Network accessline 162
const [r1, r2, r3] = await Promise.all([ pool.fetchWithBrowser('https://a.com', { browserType: 'chromium' }), - Network accessline 163
pool.fetchWithBrowser('https://a.com', { browserType: 'chromium' }), - Network accessline 164
pool.fetchWithBrowser('https://b.com', { browserType: 'firefox' }), - Network accessline 165
pool.fetchWithBrowser('https://c.com', { browserType: 'chromium' }), - Network accessline 174
it('getStats returns per-type pool statistics', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); await pool.fetchWithBrowser('https://example.com', { browserType: 'chromium' }); - Network accessline 176
await pool.fetchWithBrowser('https://example.com', { browserType: 'chromium' }); - Network accessline 197
const r1 = await pool.fetchWithBrowser('https://example.com'); - Network accessline 203
it('handles screenshot option', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com', { screenshot: true }); - Network accessline 204
const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com', { screenshot: true }); expect(result.screenshot).toBeDefined(); - Network accessline 205
const result = await pool.fetchWithBrowser('https://example.com', { screenshot: true }); - Network accessline 210
it('handles headers option', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com', { - Network accessline 211
const pool = new MultiBrowserPool({ browserTypes: ['chromium'] }); const result = await pool.fetchWithBrowser('https://example.com', { headers: { 'X-Custom': 'value' }, - Network accessline 212
const result = await pool.fetchWithBrowser('https://example.com', { - Network accessline 230
const r1 = await pool.fetchWithBrowser('https://stable.example.com/page1'); - Network accessline 231
const r2 = await pool.fetchWithBrowser('https://stable.example.com/page2'); - Network accessline 238
it('stores the used browser type in the result metadata', async () => { const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); const result = await pool.fetchWithBrowser('https://example.com', { browserType: ' - Network accessline 239
const pool = new MultiBrowserPool({ browserTypes: ['chromium', 'firefox'] }); const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' }); expect(result.method).toBe('browser'); - Network accessline 240
const result = await pool.fetchWithBrowser('https://example.com', { browserType: 'firefox' });
tests/unit/fetch/browser-pool.abort.test.ts
- Executable scriptline 1
Executable file - Network accessline 29
return Promise.resolve({ status: () => 200, url: () => 'https://example.com', - Network accessline 30
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 31
url: () => 'https://example.com', - Network accessline 95
const p = pool.fetchWithBrowser('https://slow.example.com', { signal: ac.signal }); - Network accessline 132
const p = pool.fetchWithBrowser('https://spa.example.com', { signal: ac.signal }); - Network accessline 157
await expect( pool.fetchWithBrowser('https://example.com', { signal: ac.signal }), - Network accessline 158
pool.fetchWithBrowser('https://example.com', { signal: ac.signal }),
tests/unit/fetch/browser-pool.cdp-direct.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 19
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 20
url: () => 'https://example.com', - Network accessline 101
it('OFF by default: the rung is NEVER attempted; the normal path is byte-unchanged', async () => { const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', { stealth: true }); - Network accessline 103
const result = await pool.fetchWithBrowser('https://plain.example', { stealth: true }); - Network accessline 113
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 114
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); expect(result.html).toContain('cdp-direct-rung'); - Network accessline 115
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 125
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 126
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); expect(result.html).toContain('local-tier'); - Network accessline 127
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 136
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 137
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); expect(result.html).toContain('cdp-direct-rung'); - Network accessline 138
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 148
state.cdpDirectReturnsNull = true; const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', {}); - Network accessline 149
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', {}); expect(result.html).toContain('local-tier'); - Network accessline 150
const result = await pool.fetchWithBrowser('https://blocked.example', {}); - Network accessline 160
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { - Network accessline 161
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { actions: [{ type: 'click', selector: '#x' }], - Network accessline 162
await pool.fetchWithBrowser('https://plain.example', { - Network accessline 172
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { - Network accessline 173
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { storageStatePath: '/tmp/state.json', - Network accessline 174
await pool.fetchWithBrowser('https://plain.example', { - Network accessline 184
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { screenshot: true }); - Network accessline 185
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { screenshot: true }); expect(state.cdpDirectCalls.length).toBe(0); - Network accessline 186
await pool.fetchWithBrowser('https://plain.example', { screenshot: true }); - Network accessline 194
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { - Network accessline 195
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://plain.example', { cdpUrl: 'ws://127.0.0.1:9222/devtools/browser/abc', - Network accessline 196
await pool.fetchWithBrowser('https://plain.example', {
tests/unit/fetch/browser-pool.challenge.test.ts
- Executable scriptline 1
Executable file - Network accessline 91
return Promise.resolve({ status: () => state.status, url: () => 'https://blocked.example/', - Network accessline 92
status: () => state.status, url: () => 'https://blocked.example/', headers: () => state.headers, - Network accessline 93
url: () => 'https://blocked.example/', - Network accessline 225
const pool = new MultiBrowserPool(); const start = Date.now(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 227
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 246
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 247
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 264
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://news.example/article'); - Network accessline 265
const res = await pool.fetchWithBrowser('https://news.example/article'); - Network accessline 280
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 281
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 294
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://news.example/article'); - Network accessline 295
const res = await pool.fetchWithBrowser('https://news.example/article'); - Network accessline 307
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 308
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 322
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 323
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 343
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 344
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 357
const pool = new MultiBrowserPool(); await expect(pool.fetchWithBrowser('https://blocked.example/')).rejects.toBeInstanceOf(ChallengeBlockedError); - Network accessline 358
await expect(pool.fetchWithBrowser('https://blocked.example/')).rejects.toBeInstanceOf(ChallengeBlockedError); - Network accessline 366
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://spa.example/'); - Network accessline 367
const res = await pool.fetchWithBrowser('https://spa.example/'); - Network accessline 384
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 385
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 405
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 406
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 435
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 436
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 452
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 453
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 472
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://news.example/article'); - Network accessline 473
const res = await pool.fetchWithBrowser('https://news.example/article'); - Network accessline 484
const controller = new AbortController(); const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/', { signal: controller.signal }); - Network accessline 485
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/', { signal: controller.signal }); const captured = p.catch((e) => e); - Network accessline 486
const p = pool.fetchWithBrowser('https://blocked.example/', { signal: controller.signal }); - Network accessline 521
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 522
const res = await pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 553
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 554
const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 604
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/'); - Network accessline 605
const p = pool.fetchWithBrowser('https://blocked.example/');
tests/unit/fetch/browser-pool.channel.test.ts
- Executable scriptline 1
Executable file - Network accessline 25
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 26
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 27
url: () => 'https://example.com', - Network accessline 110
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 126
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 127
await pool.fetchWithBrowser('https://b.example', { stealth: true }); - Network accessline 137
it('caches the successful probe: still uses channel:chrome on the second fetch (no bundled relaunch)', async () => { - Network accessline 141
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 142
await pool.fetchWithBrowser('https://b.example', { stealth: true }); - Network accessline 156
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 181
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 198
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 228
const result = await pool.fetchWithBrowser('https://plain.example', {}); // no stealth - Network accessline 255
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 279
await pool.fetchWithBrowser('https://a.example', { stealth: true });
tests/unit/fetch/browser-pool.clearance.test.ts
- Executable scriptline 1
Executable file - Network accessline 32
Promise.resolve({ status: () => state.status, url: () => 'https://blocked.example/', - Network accessline 33
status: () => state.status, url: () => 'https://blocked.example/', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 34
url: () => 'https://blocked.example/', - Network accessline 134
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/', { stealth: true }); - Network accessline 135
const p = pool.fetchWithBrowser('https://blocked.example/', { stealth: true }); - Network accessline 156
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/', { stealth: true }); - Network accessline 157
const p = pool.fetchWithBrowser('https://blocked.example/', { stealth: true }); - Network accessline 180
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://blocked.example/', { - Network accessline 181
await pool.fetchWithBrowser('https://blocked.example/', { - Network accessline 201
const pool = new MultiBrowserPool(); const p = pool.fetchWithBrowser('https://blocked.example/', { - Network accessline 202
const p = pool.fetchWithBrowser('https://blocked.example/', {
tests/unit/fetch/browser-pool.download.test.ts
- Executable scriptline 1
Executable file - Network accessline 59
return Promise.resolve({ status: () => 200, url: () => 'https://example.com/page', - Network accessline 60
status: () => 200, url: () => 'https://example.com/page', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 61
url: () => 'https://example.com/page', - Network accessline 101
it('converts a "Download is starting" goto into a rawBuffer PDF result, not a thrown error', async () => { const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com/report'); - Network accessline 102
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com/report'); expect(res.contentType).toBe('application/pdf'); - Network accessline 103
const res = await pool.fetchWithBrowser('https://example.com/report'); - Network accessline 118
state.mode = 'deferred-download'; const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com/deferred'); - Network accessline 119
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com/deferred'); expect(res.contentType).toBe('application/pdf'); - Network accessline 120
const res = await pool.fetchWithBrowser('https://example.com/deferred'); - Network accessline 129
state.mode = 'normal'; const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com/page'); - Network accessline 130
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com/page'); expect(res.contentType).toBe('text/html'); - Network accessline 131
const res = await pool.fetchWithBrowser('https://example.com/page');
tests/unit/fetch/browser-pool.driver-fallback.test.ts
- Executable scriptline 1
Executable file - Network accessline 27
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 28
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 29
url: () => 'https://example.com', - Network accessline 99
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 111
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 113
await pool.fetchWithBrowser('https://b.example', { stealth: true }); - Network accessline 130
await pool.fetchWithBrowser('https://a.example', { stealth: true }); - Network accessline 131
await pool.fetchWithBrowser('https://b.example', { stealth: true });
tests/unit/fetch/browser-pool.humanize.test.ts
- Executable scriptline 1
Executable file - Network accessline 16
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 17
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 18
url: () => 'https://example.com', - Network accessline 91
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 92
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); expect(result.method).toBe('browser'); - Network accessline 93
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 100
it('humanize=on: engages on a plain browser fetch (no stealth)', async () => { - Network accessline 102
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 103
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); expect(result.method).toBe('browser'); - Network accessline 104
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 113
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 114
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); expect(result.method).toBe('browser'); - Network accessline 115
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 124
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 125
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); expect(result.method).toBe('browser'); - Network accessline 126
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 136
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 137
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', {}); expect(result.method).toBe('browser'); - Network accessline 138
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 147
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', { humanize: true }); - Network accessline 148
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', { humanize: true }); expect(result.method).toBe('browser'); - Network accessline 149
const result = await pool.fetchWithBrowser('https://plain.example', { humanize: true }); - Network accessline 157
resetConfig(); const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', { humanize: false }); - Network accessline 158
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://plain.example', { humanize: false }); expect(result.method).toBe('browser'); - Network accessline 159
const result = await pool.fetchWithBrowser('https://plain.example', { humanize: false });
tests/unit/fetch/browser-pool.hydration.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://react.dev/learn', - Network accessline 19
status: () => 200, url: () => 'https://react.dev/learn', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 20
url: () => 'https://react.dev/learn', - Network accessline 56
it('invokes waitForFunction (semantic-content probe) after networkidle', async () => { const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://react.dev/learn'); - Network accessline 57
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://react.dev/learn'); expect(calls.waitForFunction).toBeGreaterThanOrEqual(1); - Network accessline 58
await pool.fetchWithBrowser('https://react.dev/learn');
tests/unit/fetch/browser-pool.image-subtype.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
describe('MultiBrowserPool.imageSubTypeFor — wired to the HTML sub-type classifier', () => { it('returns "grid" for a reCAPTCHA bframe image-select (default common case)', () => { expect(subTypeFor('<iframe src="https://www.google.com - Network accessline 20
it('returns "grid" for a reCAPTCHA bframe image-select (default common case)', () => { expect(subTypeFor('<iframe src="https://www.google.com/recaptcha/api2/bframe?k=x"></iframe>')) .toBe('grid'); - Network accessline 21
expect(subTypeFor('<iframe src="https://www.google.com/recaptcha/api2/bframe?k=x"></iframe>'))
tests/unit/fetch/browser-pool.navigating.test.ts
- Executable scriptline 1
Executable file - Network accessline 16
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://react.dev/', - Network accessline 17
status: () => 200, url: () => 'https://react.dev/', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 18
url: () => 'https://react.dev/', - Network accessline 57
it('recovers when first page.content() throws "Execution context destroyed"', async () => { const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://react.dev/'); - Network accessline 58
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://react.dev/'); expect(res.html).toContain('stable hydrated content'); - Network accessline 59
const res = await pool.fetchWithBrowser('https://react.dev/');
tests/unit/fetch/browser-pool.proxy.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 9
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 10
url: () => 'https://example.com', - Network accessline 68
it('does NOT pass a proxy launch option when useProxy is off (default)', async () => { const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', {}); - Network accessline 69
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', {}); expect(launchCalls.length).toBeGreaterThan(0); - Network accessline 70
await pool.fetchWithBrowser('https://example.com', {}); - Network accessline 75
it('threads a structured proxy launch option (creds NOT inline in server) when configured', async () => { process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 76
process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; resetConfig(); - Network accessline 77
process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 78
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', {}); - Network accessline 79
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', {}); const withProxy = launchCalls.find((c) => c.proxy !== undefined); - Network accessline 80
await pool.fetchWithBrowser('https://example.com', {}); - Network accessline 90
it('forceNoProxy launches the dedicated stealth browser WITHOUT a proxy even when one is configured', async () => { process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 92
process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 95
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', { stealth: true, forceNoProxy: true }); - Network accessline 96
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', { stealth: true, forceNoProxy: true }); expect(launchCalls.length).toBeGreaterThan(0); - Network accessline 97
await pool.fetchWithBrowser('https://example.com', { stealth: true, forceNoProxy: true }); - Network accessline 102
it('stealth WITHOUT forceNoProxy still threads the proxy', async () => { process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 103
process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; process.env.WIGOLO_BROWSER_CHANNEL = 'chromium'; - Network accessline 104
process.env.PROXY_URL = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 106
resetConfig(); const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', { stealth: true }); - Network accessline 107
const pool = new MultiBrowserPool(); await pool.fetchWithBrowser('https://example.com', { stealth: true }); expect(launchCalls.find((c) => c.proxy !== undefined)).toBeDefined(); - Network accessline 108
await pool.fetchWithBrowser('https://example.com', { stealth: true });
tests/unit/fetch/browser-pool.scraping-browser.test.ts
- Executable scriptline 1
Executable file - Network accessline 26
goto: vi.fn().mockResolvedValue({ status: () => 200, url: () => 'https://example.com', - Network accessline 27
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 28
url: () => 'https://example.com', - Network accessline 108
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 124
const result = await pool.fetchWithBrowser('https://blocked.example', {}); - Network accessline 142
const result = await pool.fetchWithBrowser('https://blocked.example', {}); - Network accessline 158
const result = await pool.fetchWithBrowser('https://blocked.example', {
tests/unit/fetch/browser-pool.stealth.test.ts
- Executable scriptline 1
Executable file - Network accessline 43
return Promise.resolve({ status: () => 200, url: () => 'https://example.com', - Network accessline 44
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 45
url: () => 'https://example.com', - Network accessline 149
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 150
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 167
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 168
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 178
_setStealthDriverForTests(null); // optional dep not installed const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 179
const pool = new MultiBrowserPool(); const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); expect(result.method).toBe('browser'); - Network accessline 180
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 196
const result = await pool.fetchWithBrowser('https://blocked.example', { stealth: true }); - Network accessline 218
const p = pool.fetchWithBrowser('https://slow.example', { stealth: true, signal: ac.signal }); - Network accessline 240
const p1 = pool.fetchWithBrowser('https://a.example', { stealth: true, signal: ac1.signal }); - Network accessline 245
const p2 = pool.fetchWithBrowser('https://b.example', { stealth: true, signal: ac2.signal }); - Network accessline 275
const result = await pool.fetchWithBrowser('https://plain.example', {}); - Network accessline 297
await expect( pool.fetchWithBrowser('https://blocked.example', { stealth: true }), - Network accessline 298
pool.fetchWithBrowser('https://blocked.example', { stealth: true }), - Network accessline 305
state.launchThrows = false; const result = await pool.fetchWithBrowser('https://ok.example', { stealth: true }); - Network accessline 306
const result = await pool.fetchWithBrowser('https://ok.example', { stealth: true }); - Network accessline 321
for (let i = 0; i < 5; i++) { await expect( pool.fetchWithBrowser('https://blocked.example', { stealth: true }), - Network accessline 322
await expect( pool.fetchWithBrowser('https://blocked.example', { stealth: true }), ).rejects.toThrow(/launch boom/); - Network accessline 323
pool.fetchWithBrowser('https://blocked.example', { stealth: true }), - Network accessline 328
state.launchThrows = false; const result = await pool.fetchWithBrowser('https://ok.example', { stealth: true }); - Network accessline 329
const result = await pool.fetchWithBrowser('https://ok.example', { stealth: true }); - Network accessline 341
const pool = new MultiBrowserPool(); await expect( pool.fetchWithBrowser('https://blocked.example', { stealth: true }), - Network accessline 342
await expect( pool.fetchWithBrowser('https://blocked.example', { stealth: true }), ).rejects.toThrow(/newContext boom/); - Network accessline 343
pool.fetchWithBrowser('https://blocked.example', { stealth: true }), - Network accessline 350
state.newContextThrows = false; const result = await pool.fetchWithBrowser('https://ok.example', { stealth: true }); - Network accessline 351
const result = await pool.fetchWithBrowser('https://ok.example', { stealth: true });
tests/unit/fetch/browser-pool.timeout.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
return Promise.resolve({ status: () => 200, url: () => 'https://example.com', - Network accessline 20
status: () => 200, url: () => 'https://example.com', headers: () => ({ 'content-type': 'text/html' }), - Network accessline 21
url: () => 'https://example.com', - Network accessline 54
it('returns partial content with warning when page.goto times out', async () => { const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://react.dev/'); - Network accessline 55
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://react.dev/'); expect(res.html).toContain('partial shell content'); - Network accessline 56
const res = await pool.fetchWithBrowser('https://react.dev/'); - Network accessline 63
state.mode = 'ok'; const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com'); - Network accessline 64
const pool = new MultiBrowserPool(); const res = await pool.fetchWithBrowser('https://example.com'); expect(res.warning).toBeUndefined(); - Network accessline 65
const res = await pool.fetchWithBrowser('https://example.com');
tests/unit/fetch/browser-pool.widget-locate-budget.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/browser-probe.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/browser-selector.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/browser-types.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/cdp-client.test.ts
- Executable scriptline 1
Executable file - Network accessline 54
expect(sessions).toHaveLength(4); expect(sessions[0].id).toBe('ABC123'); expect(sessions[0].url).toBe('https://www.google.com/'); - Network accessline 55
expect(sessions[0].id).toBe('ABC123'); expect(sessions[0].url).toBe('https://www.google.com/'); expect(sessions[0].title).toBe('Google Search'); - Network accessline 56
expect(sessions[0].url).toBe('https://www.google.com/'); - Network accessline 79
it('filters out entries missing webSocketDebuggerUrl', () => { const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 80
const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, { id: '2', url: 'http://b.com', title: 'B' }, - Network accessline 81
{ id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 82
{ id: '2', url: 'http://b.com', title: 'B' }, - Network accessline 83
{ id: '3', url: 'http://c.com', title: 'C', webSocketDebuggerUrl: '' }, - Network accessline 90
it('filters out entries missing id', () => { const raw = JSON.stringify([ { url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 91
const raw = JSON.stringify([ { url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, ]); - Network accessline 92
{ url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 98
it('handles unicode in title', () => { const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'Uber uns', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 99
const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'Uber uns', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, ]); - Network accessline 100
{ id: '1', url: 'http://a.com', title: 'Uber uns', webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 107
const longTitle = 'A'.repeat(10000); const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: longTitle, webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 108
const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: longTitle, webSocketDebuggerUrl: 'ws://localhost:9222/1' }, ]); - Network accessline 109
{ id: '1', url: 'http://a.com', title: longTitle, webSocketDebuggerUrl: 'ws://localhost:9222/1' }, - Network accessline 115
it('handles sessions with extra unknown fields', () => { const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x', extra: 'field', nested: { a: 1 } }, - Network accessline 116
const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x', extra: 'field', nested: { a: 1 } }, ]); - Network accessline 117
{ id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x', extra: 'field', nested: { a: 1 } }, - Network accessline 125
const raw = JSON.stringify([ { id: '1', url: 'http://a.com', title: 'A', - Network accessline 126
{ id: '1', url: 'http://a.com', title: 'A', webSocketDebuggerUrl: 'ws://x', - Network accessline 127
id: '1', url: 'http://a.com', title: 'A', - Network accessline 138
it('handles JSON array with 100 entries', () => { const entries = Array.from({ length: 100 }, (_, i) => ({ id: `id-${i}`, url: `http://page-${i}.com`, title: `Page ${i}`, - Network accessline 139
const entries = Array.from({ length: 100 }, (_, i) => ({ id: `id-${i}`, url: `http://page-${i}.com`, title: `Page ${i}`, webSocketDebuggerUrl: `ws://localhost:9222/devtools/page/id-${i}`, - Network accessline 140
id: `id-${i}`, url: `http://page-${i}.com`, title: `Page ${i}`, - Network accessline 168
const sessions = await discoverSessions(`http://127.0.0.1:${port}`); - Network accessline 178
const sessions = await discoverSessions(`http://127.0.0.1:${port}`); - Network accessline 182
it('returns empty array when CDP endpoint is unreachable', async () => { const sessions = await discoverSessions('http://127.0.0.1:19999'); - Network accessline 183
const sessions = await discoverSessions('http://127.0.0.1:19999'); - Network accessline 191
const sessions = await discoverSessions(`http://127.0.0.1:${port}`); - Network accessline 199
const sessions = await discoverSessions(`http://127.0.0.1:${port}`); - Network accessline 215
const sessions = await discoverSessions(`http://127.0.0.1:${port}`, { timeoutMs: 500 }); - Network accessline 224
const sessions = await discoverSessions(`http://127.0.0.1:${port}`, { filterPages: true }); - Network accessline 243
const reachable = await isCDPReachable(`http://127.0.0.1:${port}`); - Network accessline 247
it('returns false when CDP endpoint is unreachable', async () => { const reachable = await isCDPReachable('http://127.0.0.1:19998'); - Network accessline 248
const reachable = await isCDPReachable('http://127.0.0.1:19998'); - Network accessline 256
const reachable = await isCDPReachable(`http://127.0.0.1:${port}`); - Network accessline 269
const reachable = await isCDPReachable(`http://127.0.0.1:${port}`, 500);
tests/unit/fetch/cdp-direct-discover-retry.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/cdp-direct-egress-policy.test.ts
- Executable scriptline 1
Executable file - Network accessline 66
let h: Harness; beforeEach(() => { h = { spawnedArgs: [], navigatedTo: [], locationHref: 'https://example.com/' }; - Network accessline 67
beforeEach(() => { h = { spawnedArgs: [], navigatedTo: [], locationHref: 'https://example.com/' }; _setProcessKillForTests(() => {}); - Network accessline 68
h = { spawnedArgs: [], navigatedTo: [], locationHref: 'https://example.com/' }; - Network accessline 81
it('passes the configured proxy to the spawned browser rather than egressing direct', async () => { process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://proxy.example.com:8080'; - Network accessline 82
process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://proxy.example.com:8080'; resetConfig(); - Network accessline 83
process.env.PROXY_URL = 'http://proxy.example.com:8080'; - Network accessline 86
const res = await cdpDirectFetch('https://example.com/', { lookup: publicLookup }); - Network accessline 88
expect(res).not.toBeNull(); expect(h.spawnedArgs).toContain('--proxy-server=http://proxy.example.com:8080'); - Network accessline 89
expect(h.spawnedArgs).toContain('--proxy-server=http://proxy.example.com:8080'); - Network accessline 95
process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://user:pass@proxy.example.com:8080'; - Network accessline 96
process.env.PROXY_URL = 'http://user:pass@proxy.example.com:8080'; - Network accessline 99
const res = await cdpDirectFetch('https://example.com/', { lookup: publicLookup }); - Network accessline 105
it('adds no proxy flag when none is configured', async () => { const res = await cdpDirectFetch('https://example.com/', { lookup: publicLookup }); - Network accessline 106
const res = await cdpDirectFetch('https://example.com/', { lookup: publicLookup }); - Network accessline 113
let h: Harness; beforeEach(() => { h = { spawnedArgs: [], navigatedTo: [], locationHref: 'https://example.com/' }; - Network accessline 114
beforeEach(() => { h = { spawnedArgs: [], navigatedTo: [], locationHref: 'https://example.com/' }; _setProcessKillForTests(() => {}); - Network accessline 115
h = { spawnedArgs: [], navigatedTo: [], locationHref: 'https://example.com/' }; - Network accessline 128
h.locationHref = 'http://169.254.169.254/latest/meta-data/'; - Network accessline 130
const res = await cdpDirectFetch('https://public.example/', { lookup: publicLookup }); - Network accessline 135
it('reports the real landing url, not the requested one', async () => { h.locationHref = 'https://example.com/after-redirect'; - Network accessline 136
h.locationHref = 'https://example.com/after-redirect'; - Network accessline 138
const res = await cdpDirectFetch('https://example.com/start', { lookup: publicLookup }); - Network accessline 140
expect(res).not.toBeNull(); expect(res!.finalUrl).toBe('https://example.com/after-redirect'); - Network accessline 141
expect(res!.finalUrl).toBe('https://example.com/after-redirect'); - Network accessline 142
expect(res!.url).toBe('https://example.com/start'); - Network accessline 145
it('falls back to the requested url when the landing url cannot be read', async () => { h.locationHref = ''; const res = await cdpDirectFetch('https://example.com/start', { lookup: publicLookup }); - Network accessline 146
h.locationHref = ''; const res = await cdpDirectFetch('https://example.com/start', { lookup: publicLookup }); expect(res).not.toBeNull(); - Network accessline 147
const res = await cdpDirectFetch('https://example.com/start', { lookup: publicLookup }); - Network accessline 148
expect(res).not.toBeNull(); expect(res!.finalUrl).toBe('https://example.com/start'); }); - Network accessline 149
expect(res!.finalUrl).toBe('https://example.com/start');
tests/unit/fetch/cdp-direct-fetch.test.ts
- Executable scriptline 1
Executable file - Network accessline 163
const h = makeHarness({ chromePath: null }); _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', {}); - Network accessline 164
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', {}); expect(result).toBeNull(); - Network accessline 165
const result = await cdpDirectFetch('https://example.com', {}); - Network accessline 172
const h = makeHarness({ transport: null }); _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', {}); - Network accessline 173
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', {}); expect(result).toBeNull(); - Network accessline 174
const result = await cdpDirectFetch('https://example.com', {}); - Network accessline 183
const h = makeHarness(); _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 184
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); expect(result).not.toBeNull(); - Network accessline 185
const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 187
expect(result!.method).toBe('browser'); expect(result!.html).toContain('hardcore'); expect(result!.url).toBe('https://example.com'); - Network accessline 188
expect(result!.html).toContain('hardcore'); expect(result!.url).toBe('https://example.com'); expect(result!.statusCode).toBe(200); - Network accessline 189
expect(result!.url).toBe('https://example.com'); - Network accessline 203
const h = makeHarness(); _setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 204
_setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); expect(h.calls).not.toContain('Runtime.enable'); - Network accessline 205
await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 212
const h = makeHarness(); _setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 213
_setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); expect(h.child.killed).toBe(true); - Network accessline 214
await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 227
const result = await cdpDirectFetch('https://example.com', { timeoutMs: 300 }); - Network accessline 236
const controller = new AbortController(); controller.abort(); const result = await cdpDirectFetch('https://example.com', { signal: controller.signal }); - Network accessline 237
controller.abort(); const result = await cdpDirectFetch('https://example.com', { signal: controller.signal }); expect(result).toBeNull(); - Network accessline 238
const result = await cdpDirectFetch('https://example.com', { signal: controller.signal }); - Network accessline 250
}) as unknown as CdpDirectFetchDeps['isReachable']; _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { signal: controller.signal }); - Network accessline 251
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { signal: controller.signal }); expect(result).toBeNull(); - Network accessline 252
const result = await cdpDirectFetch('https://example.com', { signal: controller.signal }); - Network accessline 260
h.deps.spawn = (() => { throw new Error('spawn EACCES'); }) as unknown as CdpDirectFetchDeps['spawn']; _setCdpDirectFetchDepsForTests(h.deps); await expect(cdpDirectFetch('https://example.com', {})).resolves.toBeNull(); - Network accessline 261
_setCdpDirectFetchDepsForTests(h.deps); await expect(cdpDirectFetch('https://example.com', {})).resolves.toBeNull(); }); - Network accessline 262
await expect(cdpDirectFetch('https://example.com', {})).resolves.toBeNull(); - Network accessline 270
const rebind = lookupTo([{ address: '169.254.169.254', family: 4 }]); const result = await cdpDirectFetch('https://internal.evil.example', { lookup: rebind }); - Network accessline 271
const result = await cdpDirectFetch('https://internal.evil.example', { lookup: rebind }); - Network accessline 284
_setCdpDirectFetchDepsForTests(h.deps); const rebind = lookupTo([{ address: '10.1.2.3', family: 4 }]); const result = await cdpDirectFetch('https://looks-public.example', { lookup: rebind }); - Network accessline 285
const rebind = lookupTo([{ address: '10.1.2.3', family: 4 }]); const result = await cdpDirectFetch('https://looks-public.example', { lookup: rebind }); expect(result).toBeNull(); - Network accessline 286
const result = await cdpDirectFetch('https://looks-public.example', { lookup: rebind }); - Network accessline 313
h.deps.connectTransport = async () => emptyTransport; _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); - Network accessline 314
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); expect(result).toBeNull(); - Network accessline 315
const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); - Network accessline 335
const h = makeHarness({ transport: rec.transport }); _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); - Network accessline 336
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); expect(result).toBeNull(); // block detected → fall back, do NOT serve the wall - Network accessline 337
const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); expect(result).toBeNull(); // block detected → fall back, do NOT serve the wall expect(rec.calls).toContain('Page.navigate'); // - Network accessline 361
h.deps.connectTransport = async () => nonStringTransport; _setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); - Network accessline 362
_setCdpDirectFetchDepsForTests(h.deps); const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); expect(result).toBeNull(); - Network accessline 363
const result = await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP, timeoutMs: 1500 }); - Network accessline 373
_setProcessKillForTests(makeGroupKill({ throwOnGroup: false })); _setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 375
await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 385
const h = makeHarness(); _setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); - Network accessline 386
_setCdpDirectFetchDepsForTests(h.deps); await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP }); expect(h.spawn).toHaveBeenCalledTimes(1); - Network accessline 387
await cdpDirectFetch('https://example.com', { lookup: PUBLIC_LOOKUP });
tests/unit/fetch/cdp-direct-identity.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/cdp-direct.test.ts
- Executable scriptline 1
Executable file - Network accessline 63
await handle!.navigate('https://example.com'); - Network accessline 74
const { transport, calls } = makeRecordingTransport(); const handle = await cdpDirectConnect({ transport }); await handle!.navigate('https://example.com'); - Network accessline 75
const handle = await cdpDirectConnect({ transport }); await handle!.navigate('https://example.com'); await handle!.getContentHtml(); - Network accessline 76
await handle!.navigate('https://example.com'); - Network accessline 98
}); const handle = await cdpDirectConnect({ transport }); await handle!.navigate('https://x.test'); - Network accessline 99
const handle = await cdpDirectConnect({ transport }); await handle!.navigate('https://x.test'); expect(await handle!.getContentHtml()).toBe('<html>ISO</html>'); - Network accessline 100
await handle!.navigate('https://x.test'); - Network accessline 147
_setCriForTests(null); const handle = await cdpDirectConnect({ cdpUrl: 'http://127.0.0.1:9222', - Network accessline 148
const handle = await cdpDirectConnect({ cdpUrl: 'http://127.0.0.1:9222', webSocketDebuggerUrl: 'ws://127.0.0.1:9222/devtools/page/ABC', - Network accessline 149
cdpUrl: 'http://127.0.0.1:9222', - Network accessline 169
const handle = await cdpDirectConnect({ cdpUrl: 'http://127.0.0.1:9222', - Network accessline 170
cdpUrl: 'http://127.0.0.1:9222', - Network accessline 177
await handle!.navigate('https://example.com');
tests/unit/fetch/challenge-classify.test.ts
- Executable scriptline 1
Executable file - Network accessline 25
const html = cfSkeleton(` <div id="recaptcha-anchor" class="recaptcha-checkbox" role="checkbox"></div> <iframe src="https://www.google.com/recaptcha/api2/anchor?k=abc"></iframe>`); - Network accessline 26
<div id="recaptcha-anchor" class="recaptcha-checkbox" role="checkbox"></div> <iframe src="https://www.google.com/recaptcha/api2/anchor?k=abc"></iframe>`); expect(classifyChallenge(html)).toBe('interactive'); - Network accessline 27
<iframe src="https://www.google.com/recaptcha/api2/anchor?k=abc"></iframe>`); - Network accessline 31
it('classifies an hCaptcha checkbox iframe as interactive', () => { const html = cfSkeleton(` <iframe src="https://newassets.hcaptcha.com/captcha/v1/checkbox?sitekey=x"></iframe>`); - Network accessline 32
const html = cfSkeleton( <iframe src="https://newassets.hcaptcha.com/captcha/v1/checkbox?sitekey=x"></iframe>`); - Network accessline 33
<iframe src="https://newassets.hcaptcha.com/captcha/v1/checkbox?sitekey=x"></iframe>`); - Network accessline 39
it('classifies a reCAPTCHA bframe image-select as image', () => { const html = cfSkeleton(` <iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&k=abc" - Network accessline 40
const html = cfSkeleton( <iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&k=abc" - Network accessline 41
<iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&k=abc" - Network accessline 46
it('classifies an hCaptcha image-grid challenge iframe as image', () => { const html = cfSkeleton(` <iframe src="https://newassets.hcaptcha.com/captcha/v1/challenge?sitekey=x"></iframe>`); - Network accessline 47
const html = cfSkeleton( <iframe src="https://newassets.hcaptcha.com/captcha/v1/challenge?sitekey=x"></iframe>`); - Network accessline 48
<iframe src="https://newassets.hcaptcha.com/captcha/v1/challenge?sitekey=x"></iframe>`); - Network accessline 78
<p id="cmsg">Please enable JS and disable any ad blocker</p> <script>window._dd_s = {};</script> <script src="https://geo.captcha-delivery.com/captcha/"></script> - Network accessline 79
<script>window._dd_s = {};</script> <script src="https://geo.captcha-delivery.com/captcha/"></script> </body></html>`; - Network accessline 80
<script src="https://geo.captcha-delivery.com/captcha/"></script> - Network accessline 170
const html = `<!doctype html><html><head><title>Access denied</title></head><body> <script>window._dd_s = {};</script> <iframe src="https://www.google.com/recaptcha/api2/bframe?k=abc"></iframe> - Network accessline 171
<script>window._dd_s = {};</script> <iframe src="https://www.google.com/recaptcha/api2/bframe?k=abc"></iframe> </body></html>`; - Network accessline 172
<iframe src="https://www.google.com/recaptcha/api2/bframe?k=abc"></iframe> - Network accessline 180
describe('grid — the common reCAPTCHA / hCaptcha image-select', () => { it('classifies a reCAPTCHA bframe image-select as grid', () => { const html = `<iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&k=abc" - Network accessline 181
it('classifies a reCAPTCHA bframe image-select as grid', () => { const html = `<iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&k=abc" title="recaptcha challenge"></iframe>`; - Network accessline 182
const html = `<iframe src="https://www.google.com/recaptcha/api2/bframe?hl=en&k=abc" - Network accessline 187
it('classifies an hCaptcha image-grid challenge iframe as grid', () => { const html = `<iframe src="https://newassets.hcaptcha.com/captcha/v1/challenge?sitekey=x"></iframe>`; - Network accessline 188
const html = `<iframe src="https://newassets.hcaptcha.com/captcha/v1/challenge?sitekey=x"></iframe>`; - Network accessline 243
it('a grid frame co-present with a captcha img+input still classifies grid', () => { const html = `<!doctype html><html><body> <iframe src="https://www.google.com/recaptcha/api2/bframe?k=abc"></iframe> - Network accessline 244
const html = `<!doctype html><html><body> <iframe src="https://www.google.com/recaptcha/api2/bframe?k=abc"></iframe> <img src="/captcha.png" alt="captcha" /> - Network accessline 245
<iframe src="https://www.google.com/recaptcha/api2/bframe?k=abc"></iframe>
tests/unit/fetch/challenge-completion.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/challenge-status-distinguishable.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/clearance-major-drift.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/clearance-reuse.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 88
describe('clearance-reuse: routeMatchesClearance (route-identity gate)', () => { it('exact route match is reusable (same proxy egress)', () => { expect(routeMatchesClearance('http://proxy:8080', 'http://proxy:8080')).toBe(true); - Network accessline 89
it('exact route match is reusable (same proxy egress)', () => { expect(routeMatchesClearance('http://proxy:8080', 'http://proxy:8080')).toBe(true); }); - Network accessline 90
expect(routeMatchesClearance('http://proxy:8080', 'http://proxy:8080')).toBe(true); - Network accessline 93
it('a proxy-minted clearance is REFUSED from a direct route (route-identity mismatch)', () => { expect(routeMatchesClearance('http://proxy:8080', 'direct')).toBe(false); - Network accessline 94
expect(routeMatchesClearance('http://proxy:8080', 'direct')).toBe(false); - Network accessline 97
it('a direct-minted clearance is REFUSED from a proxy route', () => { expect(routeMatchesClearance('direct', 'http://proxy:8080')).toBe(false); - Network accessline 98
expect(routeMatchesClearance('direct', 'http://proxy:8080')).toBe(false); - Network accessline 101
it('two DIFFERENT proxies are a mismatch (clearance is IP-bound)', () => { expect(routeMatchesClearance('http://proxy-a:8080', 'http://proxy-b:8080')).toBe(false); - Network accessline 102
expect(routeMatchesClearance('http://proxy-a:8080', 'http://proxy-b:8080')).toBe(false); - Network accessline 113
it('a legacy row (undefined route) is REFUSED from a proxy route', () => { expect(routeMatchesClearance(undefined, 'http://proxy:8080')).toBe(false); - Network accessline 114
expect(routeMatchesClearance(undefined, 'http://proxy:8080')).toBe(false); - Network accessline 117
it('an empty-string stored route is treated as direct (legacy/NULL surrogate)', () => { expect(routeMatchesClearance('', 'direct')).toBe(true); expect(routeMatchesClearance('', 'http://proxy:8080')).toBe(false); - Network accessline 118
expect(routeMatchesClearance('', 'direct')).toBe(true); expect(routeMatchesClearance('', 'http://proxy:8080')).toBe(false); }); - Network accessline 119
expect(routeMatchesClearance('', 'http://proxy:8080')).toBe(false); - Network accessline 132
it('refuses on route mismatch even when fresh + UA-ok', () => { const c = { cookie: 'cf_clearance=x', ua: CHROME_UA, tier: 'browser', expiresAt: future, solvedRoute: 'http://proxy:8080' }; - Network accessline 133
const c = { cookie: 'cf_clearance=x', ua: CHROME_UA, tier: 'browser', expiresAt: future, solvedRoute: 'http://proxy:8080' }; - Network accessline 148
const legacy = { cookie: 'cf_clearance=x', ua: CHROME_UA, tier: 'browser', expiresAt: future }; expect(isClearanceReusable(legacy, 'browser', 'direct', Date.now())).toBe(true); expect(isClearanceReusable(legacy, 'browser', 'http://p - Network accessline 149
expect(isClearanceReusable(legacy, 'browser', 'direct', Date.now())).toBe(true); expect(isClearanceReusable(legacy, 'browser', 'http://proxy:8080', Date.now())).toBe(false); }); - Network accessline 150
expect(isClearanceReusable(legacy, 'browser', 'http://proxy:8080', Date.now())).toBe(false);
tests/unit/fetch/content-check.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/error-describe.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
it('describes a ChallengeBlockedError in capability language with the use_auth hint', () => { const err = new ChallengeBlockedError('https://blocked.example/'); - Network accessline 40
const err = new ChallengeBlockedError('https://blocked.example/');
tests/unit/fetch/escape-hatch.test.ts
- Executable scriptline 1
Executable file - Network accessline 29
it('returns null when solverUrl is unset (never calls fetch)', async () => { const spy = vi.fn(); const out = await solverFetch('https://target.example.com', baseCfg, { fetchImpl: spy }); - Network accessline 30
const spy = vi.fn(); const out = await solverFetch('https://target.example.com', baseCfg, { fetchImpl: spy }); expect(out).toBeNull(); - Network accessline 31
const out = await solverFetch('https://target.example.com', baseCfg, { fetchImpl: spy }); - Network accessline 38
it('returns null when hostedReaderUrl is unset (never calls fetch)', async () => { const spy = vi.fn(); const out = await hostedReaderFetch('https://target.example.com', baseCfg, { fetchImpl: spy }); - Network accessline 39
const spy = vi.fn(); const out = await hostedReaderFetch('https://target.example.com', baseCfg, { fetchImpl: spy }); expect(out).toBeNull(); - Network accessline 40
const out = await hostedReaderFetch('https://target.example.com', baseCfg, { fetchImpl: spy }); - Network accessline 46
describe('solverFetch — happy path', () => { it('POSTs the target to a loopback solver and returns its cleared HTML', async () => { const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191/v1' }; - Network accessline 47
it('POSTs the target to a loopback solver and returns its cleared HTML', async () => { const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191/v1' }; const fetchImpl = vi.fn(async () => - Network accessline 48
const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191/v1' }; - Network accessline 50
res(JSON.stringify({ solution: { response: '<html>cleared</html>', status: 200 } })), ); const out = await solverFetch('https://target.example.com/page', cfg, { fetchImpl }); - Network accessline 51
); const out = await solverFetch('https://target.example.com/page', cfg, { fetchImpl }); expect(out).not.toBeNull(); - Network accessline 52
const out = await solverFetch('https://target.example.com/page', cfg, { fetchImpl }); - Network accessline 62
it('allows a localhost solver URL', async () => { const cfg = { ...baseCfg, solverUrl: 'http://localhost:8191' }; - Network accessline 63
const cfg = { ...baseCfg, solverUrl: 'http://localhost:8191' }; - Network accessline 71
const lookup = (_h: string, _o: unknown, cb: (e: null, a: { address: string; family: number }[]) => void) => cb(null, [{ address: '127.0.0.1', family: 4 }]); const out = await solverFetch('https://target.example.com', cfg, { fetch - Network accessline 72
cb(null, [{ address: '127.0.0.1', family: 4 }]); const out = await solverFetch('https://target.example.com', cfg, { fetchImpl, lookup }); expect(out).not.toBeNull(); - Network accessline 73
const out = await solverFetch('https://target.example.com', cfg, { fetchImpl, lookup }); - Network accessline 78
describe('solverFetch — SSRF guards', () => { it('refuses a target URL that is a metadata IP (169.254.169.254)', async () => { const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191' }; - Network accessline 79
it('refuses a target URL that is a metadata IP (169.254.169.254)', async () => { const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191' }; const fetchImpl = vi.fn(); - Network accessline 80
const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191' }; - Network accessline 81
const fetchImpl = vi.fn(); const out = await solverFetch('http://169.254.169.254/latest/meta-data', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 82
const out = await solverFetch('http://169.254.169.254/latest/meta-data', cfg, { fetchImpl }); - Network accessline 87
it('refuses a solver URL that is a metadata IP', async () => { const cfg = { ...baseCfg, solverUrl: 'http://169.254.169.254' }; - Network accessline 88
const cfg = { ...baseCfg, solverUrl: 'http://169.254.169.254' }; - Network accessline 89
const fetchImpl = vi.fn(); const out = await solverFetch('https://target.example.com', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 90
const out = await solverFetch('https://target.example.com', cfg, { fetchImpl }); - Network accessline 95
it('refuses a target on a private 10.x when allowPrivate is false', async () => { const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191' }; - Network accessline 96
const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191' }; - Network accessline 97
const fetchImpl = vi.fn(); const out = await solverFetch('http://10.1.2.3/internal', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 98
const out = await solverFetch('http://10.1.2.3/internal', cfg, { fetchImpl }); - Network accessline 104
describe('hostedReaderFetch — SSRF guards + redirects', () => { it('refuses a target metadata IP', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 105
it('refuses a target metadata IP', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; const fetchImpl = vi.fn(); - Network accessline 106
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 107
const fetchImpl = vi.fn(); const out = await hostedReaderFetch('http://169.254.169.254/', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 108
const out = await hostedReaderFetch('http://169.254.169.254/', cfg, { fetchImpl }); - Network accessline 113
it('refuses when the reader 302-redirects to a metadata IP', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 114
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 115
const fetchImpl = vi.fn(async () => res('', { status: 302, headers: { location: 'http://169.254.169.254/' } }), ); - Network accessline 116
res('', { status: 302, headers: { location: 'http://169.254.169.254/' } }), - Network accessline 117
); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 118
const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); - Network accessline 123
// The literal-only guard passes a redirect to `http://rebind.example/ // (an ordinary public-looking name). The fetch-time resolved re-check is - Network accessline 129
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 130
const fetchImpl = vi.fn(async () => res('', { status: 302, headers: { location: 'http://rebind.example/' } }), ); - Network accessline 131
res('', { status: 302, headers: { location: 'http://rebind.example/' } }), - Network accessline 142
? cb(null, [{ address: '169.254.169.254', family: 4 }]) : cb(null, [{ address: '93.184.216.34', family: 4 }]); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl, lookup }); - Network accessline 143
: cb(null, [{ address: '93.184.216.34', family: 4 }]); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl, lookup }); expect(out).toBeNull(); - Network accessline 144
const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl, lookup }); - Network accessline 151
it('refuses when the reader 302-redirects to a 10.x and allowPrivate is false', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 152
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 153
const fetchImpl = vi.fn(async () => res('', { status: 302, headers: { location: 'http://10.0.0.5/' } }), ); - Network accessline 154
res('', { status: 302, headers: { location: 'http://10.0.0.5/' } }), - Network accessline 155
); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 156
const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); - Network accessline 161
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com', - Network accessline 162
...baseCfg, hostedReaderUrl: 'https://reader.example.com', fetchAllowPrivate: true, - Network accessline 163
hostedReaderUrl: 'https://reader.example.com', - Network accessline 167
const fetchImpl = vi.fn(async () => { call += 1; if (call === 1) return res('', { status: 302, headers: { location: 'http://10.0.0.5/rendered' } }); - Network accessline 168
call += 1; if (call === 1) return res('', { status: 302, headers: { location: 'http://10.0.0.5/rendered' } }); return res('<html>private-rendered</html>', { headers: { 'content-type': 'text/html' } }); - Network accessline 169
if (call === 1) return res('', { status: 302, headers: { location: 'http://10.0.0.5/rendered' } }); - Network accessline 170
return res('<html>private-rendered</html>', { headers: { 'content-type': 'text/html' } }); }); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); - Network accessline 171
}); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); expect(out).not.toBeNull(); - Network accessline 172
const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); - Network accessline 178
it('stops after the hop cap (redirect loop) and returns null', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com', maxRedirects: 2 }; - Network accessline 179
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com', maxRedirects: 2 }; - Network accessline 180
const fetchImpl = vi.fn(async () => res('', { status: 302, headers: { location: 'https://reader.example.com/again' } }), ); - Network accessline 181
res('', { status: 302, headers: { location: 'https://reader.example.com/again' } }), - Network accessline 182
); const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); expect(out).toBeNull(); - Network accessline 183
const out = await hostedReaderFetch('https://target.example.com', cfg, { fetchImpl }); - Network accessline 195
const fetchImpl = vi.fn(); const resp = await _guardedFollow( 'http://169.254.169.254/latest/meta-data', - Network accessline 196
const resp = await _guardedFollow( 'http://169.254.169.254/latest/meta-data', { method: 'GET' }, - Network accessline 197
'http://169.254.169.254/latest/meta-data', - Network accessline 206
it('fix 2 — refuses hop 0 when the start URL is a private 10.x and allowPrivate is false', async () => { const fetchImpl = vi.fn(); const resp = await _guardedFollow('http://10.0.0.9/x', { method: 'GET' }, cfg, fetchImpl); - Network accessline 207
const fetchImpl = vi.fn(); const resp = await _guardedFollow('http://10.0.0.9/x', { method: 'GET' }, cfg, fetchImpl); expect(resp).toBeNull(); - Network accessline 208
const resp = await _guardedFollow('http://10.0.0.9/x', { method: 'GET' }, cfg, fetchImpl); - Network accessline 220
return res('', { status: 302, headers: { location: 'https://other-public-host.example/landing' }, - Network accessline 221
status: 302, headers: { location: 'https://other-public-host.example/landing' }, }); - Network accessline 222
headers: { location: 'https://other-public-host.example/landing' }, - Network accessline 226
}); const resp = await _guardedFollow( 'https://solver.example.com/v1', - Network accessline 227
const resp = await _guardedFollow( 'https://solver.example.com/v1', { method: 'POST', body: JSON.stringify({ url: 'https://target.example.com' }) }, - Network accessline 228
'https://solver.example.com/v1', - Network accessline 229
{ method: 'POST', body: JSON.stringify({ url: 'https://target.example.com' }) }, - Network accessline 245
describe('hostedReaderFetch — target URL encoding (fix 3)', () => { it('percent-encodes the target so its query cannot inject reader params', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 246
it('percent-encodes the target so its query cannot inject reader params', async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; let composed = ''; - Network accessline 247
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com' }; - Network accessline 252
[Credential-related source omitted] - Network accessline 253
[Credential-related source omitted] - Network accessline 254
[Credential-related source omitted] - Network accessline 260
[Credential-related source omitted] - Network accessline 266
it("a crafted target with '/../' and '&x=' cannot inject reader path/params", async () => { const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com/' }; - Network accessline 267
const cfg = { ...baseCfg, hostedReaderUrl: 'https://reader.example.com/' }; - Network accessline 271
return res('<html>ok</html>', { headers: { 'content-type': 'text/html' } }); }); await hostedReaderFetch('https://evil.example.com/a/../../admin&inject=1', cfg, { fetchImpl }); - Network accessline 272
}); await hostedReaderFetch('https://evil.example.com/a/../../admin&inject=1', cfg, { fetchImpl }); const composedUrl = new URL(composed); - Network accessline 273
await hostedReaderFetch('https://evil.example.com/a/../../admin&inject=1', cfg, { fetchImpl }); - Network accessline 286
const cfg = { ...baseCfg, solverUrl: 'http://127.0.0.1:8191' }; - Network accessline 296
), ); const out = await solverFetch('https://victim.example.com/page', cfg, { fetchImpl }); - Network accessline 297
); const out = await solverFetch('https://victim.example.com/page', cfg, { fetchImpl }); expect(out).not.toBeNull(); - Network accessline 298
const out = await solverFetch('https://victim.example.com/page', cfg, { fetchImpl });
tests/unit/fetch/http-client.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 64
const url = `http://127.0.0.1:${getPort(server)}/paper`; - Network accessline 83
const url = `http://127.0.0.1:${getPort(server)}/data`; - Network accessline 98
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 120
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 149
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 173
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 197
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 215
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 232
const url = `http://127.0.0.1:${getPort(server)}/`; - Network accessline 245
server = await startServer((req, res) => { if (req.url === '/start') { res.writeHead(301, { location: `http://127.0.0.1:${getPort(server)}/end` }); - Network accessline 246
if (req.url === '/start') { res.writeHead(301, { location: `http://127.0.0.1:${getPort(server)}/end` }); res.end(); - Network accessline 247
res.writeHead(301, { location: `http://127.0.0.1:${getPort(server)}/end` }); - Network accessline 255
const startUrl = `http://127.0.0.1:${getPort(server)}/start`; - Network accessline 256
const endUrl = `http://127.0.0.1:${getPort(server)}/end`; - Network accessline 265
server = await startServer((req, res) => { if (req.url === '/a') { res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/b` }); - Network accessline 266
if (req.url === '/a') { res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/b` }); res.end(); - Network accessline 267
res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/b` }); - Network accessline 268
res.end(); } else { res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/a` }); - Network accessline 269
} else { res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/a` }); res.end(); - Network accessline 270
res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/a` }); - Network accessline 275
const url = `http://127.0.0.1:${getPort(server)}/a`; - Network accessline 280
server = await startServer((req, res) => { const n = parseInt(req.url!.slice(1)) || 0; res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/${n + 1}` }); - Network accessline 281
const n = parseInt(req.url!.slice(1)) || 0; res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/${n + 1}` }); res.end(); - Network accessline 282
res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/${n + 1}` }); - Network accessline 289
const url = `http://127.0.0.1:${getPort(server)}/0`; - Network accessline 294
server = await startServer((req, res) => { if (req.url === '/307') { res.writeHead(307, { location: `http://127.0.0.1:${getPort(server)}/done` }); - Network accessline 295
if (req.url === '/307') { res.writeHead(307, { location: `http://127.0.0.1:${getPort(server)}/done` }); res.end(); - Network accessline 296
res.writeHead(307, { location: `http://127.0.0.1:${getPort(server)}/done` }); - Network accessline 304
const url = `http://127.0.0.1:${getPort(server)}/307`; - Network accessline 332
hostServer = await startServer((req, res) => { originCookies.push(req.headers.cookie); res.writeHead(302, { location: `http://localhost:${otherPort}/landing` }); - Network accessline 333
originCookies.push(req.headers.cookie); res.writeHead(302, { location: `http://localhost:${otherPort}/landing` }); res.end(); - Network accessline 334
res.writeHead(302, { location: `http://localhost:${otherPort}/landing` }); - Network accessline 335
res.end(); }); const startUrl = `http://127.0.0.1:${getPort(hostServer)}/start`; - Network accessline 337
const startUrl = `http://127.0.0.1:${getPort(hostServer)}/start`; - Network accessline 354
seen.push(req.headers.cookie); if (req.url === '/start') { res.writeHead(302, { location: `http://127.0.0.1:${getPort(hostServer)}/next` }); - Network accessline 355
if (req.url === '/start') { res.writeHead(302, { location: `http://127.0.0.1:${getPort(hostServer)}/next` }); res.end(); - Network accessline 356
res.writeHead(302, { location: `http://127.0.0.1:${getPort(hostServer)}/next` }); - Network accessline 364
otherServer = await startServer((_req, res) => res.end('x')); const startUrl = `http://127.0.0.1:${getPort(hostServer)}/start`; - Network accessline 365
const startUrl = `http://127.0.0.1:${getPort(hostServer)}/start`; - Network accessline 381
await expect(httpFetch('http://127.0.0.1:1/')).rejects.toThrow(); - Network accessline 396
const ac = new AbortController(); ac.abort(new DOMException('stage_timeout', 'AbortError')); await expect(httpFetch(`http://127.0.0.1:${port}/`, { signal: ac.signal })).rejects.toBeTruthy(); - Network accessline 397
ac.abort(new DOMException('stage_timeout', 'AbortError')); await expect(httpFetch(`http://127.0.0.1:${port}/`, { signal: ac.signal })).rejects.toBeTruthy(); expect(hits).toBe(0); - Network accessline 398
await expect(httpFetch(`http://127.0.0.1:${port}/`, { signal: ac.signal })).rejects.toBeTruthy(); - Network accessline 412
const ac = new AbortController(); const startedAt = Date.now(); const p = httpFetch(`http://127.0.0.1:${port}/`, { signal: ac.signal }); - Network accessline 413
const startedAt = Date.now(); const p = httpFetch(`http://127.0.0.1:${port}/`, { signal: ac.signal }); setTimeout(() => ac.abort(new DOMException('stage_timeout', 'AbortError')), 50); - Network accessline 414
const p = httpFetch(`http://127.0.0.1:${port}/`, { signal: ac.signal });
tests/unit/fetch/human-solve.test.ts
- Executable scriptline 1
Executable file - Network accessline 36
return { page: PAGE, info: { url: 'https://example.com/protected', challengeClass: 'cf-turnstile' }, - Network accessline 37
page: PAGE, info: { url: 'https://example.com/protected', challengeClass: 'cf-turnstile' }, hasVisibleSurface: true, - Network accessline 38
info: { url: 'https://example.com/protected', challengeClass: 'cf-turnstile' }, - Network accessline 120
expect(onNeedHuman).toHaveBeenCalledTimes(1); expect(onNeedHuman).toHaveBeenCalledWith({ url: 'https://example.com/protected', - Network accessline 121
expect(onNeedHuman).toHaveBeenCalledWith({ url: 'https://example.com/protected', challengeClass: 'cf-turnstile', - Network accessline 122
url: 'https://example.com/protected',
tests/unit/fetch/hydration-probe.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/playwright-tier.hydration-gate.test.ts
- Executable scriptline 1
Executable file - Network accessline 93
it('captures HTML only after the body-presence probe resolves (not on fast networkidle)', async () => { const { fetchWithPlaywright } = await import('../../../src/fetch/playwright-tier.js'); const result = await fetchWithPlaywright( - Network accessline 95
const result = await fetchWithPlaywright('https://react.dev/reference/react'); - Network accessline 124
const { fetchWithPlaywright } = await import('../../../src/fetch/playwright-tier.js'); const result = await fetchWithPlaywright('https://react.dev/reference/react'); - Network accessline 125
const result = await fetchWithPlaywright('https://react.dev/reference/react'); - Network accessline 149
const { fetchWithPlaywright } = await import('../../../src/fetch/playwright-tier.js'); await expect( fetchWithPlaywright('https://react.dev/reference/react', { signal: controller.signal }), - Network accessline 150
await expect( fetchWithPlaywright('https://react.dev/reference/react', { signal: controller.signal }), ).rejects.toBe(abortReason); - Network accessline 151
fetchWithPlaywright('https://react.dev/reference/react', { signal: controller.signal }), - Network accessline 200
const promise = fetchWithPlaywright('https://react.dev/reference/react');
tests/unit/fetch/politeness.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/proxy-credentials.test.ts
- Executable scriptline 1
Executable file - Network accessline 10
describe('splitUserinfo', () => { it('splits user:pass@ from an http proxy URL', () => { const { bareUrl, userinfo } = splitUserinfo('http://alice:s3cret@proxy.example.com:8080'); - Network accessline 11
it('splits user:pass@ from an http proxy URL', () => { const { bareUrl, userinfo } = splitUserinfo('http://alice:s3cret@proxy.example.com:8080'); expect(userinfo).toBe('alice:s3cret'); - Network accessline 12
const { bareUrl, userinfo } = splitUserinfo('http://alice:s3cret@proxy.example.com:8080'); - Network accessline 13
expect(userinfo).toBe('alice:s3cret'); expect(bareUrl).toBe('http://proxy.example.com:8080/'); expect(bareUrl).not.toContain('alice'); - Network accessline 14
expect(bareUrl).toBe('http://proxy.example.com:8080/'); - Network accessline 19
it('handles a username-only userinfo', () => { const { bareUrl, userinfo } = splitUserinfo('http://tokenonly@proxy.local:3128'); - Network accessline 20
const { bareUrl, userinfo } = splitUserinfo('http://tokenonly@proxy.local:3128'); - Network accessline 25
it('returns null userinfo when there is none', () => { const { bareUrl, userinfo } = splitUserinfo('http://proxy.example.com:8080/'); - Network accessline 26
const { bareUrl, userinfo } = splitUserinfo('http://proxy.example.com:8080/'); - Network accessline 27
expect(userinfo).toBeNull(); expect(bareUrl).toBe('http://proxy.example.com:8080/'); }); - Network accessline 28
expect(bareUrl).toBe('http://proxy.example.com:8080/'); - Network accessline 37
it('preserves percent-encoded credentials verbatim in the userinfo', () => { const { userinfo } = splitUserinfo('http://user:p%40ss@proxy.example.com'); - Network accessline 38
const { userinfo } = splitUserinfo('http://user:p%40ss@proxy.example.com'); - Network accessline 43
describe('recomposeWithUserinfo', () => { it('injects userinfo into a bare URL', () => { const out = recomposeWithUserinfo('http://proxy.example.com:8080/', 'alice:s3cret'); - Network accessline 44
it('injects userinfo into a bare URL', () => { const out = recomposeWithUserinfo('http://proxy.example.com:8080/', 'alice:s3cret'); expect(out).toContain('alice:s3cret@'); - Network accessline 45
const out = recomposeWithUserinfo('http://proxy.example.com:8080/', 'alice:s3cret'); - Network accessline 50
it('round-trips split → recompose', () => { const original = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 51
const original = 'http://alice:s3cret@proxy.example.com:8080'; - Network accessline 58
it('returns the bare URL unchanged when userinfo is empty', () => { expect(recomposeWithUserinfo('http://proxy/', '')).toBe('http://proxy/'); - Network accessline 59
expect(recomposeWithUserinfo('http://proxy/', '')).toBe('http://proxy/'); - Access to secretsline 64
[Credential-related source omitted] - Network accessline 71
describe('playwrightProxyOption', () => { it('returns undefined when useProxy is false', () => { expect(playwrightProxyOption('http://p:1', false)).toBeUndefined(); - Network accessline 72
it('returns undefined when useProxy is false', () => { expect(playwrightProxyOption('http://p:1', false)).toBeUndefined(); }); - Network accessline 73
expect(playwrightProxyOption('http://p:1', false)).toBeUndefined(); - Network accessline 80
it('splits credentials into structured server/username/password (not the server string)', () => { const opt = playwrightProxyOption('http://alice:s3cret@proxy.example.com:8080', true); - Network accessline 81
const opt = playwrightProxyOption('http://alice:s3cret@proxy.example.com:8080', true); - Network accessline 91
it('returns a server-only option for a credential-free proxy', () => { const opt = playwrightProxyOption('http://proxy.example.com:8080', true); - Network accessline 92
const opt = playwrightProxyOption('http://proxy.example.com:8080', true);
tests/unit/fetch/reddit-api.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
describe('isRedditUrl', () => { it('matches reddit host families', () => { expect(isRedditUrl('https://reddit.com/r/rust')).toBe(true); - Network accessline 43
it('matches reddit host families', () => { expect(isRedditUrl('https://reddit.com/r/rust')).toBe(true); expect(isRedditUrl('https://www.reddit.com/r/rust')).toBe(true); - Network accessline 44
expect(isRedditUrl('https://reddit.com/r/rust')).toBe(true); - Network accessline 45
expect(isRedditUrl('https://www.reddit.com/r/rust')).toBe(true); - Network accessline 46
expect(isRedditUrl('https://old.reddit.com/r/rust/comments/abc/x')).toBe(true); - Network accessline 47
expect(isRedditUrl('https://np.reddit.com/r/rust')).toBe(true); - Network accessline 48
expect(isRedditUrl('https://redd.it/abc123')).toBe(true); - Network accessline 49
expect(isRedditUrl('https://foo.reddit.com/x')).toBe(true); - Network accessline 52
it('rejects non-reddit hosts', () => { expect(isRedditUrl('https://example.com/r/rust')).toBe(false); - Network accessline 53
expect(isRedditUrl('https://example.com/r/rust')).toBe(false); - Network accessline 54
expect(isRedditUrl('https://notreddit.com')).toBe(false); - Network accessline 56
expect(isRedditUrl('https://reddit.com.evil.example')).toBe(false); - Network accessline 65
describe('mapRedditUrlToEndpoint', () => { it('maps a subreddit listing (default hot)', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust')).toBe('/r/rust/hot'); - Network accessline 66
it('maps a subreddit listing (default hot)', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust')).toBe('/r/rust/hot'); expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/')).toBe('/r/rust/hot'); - Network accessline 67
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust')).toBe('/r/rust/hot'); - Network accessline 68
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/')).toBe('/r/rust/hot'); - Network accessline 71
it('maps a subreddit listing with an explicit sort', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/top')).toBe('/r/rust/top'); - Network accessline 72
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/top')).toBe('/r/rust/top'); - Network accessline 73
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/new')).toBe('/r/rust/new'); - Network accessline 76
it('maps a comments / post URL', () => { expect( mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/abc123/some_title/'), - Network accessline 77
expect( mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/abc123/some_title/'), ).toBe('/r/rust/comments/abc123'); - Network accessline 78
mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/abc123/some_title/'), - Network accessline 82
it('maps a user URL', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/user/spez')).toBe('/user/spez/about'); - Network accessline 83
expect(mapRedditUrlToEndpoint('https://www.reddit.com/user/spez')).toBe('/user/spez/about'); - Network accessline 84
expect(mapRedditUrlToEndpoint('https://www.reddit.com/u/spez')).toBe('/user/spez/about'); - Network accessline 87
it('returns null for unknown reddit shapes (falls through)', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/')).toBeNull(); - Network accessline 88
expect(mapRedditUrlToEndpoint('https://www.reddit.com/')).toBeNull(); - Network accessline 89
expect(mapRedditUrlToEndpoint('https://redd.it/abc123')).toBeNull(); - Network accessline 90
expect(mapRedditUrlToEndpoint('https://www.reddit.com/settings')).toBeNull(); - Network accessline 98
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/ru$st!/hot')).toBeNull(); - Network accessline 99
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/a.b.c/hot')).toBeNull(); - Network accessline 101
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/hot')).toBe('/r/rust/hot'); - Access to secretsline 112
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Network accessline 153
const [tokenUrl, opts] = fetchFn.mock.calls[0]; expect(tokenUrl).toBe('https://www.reddit.com/api/v1/access_token'); - Network accessline 154
[Credential-related source omitted] - Access to secretsline 154
[Credential-related source omitted] - Network accessline 185
const fetchFn = vi.fn<FetchFn>().mockResolvedValue( jsonResponse({}, { status: 302, headers: { location: 'http://169.254.169.254/' } }), - Network accessline 186
jsonResponse({}, { status: 302, headers: { location: 'http://169.254.169.254/' } }), - Network accessline 195
const fetchedUrls = fetchFn.mock.calls.map((c) => String(c[0])); expect(fetchedUrls).not.toContain('http://169.254.169.254/'); - Network accessline 196
expect(fetchedUrls).not.toContain('http://169.254.169.254/'); - Access to secretsline 209
[Credential-related source omitted] - Network accessline 288
expect(result).not.toBeNull(); expect(result!.title).toBe('r/rust'); expect(result!.markdown).toContain('[Post One](https://www.reddit.com/r/rust/comments/p1/post_one/)'); - Network accessline 289
expect(result!.title).toBe('r/rust'); expect(result!.markdown).toContain('[Post One](https://www.reddit.com/r/rust/comments/p1/post_one/)'); }); - Network accessline 290
expect(result!.markdown).toContain('[Post One](https://www.reddit.com/r/rust/comments/p1/post_one/)'); - Access to secretsline 310
[Credential-related source omitted] - Network accessline 323
const result = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn); - Network accessline 332
const fetchFn = vi.fn<FetchFn>(); const mgr = new RedditTokenManager(CREDS, fetchFn as unknown as FetchFn, () => 0); const result = await fetchViaRedditApi('https://redd.it/abc123', mgr, CREDS, fetchFn as unknown as FetchFn); - Network accessline 333
const mgr = new RedditTokenManager(CREDS, fetchFn as unknown as FetchFn, () => 0); const result = await fetchViaRedditApi('https://redd.it/abc123', mgr, CREDS, fetchFn as unknown as FetchFn); expect(result).toBeNull(); - Network accessline 334
const result = await fetchViaRedditApi('https://redd.it/abc123', mgr, CREDS, fetchFn as unknown as FetchFn); - Network accessline 341
const fetchFn = tokenThen(jsonResponse({}, { status: 429, headers: { 'retry-after': '120' } })); const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, - Network accessline 342
const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn).catch((e) => e); expect(err).toBeInstanceOf(RedditRateLimitError); - Network accessline 343
const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn).catch((e) => e); - Network accessline 349
const fetchFn = tokenThen(jsonResponse({}, { status: 429 })); const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn).catch((e) => e); - Network accessline 350
const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn).catch((e) => e); expect(err).toBeInstanceOf(RedditRateLimitError); - Network accessline 351
const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn).catch((e) => e); - Network accessline 361
const fetchFn = tokenThen( jsonResponse({}, { status: 302, headers: { location: 'http://169.254.169.254/' } }), - Network accessline 362
jsonResponse({}, { status: 302, headers: { location: 'http://169.254.169.254/' } }), - Network accessline 366
const err = await fetchViaRedditApi('https://www.reddit.com/r/rust', mgr, CREDS, fetchFn).catch((e) => e); - Network accessline 375
const fetchedUrls = calls.map((c) => String(c[0])); expect(fetchedUrls).not.toContain('http://169.254.169.254/'); - Network accessline 376
expect(fetchedUrls).not.toContain('http://169.254.169.254/'); - Network accessline 388
const hostile = await fetchViaRedditApi( 'https://www.reddit.com/r/rust@evil.example/hot', - Network accessline 389
'https://www.reddit.com/r/rust@evil.example/hot', - Network accessline 398
await fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn); - Access to secretsline 412
[Credential-related source omitted] - Access to secretsline 423
[Credential-related source omitted] - Access to secretsline 424
[Credential-related source omitted] - Network accessline 426
}) as unknown as FetchFn; const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); await fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn); - Network accessline 427
const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); await fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn); expect(calls.length).toBe(2); - Network accessline 428
await fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn); - Access to secretsline 436
[Credential-related source omitted] - Network accessline 441
const mgr = new RedditTokenManager(CREDS, fetchFn, () => 0); await expect( fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn, ac.signal), - Network accessline 442
await expect( fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn, ac.signal), ).rejects.toThrow(); - Network accessline 443
fetchViaRedditApi('https://www.reddit.com/r/rust/hot', mgr, CREDS, fetchFn, ac.signal),
tests/unit/fetch/reddit-url-fidelity.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
describe('reddit endpoint mapping never silently substitutes a different resource', () => { it('refuses a subreddit whose name had to be rewritten', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/foo.bar/')).toBeNull( - Network accessline 15
it('refuses a subreddit whose name had to be rewritten', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/foo.bar/')).toBeNull(); }); - Network accessline 16
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/foo.bar/')).toBeNull(); - Network accessline 21
expect( mapRedditUrlToEndpoint('https://www.reddit.com/r/AskReddit%2F..%2Fpolitics/'), - Network accessline 22
mapRedditUrlToEndpoint('https://www.reddit.com/r/AskReddit%2F..%2Fpolitics/'), - Network accessline 26
it('refuses a rewritten username', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/user/bad$name')).toBeNull(); - Network accessline 27
expect(mapRedditUrlToEndpoint('https://www.reddit.com/user/bad$name')).toBeNull(); - Network accessline 30
it('refuses a rewritten thread id', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/ab!c12/title/')).toBeNull(); - Network accessline 31
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/ab!c12/title/')).toBeNull(); - Network accessline 34
it('still maps clean URLs exactly as before', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/abc123/title/')).toBe( - Network accessline 35
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/comments/abc123/title/')).toBe( - Network accessline 36
'/r/rust/comments/abc123', ); expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/')).toBe('/r/rust/hot'); - Network accessline 37
); expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/')).toBe('/r/rust/hot'); expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/top')).toBe('/r/rust/top'); - Network accessline 38
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/')).toBe('/r/rust/hot'); - Network accessline 39
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/rust/top')).toBe('/r/rust/top'); - Network accessline 40
expect(mapRedditUrlToEndpoint('https://www.reddit.com/user/spez')).toBe('/user/spez/about'); - Network accessline 41
expect(mapRedditUrlToEndpoint('https://www.reddit.com/u/spez')).toBe('/user/spez/about'); - Network accessline 44
it('accepts the underscore and hyphen that are legal in reddit names', () => { expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/my_sub-name/')).toBe( - Network accessline 45
expect(mapRedditUrlToEndpoint('https://www.reddit.com/r/my_sub-name/')).toBe(
tests/unit/fetch/redirect-guard.test.ts
- Executable scriptline 1
Executable file - Network accessline 50
it('refuses a 302 into a link-local metadata address (169.254.169.254)', async () => { server = await startServer((_req, res) => { res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 51
server = await startServer((_req, res) => { res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); res.end(); - Network accessline 52
res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 53
res.end(); }); const url = `http://127.0.0.1:${getPort(server)}/redir-metadata`; - Network accessline 54
}); const url = `http://127.0.0.1:${getPort(server)}/redir-metadata`; await expect(httpFetch(url)).rejects.toThrow(/link-local|metadata|blocked/i); - Network accessline 55
const url = `http://127.0.0.1:${getPort(server)}/redir-metadata`; - Network accessline 59
it('refuses a 302 into a private RFC1918 address by default', async () => { server = await startServer((_req, res) => { res.writeHead(302, { location: 'http://10.0.0.5/internal' }); - Network accessline 60
server = await startServer((_req, res) => { res.writeHead(302, { location: 'http://10.0.0.5/internal' }); res.end(); - Network accessline 61
res.writeHead(302, { location: 'http://10.0.0.5/internal' }); - Network accessline 62
res.end(); }); const url = `http://127.0.0.1:${getPort(server)}/redir-private`; - Network accessline 63
}); const url = `http://127.0.0.1:${getPort(server)}/redir-private`; await expect(httpFetch(url)).rejects.toThrow(/private|blocked|WIGOLO_FETCH_ALLOW_PRIVATE/i); - Network accessline 64
const url = `http://127.0.0.1:${getPort(server)}/redir-private`; - Network accessline 74
}); server = await startServer((_req, res) => { res.writeHead(302, { location: `http://127.0.0.1:${getPort(end)}/final` }); - Network accessline 75
server = await startServer((_req, res) => { res.writeHead(302, { location: `http://127.0.0.1:${getPort(end)}/final` }); res.end(); - Network accessline 76
res.writeHead(302, { location: `http://127.0.0.1:${getPort(end)}/final` }); - Network accessline 77
res.end(); }); const url = `http://127.0.0.1:${getPort(server)}/start`; - Network accessline 78
}); const url = `http://127.0.0.1:${getPort(server)}/start`; try { - Network accessline 79
const url = `http://127.0.0.1:${getPort(server)}/start`; - Network accessline 90
server = await startServer((req, res) => { const n = parseInt(req.url!.slice(1)) || 0; res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/${n + 1}` }); - Network accessline 91
const n = parseInt(req.url!.slice(1)) || 0; res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/${n + 1}` }); res.end(); - Network accessline 92
res.writeHead(302, { location: `http://127.0.0.1:${getPort(server)}/${n + 1}` }); - Network accessline 95
process.env.MAX_REDIRECTS = '3'; resetConfig(); const url = `http://127.0.0.1:${getPort(server)}/0`; - Network accessline 96
resetConfig(); const url = `http://127.0.0.1:${getPort(server)}/0`; await expect(httpFetch(url)).rejects.toThrow(/redirect/i); - Network accessline 97
const url = `http://127.0.0.1:${getPort(server)}/0`; - Network accessline 109
resetConfig(); server = await startServer((_req, res) => { res.writeHead(302, { location: `http://10.0.0.5:59999/never` }); - Network accessline 110
server = await startServer((_req, res) => { res.writeHead(302, { location: `http://10.0.0.5:59999/never` }); res.end(); - Network accessline 111
res.writeHead(302, { location: `http://10.0.0.5:59999/never` }); - Network accessline 116
const priv = `http://127.0.0.1:${getPort(server)}/redir-private-allowed`; - Network accessline 127
server = await startServer((_req, res) => { res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 128
res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 129
res.end(); }); const meta = `http://127.0.0.1:${getPort(server)}/redir-metadata-still-blocked`; - Network accessline 130
}); const meta = `http://127.0.0.1:${getPort(server)}/redir-metadata-still-blocked`; await expect(httpFetch(meta)).rejects.toThrow(/link-local|metadata|blocked/i); - Network accessline 131
const meta = `http://127.0.0.1:${getPort(server)}/redir-metadata-still-blocked`; - Network accessline 154
server = await startServer((_req, res) => { res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 155
res.writeHead(302, { location: 'http://169.254.169.254/latest/meta-data/' }); - Network accessline 156
res.end(); }); const url = `http://127.0.0.1:${getPort(server)}/pdf-redir`; - Network accessline 157
}); const url = `http://127.0.0.1:${getPort(server)}/pdf-redir`; const result = await defaultPdfProbe(url); - Network accessline 158
const url = `http://127.0.0.1:${getPort(server)}/pdf-redir`; - Network accessline 167
}); server = await startServer((_req, res) => { res.writeHead(302, { location: `http://127.0.0.1:${getPort(pdf)}/doc.pdf` }); - Network accessline 168
server = await startServer((_req, res) => { res.writeHead(302, { location: `http://127.0.0.1:${getPort(pdf)}/doc.pdf` }); res.end(); - Network accessline 169
res.writeHead(302, { location: `http://127.0.0.1:${getPort(pdf)}/doc.pdf` }); - Network accessline 170
res.end(); }); const url = `http://127.0.0.1:${getPort(server)}/redir-to-pdf`; - Network accessline 171
}); const url = `http://127.0.0.1:${getPort(server)}/redir-to-pdf`; try { - Network accessline 172
const url = `http://127.0.0.1:${getPort(server)}/redir-to-pdf`;
tests/unit/fetch/resource-leak-guards.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/router-antibot-domains.test.ts
- Executable scriptline 1
Executable file - Network accessline 121
const { router, httpClient, tlsFetcher, browserPool, recordedDomains } = build(); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://stackoverflow.com/questions/123')); - Network accessline 122
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://stackoverflow.com/questions/123')); - Network accessline 124
const result = await router.fetch('https://stackoverflow.com/questions/123'); - Network accessline 138
const { router, httpClient, tlsFetcher } = build(); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://serverfault.com/questions/9')); - Network accessline 139
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://serverfault.com/questions/9')); - Network accessline 141
const result = await router.fetch('https://serverfault.com/questions/9'); - Network accessline 152
const { router, httpClient, tlsFetcher } = build(); const result = await router.fetch('https://example.com/page'); - Network accessline 153
const result = await router.fetch('https://example.com/page'); - Network accessline 169
const { router, httpClient, tlsFetcher } = build(); const result = await router.fetch('https://evil-stackoverflow.com/questions/1'); - Network accessline 170
const result = await router.fetch('https://evil-stackoverflow.com/questions/1'); - Network accessline 181
const { router, httpClient, tlsFetcher } = build(); const result = await router.fetch('https://stackoverflow.com.attacker.test/questions/1'); - Network accessline 182
const result = await router.fetch('https://stackoverflow.com.attacker.test/questions/1'); - Network accessline 196
const { router, httpClient, tlsFetcher } = build(); vi.mocked(tlsFetcher).mockRejectedValue(new TlsTierUnavailableError(new Error('not installed'))); vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult('https://stackove - Network accessline 198
vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult('https://stackoverflow.com/questions/1')); - Network accessline 200
const result = await router.fetch('https://stackoverflow.com/questions/1'); - Network accessline 218
const timeoutErr = Object.assign(new Error('Request timed out'), { name: 'TimeoutError' }); vi.mocked(httpClient.fetch).mockRejectedValue(timeoutErr); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://flaky.example/ - Network accessline 220
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://flaky.example/page')); - Network accessline 222
const result = await router.fetch('https://flaky.example/page'); - Network accessline 237
const sockErr = Object.assign(new Error('connect ETIMEDOUT'), { code: 'ETIMEDOUT' }); vi.mocked(httpClient.fetch).mockRejectedValue(sockErr); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://flaky.example/page')); - Network accessline 239
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://flaky.example/page')); - Network accessline 241
const result = await router.fetch('https://flaky.example/page'); - Network accessline 254
await expect(router.fetch('https://plain.example/page')).rejects.toThrow(/timed out/i); - Network accessline 264
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://generic.example/page')); - Network accessline 266
const result = await router.fetch('https://generic.example/page'); - Network accessline 278
const { router, httpClient, tlsFetcher } = build(); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://mycustom.example/x')); - Network accessline 279
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://mycustom.example/x')); - Network accessline 281
const result = await router.fetch('https://mycustom.example/x'); - Network accessline 292
const { router, httpClient, tlsFetcher } = build(); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://docs.custom.test/x')); - Network accessline 293
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult('https://docs.custom.test/x')); - Network accessline 295
const result = await router.fetch('https://docs.custom.test/x'); - Network accessline 312
expect(optsArg?.signal).toBe(controller.signal); return makeTlsResult('https://stackoverflow.com/questions/55'); - Network accessline 313
return makeTlsResult('https://stackoverflow.com/questions/55'); - Network accessline 316
await router.fetch('https://stackoverflow.com/questions/55', { signal: controller.signal }); - Network accessline 326
const { router, httpClient, tlsFetcher } = build(); const result = await router.fetch('https://stackoverflow.com/questions/2', { renderJs: 'never' }); - Network accessline 327
const result = await router.fetch('https://stackoverflow.com/questions/2', { renderJs: 'never' }); - Network accessline 351
const { router, httpClient, browserPool, tlsFetcher } = build(); vi.mocked(httpClient.fetch).mockResolvedValue( makeHttpResult('https://www.upwork.com/freelancers/foo', { - Network accessline 352
vi.mocked(httpClient.fetch).mockResolvedValue( makeHttpResult('https://www.upwork.com/freelancers/foo', { statusCode: 403, - Network accessline 353
makeHttpResult('https://www.upwork.com/freelancers/foo', { - Network accessline 360
const result = await router.fetch('https://www.upwork.com/freelancers/foo'); - Network accessline 384
vi.mocked(httpClient.fetch).mockResolvedValue( makeHttpResult('https://example.com/private', { statusCode: 403, html: admin403 }), - Network accessline 385
makeHttpResult('https://example.com/private', { statusCode: 403, html: admin403 }), - Network accessline 388
const result = await router.fetch('https://example.com/private'); - Network accessline 404
guardChallengeShell: (raw: RawFetchResult) => RawFetchResult | { error: string }; }).guardChallengeShell({ url: 'https://www.upwork.com/x', - Network accessline 405
}).guardChallengeShell({ url: 'https://www.upwork.com/x', finalUrl: 'https://www.upwork.com/x', - Network accessline 406
url: 'https://www.upwork.com/x', - Network accessline 407
finalUrl: 'https://www.upwork.com/x', - Network accessline 422
const { router } = build(); const clean: RawFetchResult = { url: 'https://example.com/', - Network accessline 423
const clean: RawFetchResult = { url: 'https://example.com/', finalUrl: 'https://example.com/', - Network accessline 424
url: 'https://example.com/', - Network accessline 425
finalUrl: 'https://example.com/',
tests/unit/fetch/router-browser-acquire.test.ts
- Executable scriptline 1
Executable file - Network accessline 29
function makeHttpResult(html = FULL_HTML, statusCode = 200): Awaited<ReturnType<HttpClient['fetch']>> { return { url: 'https://example.com/page', - Network accessline 30
return { url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 31
url: 'https://example.com/page', - Network accessline 32
finalUrl: 'https://example.com/page', - Network accessline 40
function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 74
const result = await router.fetch('https://example.com/page'); - Network accessline 86
await expect(router.fetch('https://x.example/', { renderJs: 'never' })).rejects.toThrow('boom'); - Network accessline 94
await router.fetch('https://example.com/page', { mode: 'cache' }); - Network accessline 102
const result = await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 110
const { acquirer, ensure } = makeAcquirer('ready'); const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://example.com/page', { renderJs: - Network accessline 111
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://example.com/page', { renderJs: 'always' }); expect(ensure).toHaveBeenCalledOnce(); - Network accessline 112
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 118
const { acquirer, ensure } = makeAcquirer('ready'); const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://example.com/protected', { useAu - Network accessline 119
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://example.com/protected', { useAuth: true }); expect(ensure).toHaveBeenCalledOnce(); - Network accessline 120
await router.fetch('https://example.com/protected', { useAuth: true }); - Network accessline 125
const { acquirer, ensure } = makeAcquirer('ready'); const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://example.com/page', { actions: [ - Network accessline 126
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://example.com/page', { actions: [{ type: 'click', selector: '.b' }] }); expect(ensure - Network accessline 127
await router.fetch('https://example.com/page', { actions: [{ type: 'click', selector: '.b' }] }); - Network accessline 132
const { acquirer, ensure } = makeAcquirer('ready'); const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(m - Network accessline 133
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://react.dev/learn')); await - Network accessline 134
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://react.dev/learn')); await router.fetch('https://react.dev/learn'); expect(ensure).toHaveBeenCalledOnce(); - Network accessline 135
await router.fetch('https://react.dev/learn'); - Network accessline 141
const { acquirer, ensure } = makeAcquirer('ready'); const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://spa.example/page'); - Network accessline 142
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://spa.example/page'); expect(ensure).toHaveBeenCalledOnce(); - Network accessline 143
await router.fetch('https://spa.example/page'); - Network accessline 154
const { acquirer, ensure } = makeAcquirer('ready'); const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://blocked.example/'); - Network accessline 155
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); await router.fetch('https://blocked.example/'); expect(ensure).toHaveBeenCalledOnce(); - Network accessline 156
await router.fetch('https://blocked.example/'); - Network accessline 165
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false, browserAcquirer: acquirer }); for (let i = 0; i < 2; i++) { await expect(router.fetch(`https://fail.example/${i}`)).rejects.toThrow(); - Network accessline 166
for (let i = 0; i < 2; i++) { await expect(router.fetch(`https://fail.example/${i}`)).rejects.toThrow(); } - Network accessline 167
await expect(router.fetch(`https://fail.example/${i}`)).rejects.toThrow(); - Network accessline 168
} await router.fetch('https://fail.example/final'); expect(ensure).toHaveBeenCalledOnce(); - Network accessline 169
await router.fetch('https://fail.example/final'); - Network accessline 180
const result = await router.fetch('https://spa.example/page') as RawFetchResult; - Network accessline 196
const result = await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 211
const thinHtml = '<html><body>x</body></html>'; const httpFetcher = vi.fn(async () => ({ url: 'https://s.example/', html: thinHtml, text: 'x' })); - Network accessline 212
const httpFetcher = vi.fn(async () => ({ url: 'https://s.example/', html: thinHtml, text: 'x' })); - Network accessline 223
const result = await router.fetch('https://s.example/', { mode: 'stealth' }) as RawFetchResult; - Network accessline 233
it('stealth-mode escalation proceeds to the browser tier when acquisition is ready', async () => { const httpFetcher = vi.fn(async () => ({ url: 'https://s.example/', html: '<html><body>x</body></html>', text: 'x' })); - Network accessline 234
const httpFetcher = vi.fn(async () => ({ url: 'https://s.example/', html: '<html><body>x</body></html>', text: 'x' })); - Network accessline 245
const result = await router.fetch('https://s.example/', { mode: 'stealth' }) as RawFetchResult; - Network accessline 258
for (let i = 0; i < 2; i++) { await expect(router.fetch(`https://fail.example/${i}`)).rejects.toThrow(); - Network accessline 259
await expect(router.fetch(`https://fail.example/${i}`)).rejects.toThrow(); - Network accessline 260
} const result = await router.fetch('https://fail.example/final'); expect(browserPool.fetchWithBrowser).not.toHaveBeenCalled(); - Network accessline 261
const result = await router.fetch('https://fail.example/final');
tests/unit/fetch/router-challenge-status.test.ts
- Executable scriptline 1
Executable file - Network accessline 59
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 60
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 61
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 72
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 73
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 74
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 91
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 92
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 93
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 114
function proxyEnv() { process.env.USE_PROXY = 'true'; process.env.PROXY_URL = 'http://proxy.example.com:8080'; - Network accessline 116
process.env.PROXY_URL = 'http://proxy.example.com:8080'; - Network accessline 134
pdfProbe: async () => false, }); await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 136
await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 154
pdfProbe: async () => false, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 155
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect((result as StageError).error).toBeUndefined(); - Network accessline 156
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 182
pdfProbe: async () => false, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 183
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 184
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 202
pdfProbe: async () => false, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 203
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect((result as StageError).error).toBe('blocked_by_challenge'); - Network accessline 204
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 209
it('no proxy configured → no extra fetch (single attempt only)', async () => { - Network accessline 217
pdfProbe: async () => false, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 218
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect((result as StageError).error).toBe('blocked_by_challenge'); - Network accessline 219
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 232
pdfProbe: async () => false, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 233
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 234
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 266
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 267
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 268
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 288
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 289
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); const err = result as StageError; - Network accessline 290
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' });
tests/unit/fetch/router-clearance-route-gate.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 44
function build(stored: Record<string, DomainClearance>) { const httpClient = { fetch: vi.fn(async () => ({ url: 'https://example.com/page', finalUrl: 'https://example.com/page', html: FULL_HTML, - Network accessline 45
const httpClient = { fetch: vi.fn(async () => ({ url: 'https://example.com/page', finalUrl: 'https://example.com/page', html: FULL_HTML, contentType: 'text/html', statusCode: 200, headers: {}, - Network accessline 46
url: 'https://example.com/page', finalUrl: 'https://example.com/page', html: FULL_HTML, - Network accessline 76
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future(), solvedRoute: 'direct' }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 77
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 78
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 86
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future() }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 87
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 88
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 95
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future(), solvedRoute: 'http://proxy.example:8080', - Network accessline 96
cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future(), solvedRoute: 'http://proxy.example:8080', }, - Network accessline 97
solvedRoute: 'http://proxy.example:8080', - Network accessline 98
}, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 99
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 100
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 106
it('MISMATCH: a direct-solved clearance is NOT reused when a proxy route is active', async () => { process.env.PROXY_URL = 'http://proxy.example:8080'; - Network accessline 107
process.env.PROXY_URL = 'http://proxy.example:8080'; - Network accessline 111
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future(), solvedRoute: 'direct' }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 112
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 113
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 118
it('MATCH: a proxy-solved clearance IS reused when the SAME proxy route is active', async () => { process.env.PROXY_URL = 'http://proxy.example:8080'; - Network accessline 119
process.env.PROXY_URL = 'http://proxy.example:8080'; - Network accessline 123
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future(), solvedRoute: 'http://proxy.example:8080', - Network accessline 124
cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future(), solvedRoute: 'http://proxy.example:8080', }, - Network accessline 125
solvedRoute: 'http://proxy.example:8080', - Network accessline 126
}, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 127
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 128
await router.fetch('https://example.com/page', { renderJs: 'always' });
tests/unit/fetch/router-clearance.test.ts
- Executable scriptline 1
Executable file - Network accessline 50
function makeHttpResult(): Awaited<ReturnType<HttpClient['fetch']>> { return { url: 'https://example.com/page', - Network accessline 51
return { url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 52
url: 'https://example.com/page', - Network accessline 53
finalUrl: 'https://example.com/page', - Network accessline 58
}; } function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 59
} function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { return { url, finalUrl: url, html: FULL_HTML, contentType: 'text/html', statusCode: 200, method: 'browser', headers: {} }; - Network accessline 60
function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 61
return { url, finalUrl: url, html: FULL_HTML, contentType: 'text/html', statusCode: 200, method: 'browser', headers: {} }; } function makeTlsResult(url = 'https://example.com/page'): TlsFetchResult { - Network accessline 62
} function makeTlsResult(url = 'https://example.com/page'): TlsFetchResult { return { url, finalUrl: url, html: FULL_HTML, contentType: 'text/html', statusCode: 200, headers: {} }; - Network accessline 63
function makeTlsResult(url = 'https://example.com/page'): TlsFetchResult { - Network accessline 104
it('injects a stored, fresh, Chrome-UA-matching clearance into a browser fetch (same host)', async () => { - Network accessline 106
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future() }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 107
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledTimes(1); - Network accessline 108
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 116
'other.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: future() }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 117
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 118
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 125
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'browser', expiresAt: past() }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 126
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 127
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 135
'example.com': { cookie: 'cf_clearance=TOK', ua: FIREFOX_UA, tier: 'tls', expiresAt: future() }, }); await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 136
}); await router.fetch('https://example.com/page', { renderJs: 'always' }); const opts = browserPool.fetchWithBrowser.mock.calls[0][1]; - Network accessline 137
await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 152
'example.com': { cookie: 'cf_clearance=TOK', ua: FIREFOX_UA, tier: 'tls', expiresAt: future() }, }); await router.fetch('https://example.com/page'); - Network accessline 153
}); await router.fetch('https://example.com/page'); expect(tlsFetcher).toHaveBeenCalled(); - Network accessline 154
await router.fetch('https://example.com/page'); - Network accessline 162
'example.com': { cookie: 'cf_clearance=TOK', ua: CHROME_UA, tier: 'tls', expiresAt: future() }, }); await router.fetch('https://example.com/page', { headers: { Cookie: 'sid=1' } }); - Network accessline 163
}); await router.fetch('https://example.com/page', { headers: { Cookie: 'sid=1' } }); const opts = tlsFetcher.mock.calls[0][1]; - Network accessline 164
await router.fetch('https://example.com/page', { headers: { Cookie: 'sid=1' } }); - Network accessline 194
}); void browserPool; const res = await router.fetch('https://example.com/page'); - Network accessline 196
const res = await router.fetch('https://example.com/page');
tests/unit/fetch/router-escalation-tuning.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
function makeHttpResult(opts: { html?: string; statusCode?: number; headers?: Record<string, string>; url?: string } = {}): Awaited<ReturnType<HttpClient['fetch']>> { const url = opts.url ?? 'https://example.com/page'; - Network accessline 54
const url = opts.url ?? 'https://example.com/page'; - Network accessline 65
function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 117
</body></html>`; const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://substantive-noscript.example/post' }), - Network accessline 118
const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://substantive-noscript.example/post' }), browserFetcher: async () => { throw new Error('Playwright must NO - Network accessline 119
httpFetcher: async () => makeHttpResult({ html, url: 'https://substantive-noscript.example/post' }), - Network accessline 120
browserFetcher: async () => { throw new Error('Playwright must NOT be invoked: substantive <noscript> is not a JS-required marker'); }, }); const result = await router.fetch('https://substantive-noscript.example/post'); - Network accessline 121
}); const result = await router.fetch('https://substantive-noscript.example/post'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 122
const result = await router.fetch('https://substantive-noscript.example/post'); - Network accessline 130
const html = `<!doctype html><html><body><div id="root"></div><script>${'var a = 1;'.repeat(500)}</script></body></html>`; const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ htm - Network accessline 131
const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://true-spa.example/' }), }); - Network accessline 132
httpFetcher: async () => makeHttpResult({ html, url: 'https://true-spa.example/' }), }); const result = await router.fetch('https://true-spa.example/'); - Network accessline 133
}); const result = await router.fetch('https://true-spa.example/'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 134
const result = await router.fetch('https://true-spa.example/'); - Network accessline 148
</body></html>`; const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://docs-ssr.example/intro' }), - Network accessline 149
const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://docs-ssr.example/intro' }), browserFetcher: async () => { throw new Error('Playwright must NOT be invoke - Network accessline 150
httpFetcher: async () => makeHttpResult({ html, url: 'https://docs-ssr.example/intro' }), - Network accessline 151
browserFetcher: async () => { throw new Error('Playwright must NOT be invoked: defensive <noscript> alongside substantive SSR body'); }, }); const result = await router.fetch('https://docs-ssr.example/intro'); - Network accessline 152
}); const result = await router.fetch('https://docs-ssr.example/intro'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 153
const result = await router.fetch('https://docs-ssr.example/intro'); - Network accessline 171
</body></html>`; const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://shell-with-content.example/post' }), - Network accessline 172
const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://shell-with-content.example/post' }), browserFetcher: async () => { throw new Error('Playwright must NOT - Network accessline 173
httpFetcher: async () => makeHttpResult({ html, url: 'https://shell-with-content.example/post' }), - Network accessline 174
browserFetcher: async () => { throw new Error('Playwright must NOT be invoked when SSR populates the shell with substantive content'); }, }); const result = await router.fetch('https://shell-with-content.example/post'); - Network accessline 175
}); const result = await router.fetch('https://shell-with-content.example/post'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 176
const result = await router.fetch('https://shell-with-content.example/post'); - Network accessline 184
const html = `<!doctype html><html><body><div id="root">Tiny</div></body></html>`; const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://empty.example/' }), - Network accessline 185
const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ html, url: 'https://empty.example/' }), }); - Network accessline 186
httpFetcher: async () => makeHttpResult({ html, url: 'https://empty.example/' }), }); const result = await router.fetch('https://empty.example/'); - Network accessline 187
}); const result = await router.fetch('https://empty.example/'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 188
const result = await router.fetch('https://empty.example/'); - Network accessline 200
const { router, httpClient, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ statusCode: 429, html: '<html><body>Too Many Requests</body></html>', headers: { 'retry-after': '120' }, url: 'https://rat - Network accessline 201
httpFetcher: async () => makeHttpResult({ statusCode: 429, html: '<html><body>Too Many Requests</body></html>', headers: { 'retry-after': '120' }, url: 'https://rate-limited.example/api' }), browserFetcher: async () => { t - Network accessline 202
makeHttpResult({ statusCode: 429, html: '<html><body>Too Many Requests</body></html>', headers: { 'retry-after': '120' }, url: 'https://rate-limited.example/api' }), - Network accessline 203
browserFetcher: async () => { throw new Error('Playwright must NOT be invoked on a 429 + Retry-After rate-limit'); }, }); const result = await router.fetch('https://rate-limited.example/api'); - Network accessline 204
}); const result = await router.fetch('https://rate-limited.example/api'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 205
const result = await router.fetch('https://rate-limited.example/api'); - Network accessline 213
const { router, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ statusCode: 403, html, url: 'https://cf-protected.example/' }), - Network accessline 214
httpFetcher: async () => makeHttpResult({ statusCode: 403, html, url: 'https://cf-protected.example/' }), }); - Network accessline 215
makeHttpResult({ statusCode: 403, html, url: 'https://cf-protected.example/' }), }); const result = await router.fetch('https://cf-protected.example/'); - Network accessline 216
}); const result = await router.fetch('https://cf-protected.example/'); expect(browserPool.fetchWithBrowser).toHaveBeenCalledOnce(); - Network accessline 217
const result = await router.fetch('https://cf-protected.example/'); - Network accessline 224
const { router, browserPool } = buildRouter({ httpFetcher: async () => makeHttpResult({ statusCode: 503, html, url: 'https://cf-503.example/' }), - Network accessline 225
httpFetcher: async () => makeHttpResult({ statusCode: 503, html, url: 'https://cf-503.example/' }), }); - Network accessline 226
makeHttpResult({ statusCode: 503, html, url: 'https://cf-503.example/' }), }); const result = await router.fetch('https://cf-503.example/'); - Network accessline 227
}); const result = await router.fetch('https://cf-503.example/'); expect(browserPool.fetchWithBrowser).toHaveBeenCalledOnce(); - Network accessline 228
const result = await router.fetch('https://cf-503.example/'); - Network accessline 258
const r1 = await router.fetch('https://react.dev/learn', { renderJs: 'never' }); - Network accessline 263
const r2 = await router.fetch('https://react.dev/reference', { renderJs: 'auto' });
tests/unit/fetch/router-escape-hatch.test.ts
- Executable scriptline 1
Executable file - Network accessline 82
escapeHatch, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 83
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect((result as { error?: string }).error).toBe('blocked_by_challenge'); - Network accessline 84
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 90
it('tries solver first when solverUrl is set; a solved page short-circuits', async () => { process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191'; - Network accessline 91
process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191'; - Network accessline 92
process.env.WIGOLO_HOSTED_READER_URL = 'https://reader.example.com'; - Network accessline 93
resetConfig(); solverFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); const router = new SmartRouter({ - Network accessline 94
solverFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); - Network accessline 99
escapeHatch, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 100
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect(result.html).toContain('cleared by escape hatch'); - Network accessline 101
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 108
it('falls through to the reader when the solver returns null', async () => { process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191'; - Network accessline 109
process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191'; - Network accessline 110
process.env.WIGOLO_HOSTED_READER_URL = 'https://reader.example.com'; - Network accessline 111
resetConfig(); solverFetch.mockResolvedValueOnce(null); hostedReaderFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); - Network accessline 112
solverFetch.mockResolvedValueOnce(null); hostedReaderFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); const router = new SmartRouter({ - Network accessline 113
hostedReaderFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); - Network accessline 118
escapeHatch, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 119
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect(result.html).toContain('cleared by escape hatch'); - Network accessline 120
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 126
it('returns the terminal blocked_by_challenge when all configured rungs fail', async () => { process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191'; - Network accessline 127
process.env.WIGOLO_SOLVER_URL = 'http://127.0.0.1:8191'; - Network accessline 134
escapeHatch, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 135
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect((result as { error?: string }).error).toBe('blocked_by_challenge'); - Network accessline 136
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 141
it('only the reader rung fires when just hostedReaderUrl is set', async () => { process.env.WIGOLO_HOSTED_READER_URL = 'https://reader.example.com'; - Network accessline 142
process.env.WIGOLO_HOSTED_READER_URL = 'https://reader.example.com'; - Network accessline 143
resetConfig(); hostedReaderFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); const router = new SmartRouter({ - Network accessline 144
hostedReaderFetch.mockResolvedValueOnce(clearedResult('https://blocked.example.com/x')); - Network accessline 149
escapeHatch, }); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); - Network accessline 150
}); const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' }); expect(result.html).toContain('cleared by escape hatch'); - Network accessline 151
const result = await router.fetch('https://blocked.example.com/x', { renderJs: 'always' });
tests/unit/fetch/router-mode.test.ts
- Executable scriptline 1
Executable file - Network accessline 68
it('does not spawn a browser even when content is a SPA shell', async () => { const result = await router.fetch('https://spa.test/page', { mode: 'cache' }); - Network accessline 69
const result = await router.fetch('https://spa.test/page', { mode: 'cache' }); - Network accessline 77
it('passes the fast timeout to the http client', async () => { await router.fetch('https://spa.test/page', { mode: 'cache' }); - Network accessline 78
await router.fetch('https://spa.test/page', { mode: 'cache' }); - Network accessline 80
expect(httpClient.fetch).toHaveBeenCalledWith( 'https://spa.test/page', - Network accessline 81
'https://spa.test/page', - Network accessline 99
await router.fetch('https://spa.test/page', { - Network accessline 123
const result = await router.fetch('https://example.com/page', { mode: 'cache' });
tests/unit/fetch/router-politeness.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
function okResult(url = 'https://example.com/page'): HttpResult { - Network accessline 44
function rateLimitResult(url = 'https://example.com/page', headers: Record<string, string> = {}): HttpResult { - Network accessline 55
function bare403Result(url = 'https://example.com/page'): HttpResult { - Network accessline 110
it('records a backoff ~now+30s from a Retry-After: 30 header', async () => { const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page', { 'retry-after': '30' })); - Network accessline 111
const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page', { 'retry-after': '30' })); - Network accessline 112
const { router, backoffs } = build({ httpFetch }); const before = Date.now(); await router.fetch('https://example.com/page'); - Network accessline 113
const before = Date.now(); await router.fetch('https://example.com/page'); expect(backoffs.recorded).toHaveLength(1); - Network accessline 114
await router.fetch('https://example.com/page'); - Network accessline 122
it('uses DEFAULT_BACKOFF_MS when the 429 carries no Retry-After', async () => { const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page')); - Network accessline 123
const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page')); - Network accessline 124
const { router, backoffs } = build({ httpFetch }); const before = Date.now(); await router.fetch('https://example.com/page'); - Network accessline 125
const before = Date.now(); await router.fetch('https://example.com/page'); expect(backoffs.recorded).toHaveLength(1); - Network accessline 126
await router.fetch('https://example.com/page'); - Network accessline 132
it('clamps an absurd Retry-After to MAX_BACKOFF_MS (300s)', async () => { const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page', { 'retry-after': '99999' })); - Network accessline 133
const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page', { 'retry-after': '99999' })); - Network accessline 134
const { router, backoffs } = build({ httpFetch }); const before = Date.now(); await router.fetch('https://example.com/page'); - Network accessline 135
const before = Date.now(); await router.fetch('https://example.com/page'); expect(backoffs.recorded).toHaveLength(1); - Network accessline 136
await router.fetch('https://example.com/page'); - Network accessline 142
it('still passes the 429 through to the caller (statusCode 429 preserved)', async () => { const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page', { 'retry-after': '30' })); - Network accessline 143
const httpFetch = vi.fn(async () => rateLimitResult('https://example.com/page', { 'retry-after': '30' })); const { router } = build({ httpFetch }); const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 144
const { router } = build({ httpFetch }); const res = await router.fetch('https://example.com/page') as RawFetchResult; expect(res.statusCode).toBe(429); - Network accessline 145
const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 157
const backoffs: Backoffs = { recorded: [], window: { 'example.com': Date.now() + 120_000 } }; const { router } = build({ httpFetch, backoffs }); const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 159
const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 168
const backoffs: Backoffs = { recorded: [], window: {} }; const { router } = build({ httpFetch, backoffs }); const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 169
const { router } = build({ httpFetch, backoffs }); const res = await router.fetch('https://example.com/page') as RawFetchResult; expect(httpFetch).toHaveBeenCalledTimes(1); - Network accessline 170
const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 177
const backoffs: Backoffs = { recorded: [], window: { 'example.com': Date.now() - 1000 } }; const { router } = build({ httpFetch, backoffs }); await router.fetch('https://example.com/page'); - Network accessline 178
const { router } = build({ httpFetch, backoffs }); await router.fetch('https://example.com/page'); expect(httpFetch).toHaveBeenCalledTimes(1); - Network accessline 179
await router.fetch('https://example.com/page'); - Network accessline 185
const backoffs: Backoffs = { recorded: [], window: { 'example.com': Date.now() + 120_000 } }; const { router } = build({ httpFetch, backoffs }); const res = await router.fetch('https://example.com/page', { mode: 'stealth' }) as RawF - Network accessline 186
const { router } = build({ httpFetch, backoffs }); const res = await router.fetch('https://example.com/page', { mode: 'stealth' }) as RawFetchResult; expect(httpFetch).not.toHaveBeenCalled(); - Network accessline 187
const res = await router.fetch('https://example.com/page', { mode: 'stealth' }) as RawFetchResult; - Network accessline 205
}); const { router, httpFetch: hf } = build({ httpFetch }); const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 206
const { router, httpFetch: hf } = build({ httpFetch }); const res = await router.fetch('https://example.com/page') as RawFetchResult; expect(hf).toHaveBeenCalledTimes(2); - Network accessline 207
const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 218
const httpFetch = vi.fn(async () => bare403Result()); const { router, backoffs } = build({ httpFetch }); await router.fetch('https://example.com/page'); - Network accessline 219
const { router, backoffs } = build({ httpFetch }); await router.fetch('https://example.com/page'); expect(backoffs.recorded).toHaveLength(0); - Network accessline 220
await router.fetch('https://example.com/page'); - Network accessline 228
const httpFetch = vi.fn(async () => bare403Result()); const { router, httpFetch: hf, browserPool } = build({ httpFetch }); const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 229
const { router, httpFetch: hf, browserPool } = build({ httpFetch }); const res = await router.fetch('https://example.com/page') as RawFetchResult; expect(hf).toHaveBeenCalledTimes(2); - Network accessline 230
const res = await router.fetch('https://example.com/page') as RawFetchResult; - Network accessline 242
})); const { router, httpFetch: hf, browserPool } = build({ httpFetch }); await router.fetch('https://example.com/page'); - Network accessline 243
const { router, httpFetch: hf, browserPool } = build({ httpFetch }); await router.fetch('https://example.com/page'); expect(hf).toHaveBeenCalledTimes(1); - Network accessline 244
await router.fetch('https://example.com/page'); - Network accessline 250
const httpFetch = vi.fn(async () => okResult()); const { router, httpFetch: hf } = build({ httpFetch }); await router.fetch('https://example.com/page'); - Network accessline 251
const { router, httpFetch: hf } = build({ httpFetch }); await router.fetch('https://example.com/page'); expect(hf).toHaveBeenCalledTimes(1); - Network accessline 252
await router.fetch('https://example.com/page');
tests/unit/fetch/router-reddit-api.test.ts
- Executable scriptline 1
Executable file - Network accessline 35
function httpResult(url = 'https://www.reddit.com/r/rust'): Awaited<ReturnType<HttpClient['fetch']>> { - Network accessline 46
const REDDIT_API_RESULT: RawFetchResult = { url: 'https://www.reddit.com/r/rust', - Network accessline 47
url: 'https://www.reddit.com/r/rust', - Network accessline 48
finalUrl: 'https://www.reddit.com/r/rust', - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 93
[Credential-related source omitted] - Network accessline 96
const result = await router.fetch('https://www.reddit.com/r/rust'); - Network accessline 106
const result = await router.fetch('https://www.reddit.com/r/rust'); - Access to secretsline 114
[Credential-related source omitted] - Network accessline 116
httpClient = { fetch: vi.fn(async () => ({ url: 'https://example.com', - Network accessline 117
fetch: vi.fn(async () => ({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 118
url: 'https://example.com', - Network accessline 119
finalUrl: 'https://example.com', - Network accessline 128
const result = await router.fetch('https://example.com'); - Access to secretsline 135
[Credential-related source omitted] - Network accessline 139
const result = await router.fetch('https://www.reddit.com/r/rust'); - Access to secretsline 147
[Credential-related source omitted] - Network accessline 151
const result = await router.fetch('https://www.reddit.com/r/rust'); - Access to secretsline 158
[Credential-related source omitted] - Network accessline 165
const result = await router.fetch('https://www.reddit.com/r/rust'); - Access to secretsline 173
[Credential-related source omitted] - Network accessline 176
await router.fetch('https://www.reddit.com/r/rust', { screenshot: true, renderJs: 'always' });
tests/unit/fetch/router-stealth.test.ts
- Executable scriptline 1
Executable file - Network accessline 138
}; const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://challenge.example/'); - Network accessline 139
const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://challenge.example/'); expect(browserCalls).toHaveLength(1); - Network accessline 140
await router.fetch('https://challenge.example/'); - Network accessline 148
}; const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://spa.example/'); - Network accessline 149
const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://spa.example/'); expect(browserCalls).toHaveLength(1); - Network accessline 150
await router.fetch('https://spa.example/'); - Network accessline 159
}; const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://blocked.example/'); - Network accessline 160
const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://blocked.example/'); expect(browserCalls).toHaveLength(1); - Network accessline 161
await router.fetch('https://blocked.example/'); - Network accessline 196
}; const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://blocked.example/'); - Network accessline 197
const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://blocked.example/'); expect(browserCalls[0].stealth).toBe(false); - Network accessline 198
await router.fetch('https://blocked.example/'); - Network accessline 207
}; const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://spa.example/'); - Network accessline 208
const router = new SmartRouter({ httpClient, browserPool: makeBrowserPool() }); await router.fetch('https://spa.example/'); expect(browserCalls[0].stealth).toBe(true); - Network accessline 209
await router.fetch('https://spa.example/');
tests/unit/fetch/router-tls.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
function makeHttpResult(opts: Partial<{ html: string; statusCode: number }> = {}): Awaited<ReturnType<HttpClient['fetch']>> { return { url: 'https://example.com/page', - Network accessline 34
return { url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 35
url: 'https://example.com/page', - Network accessline 36
finalUrl: 'https://example.com/page', - Network accessline 44
function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 56
function makeTlsResult(opts: Partial<{ html: string; statusCode: number; url: string }> = {}): TlsFetchResult { return { url: opts.url ?? 'https://example.com/page', - Network accessline 57
return { url: opts.url ?? 'https://example.com/page', finalUrl: opts.url ?? 'https://example.com/page', - Network accessline 58
url: opts.url ?? 'https://example.com/page', - Network accessline 59
finalUrl: opts.url ?? 'https://example.com/page', - Network accessline 119
const result = await router.fetch('https://blocked.com/page'); - Network accessline 131
const { router, httpClient, tlsFetcher, browserPool } = build(); const result = await router.fetch('https://example.com/page'); - Network accessline 132
const result = await router.fetch('https://example.com/page'); - Network accessline 146
const { router, httpClient, tlsFetcher, browserPool } = build(); const result = await router.fetch('https://example.com/page'); - Network accessline 147
const result = await router.fetch('https://example.com/page'); - Network accessline 159
const { router, httpClient, tlsFetcher, browserPool, recordedDomains } = build(); vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult({ statusCode: 403, html: 'forbidden' })); vi.mocked(tlsFetcher).mockResolvedValue(mak - Network accessline 161
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://blocked.com/page' })); - Network accessline 163
const result = await router.fetch('https://blocked.com/page'); - Network accessline 177
makeHttpResult({ statusCode: 200, html: '<html><body>cf-browser-verification</body></html>' }), ); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://cf.com/page' })); - Network accessline 179
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://cf.com/page' })); - Network accessline 181
const result = await router.fetch('https://cf.com/page'); - Network accessline 196
); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ statusCode: 403, html: 'still blocked' })); vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://hard.com/page')); - Network accessline 198
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://hard.com/page')); - Network accessline 200
const result = await router.fetch('https://hard.com/page'); - Network accessline 216
vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult({ statusCode: 403 })); vi.mocked(tlsFetcher).mockRejectedValue(new TlsTierUnavailableError(new Error('not installed'))); vi.mocked(browserPool.fetchWithBrowser).mockRe - Network accessline 218
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://hard.com/page')); - Network accessline 220
const result = await router.fetch('https://hard.com/page'); - Network accessline 230
vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult({ statusCode: 503 })); vi.mocked(tlsFetcher).mockRejectedValue(new Error('network unreachable')); vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowser - Network accessline 232
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://x.com/page')); - Network accessline 234
const result = await router.fetch('https://x.com/page'); - Network accessline 242
const { router, httpClient, tlsFetcher } = build({ preferTls: true }); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://promoted.com/page' })); - Network accessline 243
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://promoted.com/page' })); - Network accessline 245
const result = await router.fetch('https://promoted.com/page'); - Network accessline 259
const { router, httpClient, tlsFetcher, recordedDomains } = build(); vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://cold.com/page' })); - Network accessline 260
vi.mocked(tlsFetcher).mockResolvedValue(makeTlsResult({ url: 'https://cold.com/page' })); - Network accessline 262
const result = await router.fetch('https://cold.com/page'); - Network accessline 277
const result = await router.fetch('https://cold.com/page'); - Network accessline 292
const result = await router.fetch('https://x.com/page', { renderJs: 'never' });
tests/unit/fetch/router.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
function makeHttpResult(html = FULL_HTML): Awaited<ReturnType<HttpClient['fetch']>> { return { url: 'https://example.com/page', - Network accessline 43
return { url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 44
url: 'https://example.com/page', - Network accessline 45
finalUrl: 'https://example.com/page', - Network accessline 53
function makeBrowserResult(url = 'https://example.com/page'): RawFetchResult { - Network accessline 109
it('routes to HTTP by default for unknown domains', async () => { const result = await router.fetch('https://example.com/page'); - Network accessline 110
const result = await router.fetch('https://example.com/page'); - Network accessline 117
it('routes to Playwright when render_js is "always"', async () => { const result = await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 118
const result = await router.fetch('https://example.com/page', { renderJs: 'always' }); - Network accessline 125
it('routes to HTTP only when render_js is "never"', async () => { const result = await router.fetch('https://example.com/page', { renderJs: 'never' }); - Network accessline 126
const result = await router.fetch('https://example.com/page', { renderJs: 'never' }); - Network accessline 136
await expect(router.fetch('https://example.com/page', { renderJs: 'never' })).rejects.toThrow('Network error'); - Network accessline 146
for (let i = 0; i < threshold - 1; i++) { await expect(router.fetch(`https://failing.com/page${i}`)).rejects.toThrow(); - Network accessline 147
await expect(router.fetch(`https://failing.com/page${i}`)).rejects.toThrow(); - Network accessline 151
const result = await router.fetch('https://failing.com/final'); - Network accessline 159
const result = await router.fetch('https://spa.com/page'); - Network accessline 170
await router.fetch('https://spa-domain.com/page1'); - Network accessline 173
vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult(FULL_HTML)); vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://spa-domain.com/page2')); - Network accessline 174
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://spa-domain.com/page2')); - Network accessline 176
const result = await router.fetch('https://spa-domain.com/page2'); - Network accessline 186
const result = await router.fetch('https://example.com/page', { renderJs: 'auto' }); - Network accessline 193
it('routes auth requests to Playwright', async () => { const result = await router.fetch('https://example.com/protected', { useAuth: true }); - Network accessline 194
const result = await router.fetch('https://example.com/protected', { useAuth: true }); - Network accessline 218
const url = 'https://react.dev/whitepaper.pdf'; vi.mocked(httpClient.fetch).mockResolvedValue(makePdfHttpResult(url)); - Network accessline 221
const result = await router.fetch(url); - Network accessline 230
const url = 'https://example.com/report.pdf'; - Network accessline 232
const result = await router.fetch(url, { renderJs: 'always' }); - Network accessline 245
const url = 'https://arxiv-clone.test/pdf/1706.03762'; vi.mocked(httpClient.fetch).mockResolvedValue({ - Network accessline 256
const result = await router.fetch(url); - Network accessline 268
const url = 'https://files.test/download/doc-12345'; - Network accessline 279
const result = await router.fetch(url); - Network accessline 290
const url = 'https://react.dev/papers/whitepaper-2024'; - Network accessline 303
const result = await probingRouter.fetch(url); - Network accessline 315
const url = 'https://react.dev/learn'; - Network accessline 320
const result = await probingRouter.fetch(url); - Network accessline 327
it('records domain routing decisions', async () => { await router.fetch('https://stats.com/page'); - Network accessline 328
await router.fetch('https://stats.com/page'); - Network accessline 341
for (let i = 0; i < threshold - 1; i++) { await expect(router.fetch('https://fallback.com/pre')).rejects.toThrow(); - Network accessline 342
await expect(router.fetch('https://fallback.com/pre')).rejects.toThrow(); - Network accessline 345
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue(makeBrowserResult('https://fallback.com/final')); - Network accessline 348
const result = await router.fetch('https://fallback.com/final'); - Network accessline 350
expect(result.method).toBe('browser'); expect(result.url).toBe('https://fallback.com/final'); - Network accessline 351
expect(result.url).toBe('https://fallback.com/final'); - Network accessline 383
it('routes to Playwright when actions are present, even with renderJs=auto', async () => { const actions = [{ type: 'click' as const, selector: '.btn' }]; const result = await router.fetch('https://example.com/page', { actions }); - Network accessline 384
const actions = [{ type: 'click' as const, selector: '.btn' }]; const result = await router.fetch('https://example.com/page', { actions }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledOnce(); - Network accessline 385
const result = await router.fetch('https://example.com/page', { actions }); - Network accessline 391
it('routes to Playwright when actions are present, even with renderJs=never', async () => { const actions = [{ type: 'click' as const, selector: '.btn' }]; const result = await router.fetch('https://example.com/page', { renderJs: 'n - Network accessline 392
const actions = [{ type: 'click' as const, selector: '.btn' }]; const result = await router.fetch('https://example.com/page', { renderJs: 'never', actions }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledOnce(); - Network accessline 393
const result = await router.fetch('https://example.com/page', { renderJs: 'never', actions }); - Network accessline 399
it('does not force Playwright when actions array is empty', async () => { const result = await router.fetch('https://example.com/page', { actions: [] }); - Network accessline 400
const result = await router.fetch('https://example.com/page', { actions: [] }); - Network accessline 406
it('does not force Playwright when actions is undefined', async () => { const result = await router.fetch('https://example.com/page', { actions: undefined }); - Network accessline 407
const result = await router.fetch('https://example.com/page', { actions: undefined }); - Network accessline 415
{ type: 'click' as const, selector: '.btn' }, ]; await router.fetch('https://example.com/page', { actions }); - Network accessline 416
]; await router.fetch('https://example.com/page', { actions }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledWith( - Network accessline 417
await router.fetch('https://example.com/page', { actions }); - Network accessline 418
expect(browserPool.fetchWithBrowser).toHaveBeenCalledWith( 'https://example.com/page', expect.objectContaining({ actions }), - Network accessline 419
'https://example.com/page', - Network accessline 425
vi.mocked(getAuthOptions).mockResolvedValue({ storageStatePath: '/tmp/state.json' }); const actions = [{ type: 'click' as const, selector: '.btn' }]; const result = await router.fetch('https://example.com/page', { useAuth: true, act - Network accessline 426
const actions = [{ type: 'click' as const, selector: '.btn' }]; const result = await router.fetch('https://example.com/page', { useAuth: true, actions }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledOnce(); - Network accessline 427
const result = await router.fetch('https://example.com/page', { useAuth: true, actions }); - Network accessline 433
it('passes actions alongside screenshot option', async () => { const actions = [{ type: 'screenshot' as const }]; await router.fetch('https://example.com/page', { actions, screenshot: true }); - Network accessline 434
const actions = [{ type: 'screenshot' as const }]; await router.fetch('https://example.com/page', { actions, screenshot: true }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledWith( - Network accessline 435
await router.fetch('https://example.com/page', { actions, screenshot: true }); - Network accessline 436
expect(browserPool.fetchWithBrowser).toHaveBeenCalledWith( 'https://example.com/page', expect.objectContaining({ actions, screenshot: true }), - Network accessline 437
'https://example.com/page', - Network accessline 448
{ type: 'screenshot' as const }, ]; const result = await router.fetch('https://example.com/page', { actions }); - Network accessline 449
]; const result = await router.fetch('https://example.com/page', { actions }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledOnce(); - Network accessline 450
const result = await router.fetch('https://example.com/page', { actions }); - Network accessline 455
it('routes known-SPA domains straight to Playwright on first visit', async () => { vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue( makeBrowserResult('https://react.dev/learn'), - Network accessline 456
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue( makeBrowserResult('https://react.dev/learn'), ); - Network accessline 457
makeBrowserResult('https://react.dev/learn'), ); const result = await router.fetch('https://react.dev/learn'); - Network accessline 458
); const result = await router.fetch('https://react.dev/learn'); expect(httpClient.fetch).not.toHaveBeenCalled(); - Network accessline 459
const result = await router.fetch('https://react.dev/learn'); - Network accessline 465
it('routes SPA subdomains (docs.react.dev) the same way', async () => { vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue( makeBrowserResult('https://docs.react.dev/intro'), - Network accessline 466
vi.mocked(browserPool.fetchWithBrowser).mockResolvedValue( makeBrowserResult('https://docs.react.dev/intro'), ); - Network accessline 467
makeBrowserResult('https://docs.react.dev/intro'), ); const result = await router.fetch('https://docs.react.dev/intro'); - Network accessline 468
); const result = await router.fetch('https://docs.react.dev/intro'); expect(httpClient.fetch).not.toHaveBeenCalled(); - Network accessline 469
const result = await router.fetch('https://docs.react.dev/intro'); - Network accessline 474
it('does NOT pre-mark unrelated domains', async () => { vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult()); const result = await router.fetch('https://example.com/page'); - Network accessline 475
vi.mocked(httpClient.fetch).mockResolvedValue(makeHttpResult()); const result = await router.fetch('https://example.com/page'); expect(httpClient.fetch).toHaveBeenCalledOnce(); - Network accessline 476
const result = await router.fetch('https://example.com/page'); - Network accessline 486
const browserPool: BrowserPoolInterface = { fetchWithBrowser: vi.fn() }; const router = new SmartRouter(httpClient, browserPool); await router.fetch('https://example.com', { renderJs: 'never', signal: sig }); - Network accessline 487
const router = new SmartRouter(httpClient, browserPool); await router.fetch('https://example.com', { renderJs: 'never', signal: sig }); expect(httpClient.fetch).toHaveBeenCalledWith('https://example.com', expect.objectContaining({ s - Network accessline 488
await router.fetch('https://example.com', { renderJs: 'never', signal: sig }); - Network accessline 489
expect(httpClient.fetch).toHaveBeenCalledWith('https://example.com', expect.objectContaining({ signal: sig })); - Network accessline 495
const browserPool: BrowserPoolInterface = { fetchWithBrowser: vi.fn(async (url: string) => makeBrowserResult(url)) }; const router = new SmartRouter(httpClient, browserPool); await router.fetch('https://example.com', { renderJs: 'al - Network accessline 496
const router = new SmartRouter(httpClient, browserPool); await router.fetch('https://example.com', { renderJs: 'always', signal: sig }); expect(browserPool.fetchWithBrowser).toHaveBeenCalledWith('https://example.com', expect.objectC - Network accessline 497
await router.fetch('https://example.com', { renderJs: 'always', signal: sig }); - Network accessline 498
expect(browserPool.fetchWithBrowser).toHaveBeenCalledWith('https://example.com', expect.objectContaining({ signal: sig })); - Network accessline 514
const browserPool: BrowserPoolInterface = { fetchWithBrowser: vi.fn() }; const router = new SmartRouter({ httpClient, browserPool, tlsFetcher }); await router.fetch('https://example.com', { signal: sig }); - Network accessline 515
const router = new SmartRouter({ httpClient, browserPool, tlsFetcher }); await router.fetch('https://example.com', { signal: sig }); expect(tlsFetcher).toHaveBeenCalledWith('https://example.com', expect.objectContaining({ signal - Network accessline 516
await router.fetch('https://example.com', { signal: sig }); - Network accessline 517
expect(tlsFetcher).toHaveBeenCalledWith('https://example.com', expect.objectContaining({ signal: sig })); - Network accessline 546
throw new ChallengeBlockedError(url); }); const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); - Network accessline 547
}); const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); expect('error' in result).toBe(true); - Network accessline 548
const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); - Network accessline 565
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example/'); - Network accessline 566
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example/'); expect('error' in result).toBe(true); - Network accessline 567
const result = await router.fetch('https://blocked.example/'); - Network accessline 572
it('does NOT swallow non-challenge browser errors (they still throw)', async () => { const router = build(async () => { throw new Error('some other browser crash'); }); await expect(router.fetch('https://x.example/', { renderJs: 'al - Network accessline 573
const router = build(async () => { throw new Error('some other browser crash'); }); await expect(router.fetch('https://x.example/', { renderJs: 'always' })).rejects.toThrow('some other browser crash'); }); - Network accessline 574
await expect(router.fetch('https://x.example/', { renderJs: 'always' })).rejects.toThrow('some other browser crash'); - Network accessline 594
headers: { 'cf-mitigated': 'challenge' }, })); const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); - Network accessline 595
})); const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); expect('error' in result).toBe(true); - Network accessline 596
const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); - Network accessline 611
headers: { server: 'cloudflare' }, })); const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); - Network accessline 612
})); const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); expect('error' in result).toBe(false); - Network accessline 613
const result = await router.fetch('https://blocked.example/', { renderJs: 'always' }); - Network accessline 619
it('SUCCESS-RETURN GUARD: a normal 200 content result passes through unchanged', async () => { const router = build(async (url: string) => makeBrowserResult(url)); const result = await router.fetch('https://ok.example/', { renderJs: - Network accessline 620
const router = build(async (url: string) => makeBrowserResult(url)); const result = await router.fetch('https://ok.example/', { renderJs: 'always' }); expect('error' in result).toBe(false); - Network accessline 621
const result = await router.fetch('https://ok.example/', { renderJs: 'always' }); - Network accessline 658
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example/'); - Network accessline 660
const result = await router.fetch('https://blocked.example/'); - Network accessline 673
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example/'); - Network accessline 674
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example/'); expect('error' in result).toBe(true); - Network accessline 675
const result = await router.fetch('https://blocked.example/'); - Network accessline 686
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://blocked.example/', { renderJs: 'never' }); - Network accessline 688
const result = await router.fetch('https://blocked.example/', { renderJs: 'never' }); - Network accessline 704
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://news.example/article'); - Network accessline 705
const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://news.example/article'); expect(browserPool.fetchWithBrowser).not.toHaveBeenCalled(); - Network accessline 706
const result = await router.fetch('https://news.example/article'); - Network accessline 718
}; const router = new SmartRouter({ httpClient, browserPool, pdfProbe: async () => false }); const result = await router.fetch('https://spa.example/'); - Network accessline 720
const result = await router.fetch('https://spa.example/'); - Network accessline 760
browserAcquirer: unavailableAcquirer(), }); const result = await router.fetch('https://blocked.example/'); - Network accessline 762
const result = await router.fetch('https://blocked.example/'); - Network accessline 777
const httpClient: HttpClient = { fetch: vi.fn(async () => ({ url: 'https://blocked.example/', - Network accessline 778
fetch: vi.fn(async () => ({ url: 'https://blocked.example/', finalUrl: 'https://blocked.example/', - Network accessline 779
url: 'https://blocked.example/', - Network accessline 780
finalUrl: 'https://blocked.example/', - Network accessline 794
browserAcquirer: unavailableAcquirer(), }); const result = await router.fetch('https://blocked.example/'); - Network accessline 795
}); const result = await router.fetch('https://blocked.example/'); expect('error' in result).toBe(true); - Network accessline 796
const result = await router.fetch('https://blocked.example/'); - Network accessline 817
browserAcquirer: unavailableAcquirer(), }); const result = await router.fetch('https://spa.example/'); - Network accessline 818
}); const result = await router.fetch('https://spa.example/'); expect('error' in result).toBe(false); - Network accessline 819
const result = await router.fetch('https://spa.example/');
tests/unit/fetch/scraping-browser.test.ts
- Executable scriptline 1
Executable file - Network accessline 68
const { logger, lines } = makeCapturingLogger(); const out = await connectScrapingBrowser({ wss: 'http://user:pass@brd.superproxy.io:9222', - Network accessline 69
const out = await connectScrapingBrowser({ wss: 'http://user:pass@brd.superproxy.io:9222', connect, - Network accessline 70
wss: 'http://user:pass@brd.superproxy.io:9222',
tests/unit/fetch/settle.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/solve-ladder.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/stealth-driver-test-isolation.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/stealth-driver.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/stealth.test.ts
- Executable scriptline 1
Executable file
tests/unit/fetch/tls-tier.test.ts
- Executable scriptline 1
Executable file - Network accessline 534
const result = await tlsFetch('https://example.com/page'); - Network accessline 536
expect(result.html).toContain('hello from tls'); expect(result.contentType).toBe('text/html'); expect(calls).toEqual(['https://example.com/page']); - Network accessline 537
expect(result.contentType).toBe('text/html'); expect(calls).toEqual(['https://example.com/page']); }); - Network accessline 538
expect(calls).toEqual(['https://example.com/page']); - Network accessline 591
await tlsFetch('https://example.com/page', { signal: controller.signal, timeoutMs: 30000 }); - Network accessline 622
await tlsFetch('https://example.com/page', { signal: controller.signal, timeoutMs: 10 }); - Network accessline 639
await tlsFetch('https://example.com/page', { timeoutMs: 5000 }); - Network accessline 710
const result = await tlsFetch('https://stackoverflow.com/questions/1'); - Network accessline 734
const result = await tlsFetch('https://example.com/page'); - Network accessline 755
const result = await tlsFetch('https://stackoverflow.com/questions/2'); - Network accessline 786
await tlsFetch('https://stackoverflow.com/questions/3', { - Network accessline 850
const fetched: string[] = []; redirectingBackend( { 'https://public.example.net/start': 'http://169.254.169.254/latest/meta-data/' }, - Network accessline 851
redirectingBackend( { 'https://public.example.net/start': 'http://169.254.169.254/latest/meta-data/' }, fetched, - Network accessline 852
{ 'https://public.example.net/start': 'http://169.254.169.254/latest/meta-data/' }, - Network accessline 853
fetched, ); await expect(tlsFetch('https://public.example.net/start')).rejects.toThrow( - Network accessline 854
); await expect(tlsFetch('https://public.example.net/start')).rejects.toThrow( /blocked|metadata|link-local|private/i, - Network accessline 855
await expect(tlsFetch('https://public.example.net/start')).rejects.toThrow( - Network accessline 859
expect(fetched).not.toContain('http://169.254.169.254/latest/meta-data/'); - Network accessline 863
const fetched: string[] = []; redirectingBackend( { 'https://public.example.net/start': 'http://10.0.0.5/internal' }, - Network accessline 864
redirectingBackend( { 'https://public.example.net/start': 'http://10.0.0.5/internal' }, fetched, - Network accessline 865
{ 'https://public.example.net/start': 'http://10.0.0.5/internal' }, - Network accessline 866
fetched, ); await expect(tlsFetch('https://public.example.net/start')).rejects.toThrow( - Network accessline 867
); await expect(tlsFetch('https://public.example.net/start')).rejects.toThrow( /blocked|private|link-local|metadata/i, - Network accessline 868
await expect(tlsFetch('https://public.example.net/start')).rejects.toThrow( - Network accessline 869
/blocked|private|link-local|metadata/i, ); expect(fetched).not.toContain('http://10.0.0.5/internal'); - Network accessline 870
); expect(fetched).not.toContain('http://10.0.0.5/internal'); }); - Network accessline 871
expect(fetched).not.toContain('http://10.0.0.5/internal'); - Network accessline 875
const fetched: string[] = []; redirectingBackend( { 'https://public.example.net/start': 'https://public.example.org/final' }, - Network accessline 876
redirectingBackend( { 'https://public.example.net/start': 'https://public.example.org/final' }, fetched, - Network accessline 877
{ 'https://public.example.net/start': 'https://public.example.org/final' }, - Network accessline 878
fetched, ); const result = await tlsFetch('https://public.example.net/start'); - Network accessline 879
); const result = await tlsFetch('https://public.example.net/start'); expect(result.statusCode).toBe(200); - Network accessline 880
const result = await tlsFetch('https://public.example.net/start'); - Network accessline 882
expect(result.html).toContain('arrived at https://public.example.org/final'); - Network accessline 884
expect(fetched).toEqual([ 'https://public.example.net/start', - Network accessline 885
'https://public.example.net/start', - Network accessline 886
'https://public.example.org/final', - Network accessline 918
const seen: Record<string, Record<string, string> | undefined> = {}; headerRecordingBackend( { 'https://a.example.net/start': 'https://b.example.org/final' }, - Network accessline 919
headerRecordingBackend( { 'https://a.example.net/start': 'https://b.example.org/final' }, seen, - Network accessline 920
{ 'https://a.example.net/start': 'https://b.example.org/final' }, - Network accessline 921
seen, ); await tlsFetch('https://a.example.net/start', { headers: { Cookie: 'cf_clearance=SECRET' } }); - Network accessline 923
await tlsFetch('https://a.example.net/start', { headers: { Cookie: 'cf_clearance=SECRET' } }); - Network accessline 925
expect(seen['https://a.example.net/start']?.Cookie).toBe('cf_clearance=SECRET'); - Network accessline 927
const crossHeaders = seen['https://b.example.org/final'] ?? {}; - Network accessline 933
const seen: Record<string, Record<string, string> | undefined> = {}; headerRecordingBackend( { 'https://a.example.net/start': 'https://a.example.net/next' }, - Network accessline 934
headerRecordingBackend( { 'https://a.example.net/start': 'https://a.example.net/next' }, seen, - Network accessline 935
{ 'https://a.example.net/start': 'https://a.example.net/next' }, - Network accessline 936
seen, ); await tlsFetch('https://a.example.net/start', { headers: { Cookie: 'cf_clearance=SECRET' } }); - Network accessline 937
); await tlsFetch('https://a.example.net/start', { headers: { Cookie: 'cf_clearance=SECRET' } }); expect(seen['https://a.example.net/next']?.Cookie).toBe('cf_clearance=SECRET'); - Network accessline 938
await tlsFetch('https://a.example.net/start', { headers: { Cookie: 'cf_clearance=SECRET' } }); - Network accessline 939
expect(seen['https://a.example.net/next']?.Cookie).toBe('cf_clearance=SECRET'); - Network accessline 982
try { const result = await tlsFetch('https://example.com/stdio-test'); - Network accessline 983
const result = await tlsFetch('https://example.com/stdio-test'); - Dangerous shell operationline 1022
expect(validateTlsBrowser('; rm -rf /', 'chrome_142')).toBe('chrome_142'); - Network accessline 1100
try { await tlsFetch('https://example.com/', { timeoutMs: 5000 }); - Network accessline 1101
await tlsFetch('https://example.com/', { timeoutMs: 5000 });
tests/unit/help-overlay.test.tsx
- Executable scriptline 1
Executable file
tests/unit/helpers/wait-for.test.ts
- Executable scriptline 1
Executable file
tests/unit/init-flags.test.ts
- Executable scriptline 1
Executable file
tests/unit/instructions-v3.test.ts
tests/unit/instructions.test.ts
- Executable scriptline 1
Executable file
tests/unit/integrations/cloud/llm/text-adapters-vision.test.ts
- Executable scriptline 1
Executable file
tests/unit/integrations/custom-backend.test.ts
- Executable scriptline 1
Executable file - Network accessline 3
* `ollama` alias a first-class keyless backend. * * WHY: Ollama previously only worked via a raw WIGOLO_LLM_PROVIDER=http://... - Network accessline 4
* * WHY: Ollama previously only worked via a raw WIGOLO_LLM_PROVIDER=http://... * URL. Users expect a friendly `ollama` alias that auto-targets localhost:11434 - Network accessline 5
* WHY: Ollama previously only worked via a raw WIGOLO_LLM_PROVIDER=http://... - Network accessline 32
const result = resolveCustomBackend({ WIGOLO_LLM_PROVIDER: 'ollama', WIGOLO_LLM_BASE_URL: 'http://192.168.1.5:11434', - Network accessline 33
WIGOLO_LLM_PROVIDER: 'ollama', WIGOLO_LLM_BASE_URL: 'http://192.168.1.5:11434', }); - Network accessline 34
WIGOLO_LLM_BASE_URL: 'http://192.168.1.5:11434', - Network accessline 35
}); expect(result).toEqual({ url: 'http://192.168.1.5:11434', isOllama: true }); }); - Network accessline 36
expect(result).toEqual({ url: 'http://192.168.1.5:11434', isOllama: true }); - Network accessline 39
it('maps an http(s) URL to a custom backend with isOllama=false', () => { expect(resolveCustomBackend({ WIGOLO_LLM_PROVIDER: 'http://localhost:8000' })).toEqual({ - Network accessline 40
expect(resolveCustomBackend({ WIGOLO_LLM_PROVIDER: 'http://localhost:8000' })).toEqual({ - Network accessline 41
url: 'http://localhost:8000', - Network accessline 42
isOllama: false, }); expect(resolveCustomBackend({ WIGOLO_LLM_PROVIDER: 'https://proxy.example/v1' })).toEqual({ - Network accessline 43
}); expect(resolveCustomBackend({ WIGOLO_LLM_PROVIDER: 'https://proxy.example/v1' })).toEqual({ url: 'https://proxy.example/v1', - Network accessline 44
expect(resolveCustomBackend({ WIGOLO_LLM_PROVIDER: 'https://proxy.example/v1' })).toEqual({ - Network accessline 45
url: 'https://proxy.example/v1', - Network accessline 100
it('honors WIGOLO_LLM_BASE_URL env with config.json ollama', () => { writeConfig({ llmProvider: 'ollama' }); expect(resolveCustomBackend({ WIGOLO_LLM_BASE_URL: 'http://remote:11434' })).toEqual({ - Network accessline 101
writeConfig({ llmProvider: 'ollama' }); expect(resolveCustomBackend({ WIGOLO_LLM_BASE_URL: 'http://remote:11434' })).toEqual({ url: 'http://remote:11434', - Network accessline 102
expect(resolveCustomBackend({ WIGOLO_LLM_BASE_URL: 'http://remote:11434' })).toEqual({ - Network accessline 103
url: 'http://remote:11434', - Network accessline 108
it('honors persisted llmBaseUrl from config.json (zero-env runtime)', () => { writeConfig({ llmProvider: 'ollama', llmBaseUrl: 'http://configured:11434' }); - Network accessline 109
writeConfig({ llmProvider: 'ollama', llmBaseUrl: 'http://configured:11434' }); - Network accessline 110
expect(resolveCustomBackend({})).toEqual({ url: 'http://configured:11434', isOllama: true }); - Network accessline 113
it('env WIGOLO_LLM_BASE_URL wins over persisted llmBaseUrl', () => { writeConfig({ llmProvider: 'ollama', llmBaseUrl: 'http://configured:11434' }); - Network accessline 114
writeConfig({ llmProvider: 'ollama', llmBaseUrl: 'http://configured:11434' }); - Network accessline 115
expect(resolveCustomBackend({ WIGOLO_LLM_BASE_URL: 'http://env:11434' })).toEqual({ - Network accessline 116
url: 'http://env:11434',
tests/unit/integrations/llm-retry.test.ts
tests/unit/integrations/llm-runner.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Network accessline 108
it('isLlmConfigured returns true when WIGOLO_LLM_PROVIDER is URL', () => { process.env.WIGOLO_LLM_PROVIDER = 'http://localhost:11434'; - Network accessline 109
process.env.WIGOLO_LLM_PROVIDER = 'http://localhost:11434'; - Access to secretsline 130
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Network accessline 161
expect(calls.some((c) => c === 'http://localhost:11434/v1/chat/completions')).toBe(true); - Network accessline 162
expect(calls.some((c) => c === 'http://localhost:11434/api/tags')).toBe(true); - Network accessline 179
it('honors WIGOLO_LLM_BASE_URL for the endpoint and tags probe', async () => { process.env.WIGOLO_LLM_PROVIDER = 'ollama'; process.env.WIGOLO_LLM_BASE_URL = 'http://box:11434'; - Network accessline 180
process.env.WIGOLO_LLM_PROVIDER = 'ollama'; process.env.WIGOLO_LLM_BASE_URL = 'http://box:11434'; const calls: string[] = []; - Network accessline 181
process.env.WIGOLO_LLM_BASE_URL = 'http://box:11434'; const calls: string[] = []; globalThis.fetch = (async (url: string | URL) => { - Network accessline 192
const r = await runLlmText({ prompt: 'hi' }); expect(r.model).toBe('qwen2.5:7b'); expect(calls).toContain('http://box:11434/api/tags'); - Network accessline 193
expect(r.model).toBe('qwen2.5:7b'); expect(calls).toContain('http://box:11434/api/tags'); expect(calls).toContain('http://box:11434/v1/chat/completions'); - Network accessline 194
expect(calls).toContain('http://box:11434/api/tags'); - Network accessline 195
expect(calls).toContain('http://box:11434/v1/chat/completions'); - Access to secretsline 221
[Credential-related source omitted] - Access to secretsline 222
[Credential-related source omitted] - Access to secretsline 223
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Access to secretsline 232
[Credential-related source omitted]
tests/unit/integrations/llm-select-seam.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 2
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 68
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 96
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 170
[Credential-related source omitted] - Access to secretsline 171
[Credential-related source omitted]
tests/unit/integrations/local-tier.test.ts
- Executable scriptline 1
Executable file - Network accessline 66
expect(result).toEqual<LocalModelTier>({ available: true, endpoint: 'http://localhost:11434', - Network accessline 67
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', - Network accessline 68
endpoint: 'http://localhost:11434', - Network accessline 100
const pickModel = vi.fn(async () => 'llama3.1:8b'); const result = await resolveLocalModelTier({ localLlm: 'http://box:9999', - Network accessline 101
const result = await resolveLocalModelTier({ localLlm: 'http://box:9999', probe: okProbe, - Network accessline 102
localLlm: 'http://box:9999', - Network accessline 104
pickModel, }); expect(okProbe).toHaveBeenCalledWith('http://box:9999'); - Network accessline 105
}); expect(okProbe).toHaveBeenCalledWith('http://box:9999'); expect(result).toEqual<LocalModelTier>({ - Network accessline 106
expect(okProbe).toHaveBeenCalledWith('http://box:9999'); - Network accessline 107
expect(result).toEqual<LocalModelTier>({ available: true, endpoint: 'http://box:9999', - Network accessline 108
available: true, endpoint: 'http://box:9999', model: 'llama3.1:8b', - Network accessline 109
endpoint: 'http://box:9999', - Network accessline 130
it("prefers WIGOLO_LOCAL_LLM_BASE_URL for the auto endpoint", async () => { process.env.WIGOLO_LOCAL_LLM_BASE_URL = 'http://gpu-box:11434'; - Network accessline 131
process.env.WIGOLO_LOCAL_LLM_BASE_URL = 'http://gpu-box:11434'; - Network accessline 135
pickModel: async () => 'm', }); expect(result?.endpoint).toBe('http://gpu-box:11434'); - Network accessline 136
}); expect(result?.endpoint).toBe('http://gpu-box:11434'); }); - Network accessline 137
expect(result?.endpoint).toBe('http://gpu-box:11434'); - Network accessline 171
expect(pickModel).toHaveBeenCalledWith( 'http://localhost:11434', - Network accessline 172
'http://localhost:11434', - Access to secretsline 188
[Credential-related source omitted] - Access to secretsline 189
[Credential-related source omitted] - Access to secretsline 190
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Access to secretsline 192
[Credential-related source omitted] - Access to secretsline 193
[Credential-related source omitted]
tests/unit/logger-suppression.test.ts
- Executable scriptline 1
Executable file
tests/unit/logger.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
resetConfig(); const log = createLogger('fetch'); log.info('test message', { url: 'https://example.com' }); - Network accessline 22
log.info('test message', { url: 'https://example.com' }); - Network accessline 28
expect(parsed.msg).toBe('test message'); expect(parsed.module).toBe('fetch'); expect(parsed.data.url).toBe('https://example.com'); - Network accessline 29
expect(parsed.module).toBe('fetch'); expect(parsed.data.url).toBe('https://example.com'); expect(parsed.ts).toBeDefined(); - Network accessline 30
expect(parsed.data.url).toBe('https://example.com');
tests/unit/mcp-description-budget.test.ts
- Executable scriptline 1
Executable file
tests/unit/package-deps.test.ts
- Executable scriptline 1
Executable file
tests/unit/package-metadata.test.ts
- Executable scriptline 1
Executable file
tests/unit/persisted-config.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 57
[Credential-related source omitted] - Network accessline 104
it('never persists a remote rerank token', () => { const path = join(dir, 'config.json'); writePersistedConfig(path, { settings: { rerankApiBase: 'http://localhost:8082/v1', rerankApiKey: 'secret' } }); - Network accessline 105
const path = join(dir, 'config.json'); writePersistedConfig(path, { settings: { rerankApiBase: 'http://localhost:8082/v1', rerankApiKey: 'secret' } }); const raw = JSON.parse(readFileSync(path, 'utf-8')); - Network accessline 106
writePersistedConfig(path, { settings: { rerankApiBase: 'http://localhost:8082/v1', rerankApiKey: 'secret' } }); - Network accessline 107
const raw = JSON.parse(readFileSync(path, 'utf-8')); expect(raw.settings.rerankApiBase).toBe('http://localhost:8082/v1'); expect(raw.settings.rerankApiKey).toBeUndefined(); - Network accessline 108
expect(raw.settings.rerankApiBase).toBe('http://localhost:8082/v1');
tests/unit/plugins/example-search-engine.test.ts
- Executable scriptline 1
Executable file
tests/unit/plugins/loader.test.ts
- Executable scriptline 1
Executable file
tests/unit/plugins/registry.test.ts
- Executable scriptline 1
Executable file - Network accessline 26
search: async (_query: string) => [{ title: `${name} result`, url: `https://${name}.example/result`, - Network accessline 27
title: `${name} result`, url: `https://${name}.example/result`, snippet: `${name} snippet`, - Network accessline 28
url: `https://${name}.example/result`, - Network accessline 131
registry.registerExtractor(ext, 'plugin-a'); const registered = registry.getExtractors()[0]; expect(registered.canHandle('https://mysite.example/page')).toBe(true); - Network accessline 132
const registered = registry.getExtractors()[0]; expect(registered.canHandle('https://mysite.example/page')).toBe(true); expect(registered.canHandle('https://other.example/page')).toBe(false); - Network accessline 133
expect(registered.canHandle('https://mysite.example/page')).toBe(true); - Network accessline 134
expect(registered.canHandle('https://other.example/page')).toBe(false);
tests/unit/plugins/validate.test.ts
- Executable scriptline 1
Executable file
tests/unit/providers/embed-provider-factory.test.ts
- Executable scriptline 1
Executable file
tests/unit/providers/extract-provider-factory.test.ts
- Executable scriptline 1
Executable file
tests/unit/providers/idle-unload.test.ts
- Executable scriptline 1
Executable file
tests/unit/providers/provider-idle-unload.test.ts
- Executable scriptline 1
Executable file
tests/unit/providers/rerank-provider-factory.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
it('selects and memoizes remote without loading ONNX', async () => { process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; - Network accessline 41
process.env.WIGOLO_RERANKER = 'remote'; process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1'; resetConfig(); - Network accessline 42
process.env.WIGOLO_RERANK_API_BASE = 'http://127.0.0.1:8082/v1';
tests/unit/providers/search-provider-factory.test.ts
- Executable scriptline 1
Executable file
tests/unit/providers/vector-store-factory.test.ts
- Executable scriptline 1
Executable file
tests/unit/python-env-resolve.test.ts
- Executable scriptline 1
Executable file
tests/unit/python-env-venv.test.ts
tests/unit/python-env.test.ts
- Executable scriptline 1
Executable file
tests/unit/repl/commands/agent.test.ts
- Executable scriptline 1
Executable file - Network accessline 54
command: 'agent', positional: ['prompt'], flags: { urls: 'https://a.com,https://b.com', 'max-pages': '5', 'max-time': '30000' }, - Network accessline 55
positional: ['prompt'], flags: { urls: 'https://a.com,https://b.com', 'max-pages': '5', 'max-time': '30000' }, }, - Network accessline 56
flags: { urls: 'https://a.com,https://b.com', 'max-pages': '5', 'max-time': '30000' }, - Network accessline 60
expect(handleAgent).toHaveBeenCalledWith( expect.objectContaining({ urls: ['https://a.com', 'https://b.com'], - Network accessline 61
expect.objectContaining({ urls: ['https://a.com', 'https://b.com'], max_pages: 5, - Network accessline 62
urls: ['https://a.com', 'https://b.com'],
tests/unit/repl/commands/cache.test.ts
- Executable scriptline 1
Executable file
tests/unit/repl/commands/crawl.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
const baseOutput: CrawlOutput = { pages: [{ url: 'https://ex.com', title: 'T', markdown: 'md', depth: 0 }], - Network accessline 20
pages: [{ url: 'https://ex.com', title: 'T', markdown: 'md', depth: 0 }], - Network accessline 25
it('passes url from positional args', async () => { vi.mocked(handleCrawl).mockResolvedValue(baseOutput); const result = await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 26
vi.mocked(handleCrawl).mockResolvedValue(baseOutput); const result = await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: {} }, deps); expect(handleCrawl).toHaveBeenCalledWith( - Network accessline 27
const result = await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 28
expect(handleCrawl).toHaveBeenCalledWith( expect.objectContaining({ url: 'https://ex.com' }), mockRouter, - Network accessline 29
expect.objectContaining({ url: 'https://ex.com' }), - Network accessline 35
it('maps --depth to max_depth', async () => { vi.mocked(handleCrawl).mockResolvedValue(baseOutput); await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { depth: '3' } }, deps); - Network accessline 36
vi.mocked(handleCrawl).mockResolvedValue(baseOutput); await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { depth: '3' } }, deps); expect(handleCrawl).toHaveBeenCalledWith( - Network accessline 37
await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { depth: '3' } }, deps); - Network accessline 44
it('maps --max-pages to max_pages', async () => { vi.mocked(handleCrawl).mockResolvedValue(baseOutput); await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { 'max-pages': '20' } }, deps); - Network accessline 45
vi.mocked(handleCrawl).mockResolvedValue(baseOutput); await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { 'max-pages': '20' } }, deps); expect(handleCrawl).toHaveBeenCalledWith( - Network accessline 46
await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { 'max-pages': '20' } }, deps); - Network accessline 53
it('maps --strategy flag', async () => { vi.mocked(handleCrawl).mockResolvedValue(baseOutput); await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { strategy: 'sitemap' } }, deps); - Network accessline 54
vi.mocked(handleCrawl).mockResolvedValue(baseOutput); await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { strategy: 'sitemap' } }, deps); expect(handleCrawl).toHaveBeenCalledWith( - Network accessline 55
await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: { strategy: 'sitemap' } }, deps); - Network accessline 67
it('handles handler exceptions', async () => { vi.mocked(handleCrawl).mockRejectedValue(new Error('robots.txt denied')); const result = await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 68
vi.mocked(handleCrawl).mockRejectedValue(new Error('robots.txt denied')); const result = await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: {} }, deps); expect(result.error).toContain('robots.txt'); - Network accessline 69
const result = await executeCrawl({ command: 'crawl', positional: ['https://ex.com'], flags: {} }, deps);
tests/unit/repl/commands/diff.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
ok: true, data: { url: 'https://example.com', - Network accessline 41
data: { url: 'https://example.com', title: 'Example', - Network accessline 42
url: 'https://example.com', - Network accessline 54
const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 55
{ command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 59
expect(handleFetch).toHaveBeenCalledWith( expect.objectContaining({ url: 'https://example.com' }), - Network accessline 60
expect.objectContaining({ url: 'https://example.com' }), - Network accessline 63
expect(handleDiff).toHaveBeenCalledWith( expect.objectContaining({ old: { url: 'https://example.com' }, - Network accessline 64
expect.objectContaining({ old: { url: 'https://example.com' }, new: { markdown: 'live body' }, - Network accessline 65
old: { url: 'https://example.com' }, - Network accessline 74
ok: true, data: { url: 'https://example.com', title: '', markdown: 'x', metadata: {}, - Network accessline 75
data: { url: 'https://example.com', title: '', markdown: 'x', metadata: {}, links: [], images: [], cached: false, - Network accessline 76
url: 'https://example.com', title: '', markdown: 'x', metadata: {}, - Network accessline 82
await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: { output: 'summary', granularity: 'word' } }, - Network accessline 83
{ command: 'diff', positional: ['https://example.com'], flags: { output: 'summary', granularity: 'word' } }, - Network accessline 110
}); const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 111
const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, deps(), - Network accessline 112
{ command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 121
ok: true, data: { url: 'https://example.com', title: '', markdown: 'x', metadata: {}, - Network accessline 122
data: { url: 'https://example.com', title: '', markdown: 'x', metadata: {}, links: [], images: [], cached: false, - Network accessline 123
url: 'https://example.com', title: '', markdown: 'x', metadata: {}, - Network accessline 129
}); const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 130
const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, deps(), - Network accessline 131
{ command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 138
vi.mocked(handleFetch).mockRejectedValue(new Error('boom')); const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, - Network accessline 139
const result = await executeDiff( { command: 'diff', positional: ['https://example.com'], flags: {} }, deps(), - Network accessline 140
{ command: 'diff', positional: ['https://example.com'], flags: {} },
tests/unit/repl/commands/extract.test.ts
- Executable scriptline 1
Executable file - Network accessline 24
it('passes url from positional args', async () => { vi.mocked(handleExtract).mockResolvedValue({ ok: true, data: baseOutput }); const result = await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: {} }, d - Network accessline 25
vi.mocked(handleExtract).mockResolvedValue({ ok: true, data: baseOutput }); const result = await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: {} }, deps); expect(handleExtract).toHaveBeenCalledWith( - Network accessline 26
const result = await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 27
expect(handleExtract).toHaveBeenCalledWith( expect.objectContaining({ url: 'https://ex.com' }), mockRouter, - Network accessline 28
expect.objectContaining({ url: 'https://ex.com' }), - Network accessline 34
it('maps --mode flag', async () => { vi.mocked(handleExtract).mockResolvedValue({ ok: true, data: baseOutput }); await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: { mode: 'tables' } }, deps); - Network accessline 35
vi.mocked(handleExtract).mockResolvedValue({ ok: true, data: baseOutput }); await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: { mode: 'tables' } }, deps); expect(handleExtract).toHaveBeenCalledWith( - Network accessline 36
await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: { mode: 'tables' } }, deps); - Network accessline 43
it('maps --selector flag to css_selector', async () => { vi.mocked(handleExtract).mockResolvedValue({ ok: true, data: baseOutput }); await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: { mode: 'selector - Network accessline 44
vi.mocked(handleExtract).mockResolvedValue({ ok: true, data: baseOutput }); await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: { mode: 'selector', selector: '.content' } }, deps); expect(handleExtract) - Network accessline 45
await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: { mode: 'selector', selector: '.content' } }, deps); - Network accessline 57
it('handles handler exceptions', async () => { vi.mocked(handleExtract).mockRejectedValue(new Error('invalid selector')); const result = await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 58
vi.mocked(handleExtract).mockRejectedValue(new Error('invalid selector')); const result = await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: {} }, deps); expect(result.error).toContain('invalid selecto - Network accessline 59
const result = await executeExtract({ command: 'extract', positional: ['https://ex.com'], flags: {} }, deps);
tests/unit/repl/commands/fetch.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
const baseOutput: FetchOutput = { url: 'https://example.com', - Network accessline 20
url: 'https://example.com', - Network accessline 29
it('passes url from positional args', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); const result = await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: {} }, de - Network accessline 30
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); const result = await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: {} }, deps); expect(handleFetch).toHaveBeenCalledWith( - Network accessline 31
const result = await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: {} }, deps); - Network accessline 32
expect(handleFetch).toHaveBeenCalledWith( expect.objectContaining({ url: 'https://example.com' }), mockRouter, - Network accessline 33
expect.objectContaining({ url: 'https://example.com' }), - Network accessline 39
it('maps --mode=raw to render_js=never', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'raw' } }, d - Network accessline 40
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'raw' } }, deps); expect(handleFetch).toHaveBeenCalledWith( - Network accessline 41
await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'raw' } }, deps); - Network accessline 48
it('maps --mode=markdown to render_js=auto', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'markdow - Network accessline 49
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'markdown' } }, deps); expect(handleFetch).toHaveBeenCalledWith( - Network accessline 50
await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'markdown' } }, deps); - Network accessline 57
it('maps --mode=stealth to the schema mode property (not render_js)', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'] - Network accessline 58
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'stealth' } }, deps); expect(handleFetch).toHaveBeenCalledWith( - Network accessline 59
await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'stealth' } }, deps); - Network accessline 68
it('maps --mode=cache and --mode=default to the schema mode property', async () => { vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com' - Network accessline 69
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'cache' } }, deps); expect(vi.mocked(handleFetch).mock.calls[0][0]. - Network accessline 70
await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'cache' } }, deps); - Network accessline 72
vi.clearAllMocks(); vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'default' } }, deps); - Network accessline 73
vi.mocked(handleFetch).mockResolvedValue({ ok: true, data: baseOutput }); await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'default' } }, deps); expect(vi.mocked(handleFetch).mock.calls[0][0 - Network accessline 74
await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'default' } }, deps); - Network accessline 81
const result = await executeFetch({ command: 'fetch', positional: ['https://example.com'], flags: { mode: 'bogus' } }, deps); - Network accessline 94
it('handles handler exceptions', async () => { vi.mocked(handleFetch).mockRejectedValue(new Error('timeout')); const result = await executeFetch({ command: 'fetch', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 95
vi.mocked(handleFetch).mockRejectedValue(new Error('timeout')); const result = await executeFetch({ command: 'fetch', positional: ['https://ex.com'], flags: {} }, deps); expect(result.error).toContain('timeout'); - Network accessline 96
const result = await executeFetch({ command: 'fetch', positional: ['https://ex.com'], flags: {} }, deps); - Network accessline 111
solve_method: null, } as any); const result = await executeFetch({ command: 'fetch', positional: ['https://blocked.example'], flags: {} }, deps); - Network accessline 112
} as any); const result = await executeFetch({ command: 'fetch', positional: ['https://blocked.example'], flags: {} }, deps); expect(result.error).toContain('bot protection'); - Network accessline 113
const result = await executeFetch({ command: 'fetch', positional: ['https://blocked.example'], flags: {} }, deps);
tests/unit/repl/commands/find-similar.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
vi.mocked(handleFindSimilar).mockResolvedValue({ ok: true, data: okOutput }); const result = await executeFindSimilar( { command: 'find-similar', positional: ['https://example.com'], flags: {} }, - Network accessline 40
const result = await executeFindSimilar( { command: 'find-similar', positional: ['https://example.com'], flags: {} }, deps(), - Network accessline 41
{ command: 'find-similar', positional: ['https://example.com'], flags: {} }, - Network accessline 43
); expect(handleFindSimilar).toHaveBeenCalledWith( expect.objectContaining({ url: 'https://example.com' }), - Network accessline 44
expect(handleFindSimilar).toHaveBeenCalledWith( expect.objectContaining({ url: 'https://example.com' }), expect.anything(), expect.anything(), expect.anything(), - Network accessline 45
expect.objectContaining({ url: 'https://example.com' }), - Network accessline 66
{ command: 'find-similar', positional: ['https://example.com'], - Network accessline 67
command: 'find-similar', positional: ['https://example.com'], flags: { limit: '7', domains: 'a.com,b.com', 'no-cache': 'true', 'no-web': 'true' }, - Network accessline 68
positional: ['https://example.com'], - Network accessline 87
}); const result = await executeFindSimilar( { command: 'find-similar', positional: ['https://example.com'], flags: {} }, - Network accessline 88
const result = await executeFindSimilar( { command: 'find-similar', positional: ['https://example.com'], flags: {} }, deps(), - Network accessline 89
{ command: 'find-similar', positional: ['https://example.com'], flags: {} }, - Network accessline 96
vi.mocked(handleFindSimilar).mockRejectedValue(new Error('kaboom')); const result = await executeFindSimilar( { command: 'find-similar', positional: ['https://example.com'], flags: {} }, - Network accessline 97
const result = await executeFindSimilar( { command: 'find-similar', positional: ['https://example.com'], flags: {} }, deps(), - Network accessline 98
{ command: 'find-similar', positional: ['https://example.com'], flags: {} },
tests/unit/repl/commands/research.test.ts
- Executable scriptline 1
Executable file
tests/unit/repl/commands/search.test.ts
tests/unit/repl/commands/watch.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
const job: WatchJob = { id: 'job-1', url: 'https://example.com', - Network accessline 21
id: 'job-1', url: 'https://example.com', interval_seconds: 120, - Network accessline 22
url: 'https://example.com', - Network accessline 35
vi.mocked(handleWatch).mockResolvedValue({ ok: true, data: { job, jobs: [job] } }); const result = await executeWatch( { command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '120' } }, - Network accessline 36
const result = await executeWatch( { command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '120' } }, deps(), - Network accessline 37
{ command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '120' } }, - Network accessline 39
); expect(handleWatch).toHaveBeenCalledWith( expect.objectContaining({ action: 'create', url: 'https://example.com', interval_seconds: 120 }), - Network accessline 40
expect(handleWatch).toHaveBeenCalledWith( expect.objectContaining({ action: 'create', url: 'https://example.com', interval_seconds: 120 }), expect.anything(), - Network accessline 41
expect.objectContaining({ action: 'create', url: 'https://example.com', interval_seconds: 120 }), - Network accessline 48
vi.mocked(handleWatch).mockResolvedValue({ ok: true, data: { job, jobs: [job] } }); const result = await executeWatch( { command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '120' } }, - Network accessline 49
const result = await executeWatch( { command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '120' } }, deps(), - Network accessline 50
{ command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '120' } }, - Dangerous shell operationline 71
it('maps "rm <job_id>" to action=delete (with caveat)', async () => { - Network accessline 121
}); const result = await executeWatch( { command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '5' } }, - Network accessline 122
const result = await executeWatch( { command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '5' } }, deps(), - Network accessline 123
{ command: 'watch', positional: ['add', 'https://example.com'], flags: { interval: '5' } },
tests/unit/repl/completer.test.ts
tests/unit/repl/formatters.test.ts
- Executable scriptline 1
Executable file - Network accessline 34
const searchOutput: SearchOutput = { results: [ { title: 'React Server Components', url: 'https://react.dev', snippet: 'React Server Components are a new kind of Component...', relevance_score: 0.95 }, - Network accessline 35
results: [ { title: 'React Server Components', url: 'https://react.dev', snippet: 'React Server Components are a new kind of Component...', relevance_score: 0.95 }, { title: 'Understanding RSC', url: 'https://vercel.com', snippe - Network accessline 36
{ title: 'React Server Components', url: 'https://react.dev', snippet: 'React Server Components are a new kind of Component...', relevance_score: 0.95 }, - Network accessline 37
{ title: 'Understanding RSC', url: 'https://vercel.com', snippet: 'RSC enables a new mental model...', relevance_score: 0.88 }, - Network accessline 38
{ title: 'Server Components Deep Dive', url: 'https://blog.example.com', snippet: 'A deep dive into the internals of RSC...', relevance_score: 0.75 }, - Network accessline 82
const longSnippet: SearchOutput = { results: [ { title: 'Long', url: 'https://example.com', snippet: 'a'.repeat(500), relevance_score: 1 }, - Network accessline 83
results: [ { title: 'Long', url: 'https://example.com', snippet: 'a'.repeat(500), relevance_score: 1 }, ], - Network accessline 84
{ title: 'Long', url: 'https://example.com', snippet: 'a'.repeat(500), relevance_score: 1 }, - Network accessline 95
describe('formatFetchResult', () => { const fetchOutput: FetchOutput = { url: 'https://react.dev/reference/rsc/server-components', - Network accessline 96
const fetchOutput: FetchOutput = { url: 'https://react.dev/reference/rsc/server-components', title: 'Server Components', - Network accessline 97
url: 'https://react.dev/reference/rsc/server-components', - Network accessline 119
it('shows error when present', () => { const errorOutput: FetchOutput = { url: 'https://fail.com', - Network accessline 120
const errorOutput: FetchOutput = { url: 'https://fail.com', title: '', - Network accessline 121
url: 'https://fail.com', - Network accessline 142
const crawlOutput: CrawlOutput = { pages: [ { url: 'https://docs.example.com/docs/intro', title: 'Introduction', markdown: 'a'.repeat(1204), depth: 0 }, - Network accessline 143
pages: [ { url: 'https://docs.example.com/docs/intro', title: 'Introduction', markdown: 'a'.repeat(1204), depth: 0 }, { url: 'https://docs.example.com/docs/quickstart', title: 'Quickstart', markdown: 'b'.repeat(893), depth: 1 }, - Network accessline 144
{ url: 'https://docs.example.com/docs/intro', title: 'Introduction', markdown: 'a'.repeat(1204), depth: 0 }, - Network accessline 145
{ url: 'https://docs.example.com/docs/quickstart', title: 'Quickstart', markdown: 'b'.repeat(893), depth: 1 }, - Network accessline 146
{ url: 'https://docs.example.com/docs/api', title: 'API Reference', markdown: 'c'.repeat(2105), depth: 1 }, - Network accessline 152
it('produces output matching golden file (stripped)', () => { const formatted = formatCrawlResult(crawlOutput, 'https://docs.example.com'); - Network accessline 153
const formatted = formatCrawlResult(crawlOutput, 'https://docs.example.com'); - Network accessline 159
it('handles empty pages', () => { const emptyOutput: CrawlOutput = { pages: [], total_found: 0, crawled: 0 }; const formatted = stripAnsi(formatCrawlResult(emptyOutput, 'https://empty.com')); - Network accessline 160
const emptyOutput: CrawlOutput = { pages: [], total_found: 0, crawled: 0 }; const formatted = stripAnsi(formatCrawlResult(emptyOutput, 'https://empty.com')); expect(formatted).toContain('0 pages'); - Network accessline 161
const formatted = stripAnsi(formatCrawlResult(emptyOutput, 'https://empty.com')); - Network accessline 165
it('handles crawl error', () => { const errorOutput: CrawlOutput = { pages: [], total_found: 0, crawled: 0, error: 'Timeout' }; const formatted = stripAnsi(formatCrawlResult(errorOutput, 'https://fail.com')); - Network accessline 166
const errorOutput: CrawlOutput = { pages: [], total_found: 0, crawled: 0, error: 'Timeout' }; const formatted = stripAnsi(formatCrawlResult(errorOutput, 'https://fail.com')); expect(formatted).toContain('Timeout'); - Network accessline 167
const formatted = stripAnsi(formatCrawlResult(errorOutput, 'https://fail.com')); - Network accessline 178
]}, ], source_url: 'https://example.com/pricing', - Network accessline 179
], source_url: 'https://example.com/pricing', mode: 'tables', - Network accessline 180
source_url: 'https://example.com/pricing', - Network accessline 244
const searchOutput: CacheOutput = { results: [ { url: 'https://react.dev/hooks', title: 'React Hooks', markdown: 'content...', fetched_at: '2024-03-20T14:22:00Z' }, - Network accessline 245
results: [ { url: 'https://react.dev/hooks', title: 'React Hooks', markdown: 'content...', fetched_at: '2024-03-20T14:22:00Z' }, ], - Network accessline 246
{ url: 'https://react.dev/hooks', title: 'React Hooks', markdown: 'content...', fetched_at: '2024-03-20T14:22:00Z' }, - Network accessline 248
}; const formatted = stripAnsi(formatCacheResult(searchOutput)); expect(formatted).toContain('https://react.dev/hooks'); - Network accessline 249
const formatted = stripAnsi(formatCacheResult(searchOutput)); expect(formatted).toContain('https://react.dev/hooks'); expect(formatted).toContain('React Hooks'); - Network accessline 250
expect(formatted).toContain('https://react.dev/hooks'); - Network accessline 275
it('formats map output with URL list', () => { const output: MapOutput = { urls: ['https://example.com/', 'https://example.com/about', 'https://example.com/docs'], - Network accessline 276
const output: MapOutput = { urls: ['https://example.com/', 'https://example.com/about', 'https://example.com/docs'], total_found: 3, - Network accessline 277
urls: ['https://example.com/', 'https://example.com/about', 'https://example.com/docs'], - Network accessline 279
sitemap_found: true, }; const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); - Network accessline 280
}; const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); expect(formatted).toContain('Map:'); - Network accessline 281
const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); - Network accessline 293
sitemap_found: false, }; const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); - Network accessline 294
}; const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); expect(formatted).toContain('No URLs found'); - Network accessline 295
const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); - Network accessline 304
error: 'timeout', }; const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); - Network accessline 305
}; const formatted = stripAnsi(formatMapResult(output, 'https://example.com')); expect(formatted).toContain('timeout'); - Network accessline 306
const formatted = stripAnsi(formatMapResult(output, 'https://example.com'));
tests/unit/repl/parser.test.ts
- Executable scriptline 1
Executable file - Network accessline 59
it('handles negative numbers', () => { expect(tokenize('fetch http://example.com --max-chars -1')).toEqual([ - Network accessline 60
expect(tokenize('fetch http://example.com --max-chars -1')).toEqual([ - Network accessline 61
'fetch', 'http://example.com', '--max-chars', '-1', - Network accessline 65
it('preserves URLs with special characters', () => { expect(tokenize('fetch https://example.com/path?q=hello&p=1')).toEqual([ - Network accessline 66
expect(tokenize('fetch https://example.com/path?q=hello&p=1')).toEqual([ - Network accessline 67
'fetch', 'https://example.com/path?q=hello&p=1', - Network accessline 85
it('handles --key value (space-separated) flags', () => { const result = parseArgs(['crawl', 'https://ex.com', '--depth', '3', '--max-pages', '10']); - Network accessline 86
const result = parseArgs(['crawl', 'https://ex.com', '--depth', '3', '--max-pages', '10']); - Network accessline 87
expect(result.command).toBe('crawl'); expect(result.positional).toEqual(['https://ex.com']); expect(result.flags.depth).toBe('3'); - Network accessline 88
expect(result.positional).toEqual(['https://ex.com']); - Network accessline 98
it('handles boolean flags (no value)', () => { const result = parseArgs(['fetch', 'https://ex.com', '--json']); - Network accessline 99
const result = parseArgs(['fetch', 'https://ex.com', '--json']);
tests/unit/repl/shell-history-mode.test.ts
- Executable scriptline 1
Executable file
tests/unit/repl/shell.test.ts
- Executable scriptline 1
Executable file - Network accessline 57
const parsed = parseCommandLine('fetch --screenshot https://example.invalid'); - Network accessline 58
expect(parsed.command).toBe('fetch'); expect(parsed.positional).toEqual(['https://example.invalid']); expect(parsed.flags.screenshot).toBe('true'); - Network accessline 59
expect(parsed.positional).toEqual(['https://example.invalid']); - Network accessline 74
const parsed = parseCommandLine('fetch --json https://example.invalid'); - Network accessline 75
expect(parsed.command).toBe('fetch'); expect(parsed.positional).toEqual(['https://example.invalid']); expect(parsed.flags.json).toBe('true'); - Network accessline 76
expect(parsed.positional).toEqual(['https://example.invalid']); - Network accessline 80
it('still honours a trailing --json after the positional', () => { const parsed = parseCommandLine('fetch https://example.invalid --json'); - Network accessline 81
const parsed = parseCommandLine('fetch https://example.invalid --json'); - Network accessline 82
expect(parsed.positional).toEqual(['https://example.invalid']); - Network accessline 112
await startShell(fakeDeps, { jsonMode: false, input: scriptedInput(['fetch --json https://example.invalid', 'exit']), - Network accessline 113
jsonMode: false, input: scriptedInput(['fetch --json https://example.invalid', 'exit']), output: out.stream, - Network accessline 114
input: scriptedInput(['fetch --json https://example.invalid', 'exit']), - Network accessline 121
const args = captured.fetchArgs as { positional: string[]; flags: Record<string, string> }; expect(args.positional).toEqual(['https://example.invalid']); - Network accessline 122
expect(args.positional).toEqual(['https://example.invalid']); - Network accessline 123
expect(args.flags.json).not.toBe('https://example.invalid');
tests/unit/research/branch-exploration.test.ts
- Executable scriptline 1
Executable file
tests/unit/research/brief.test.ts
- Executable scriptline 1
Executable file - Network accessline 17
function mkSource(overrides: Partial<ResearchSource> = {}): ResearchSource { return { url: 'https://example.com/1', - Network accessline 18
return { url: 'https://example.com/1', title: 'Example Source One', - Network accessline 19
url: 'https://example.com/1', - Network accessline 56
const brief = await buildResearchBrief('server components', sources, ['q'], 3000, 40000); expect(brief.highlights.length).toBeGreaterThan(0); expect(brief.highlights[0].source_url).toBe('https://example.com/1'); - Network accessline 57
expect(brief.highlights.length).toBeGreaterThan(0); expect(brief.highlights[0].source_url).toBe('https://example.com/1'); expect(brief.highlights[0].text).toContain('server components'); - Network accessline 58
expect(brief.highlights[0].source_url).toBe('https://example.com/1'); - Network accessline 62
it('returns key_findings ordered by relevance_score', async () => { const sources = [ mkSource({ url: 'https://a.com', relevance_score: 0.5, markdown_content: 'x'.repeat(100) + ' short one about topic A with enough length to survi - Network accessline 63
const sources = [ mkSource({ url: 'https://a.com', relevance_score: 0.5, markdown_content: 'x'.repeat(100) + ' short one about topic A with enough length to survive the filter for key findings.' }), mkSource({ url: 'https://b.co - Network accessline 64
mkSource({ url: 'https://a.com', relevance_score: 0.5, markdown_content: 'x'.repeat(100) + ' short one about topic A with enough length to survive the filter for key findings.' }), - Network accessline 65
mkSource({ url: 'https://b.com', relevance_score: 0.95, markdown_content: 'High relevance paragraph about topic B that is clearly substantive and worthy of inclusion in the findings list produced by the brief builder.' }), - Network accessline 79
const sources = [ mkSource({ url: 'https://good.com', - Network accessline 80
mkSource({ url: 'https://good.com', relevance_score: 4.2, - Network accessline 81
url: 'https://good.com', - Network accessline 84
}), mkSource({ url: 'https://junk.com', - Network accessline 85
mkSource({ url: 'https://junk.com', relevance_score: -11, - Network accessline 86
url: 'https://junk.com', - Network accessline 97
it('still produces entries for positive-score sources (no regression)', async () => { const sources = [ mkSource({ url: 'https://a.com', relevance_score: 2.1, markdown_content: 'First substantive on-topic paragraph long enough to - Network accessline 98
const sources = [ mkSource({ url: 'https://a.com', relevance_score: 2.1, markdown_content: 'First substantive on-topic paragraph long enough to become a key finding entry in the returned array.' }), mkSource({ url: 'https://b.co - Network accessline 99
mkSource({ url: 'https://a.com', relevance_score: 2.1, markdown_content: 'First substantive on-topic paragraph long enough to become a key finding entry in the returned array.' }), - Network accessline 100
mkSource({ url: 'https://b.com', relevance_score: 0.3, markdown_content: 'Second distinct substantive on-topic paragraph also long enough to become a separate key finding entry.' }), - Network accessline 110
const sources = Array.from({ length: 10 }, (_, i) => mkSource({ url: `https://pos${i}.com`, - Network accessline 111
mkSource({ url: `https://pos${i}.com`, relevance_score: 5 - i * 0.1, - Network accessline 112
url: `https://pos${i}.com`, - Network accessline 116
); sources.push(mkSource({ url: 'https://neg.com', - Network accessline 117
sources.push(mkSource({ url: 'https://neg.com', relevance_score: -3, - Network accessline 118
url: 'https://neg.com', - Network accessline 134
it('flattens inline markdown links so truncation cannot chop mid-link', async () => { const md = [ 'Body text describing how the linked author [Pavlo Stetsiuk](https://medium.com/?source=post_page-----abc123----------------------- - Network accessline 135
const md = [ 'Body text describing how the linked author [Pavlo Stetsiuk](https://medium.com/?source=post_page-----abc123--------------------------------) wrote about Postgres 18 release notes covering wal segment rotation and pg_dump - Network accessline 136
'Body text describing how the linked author [Pavlo Stetsiuk](https://medium.com/?source=post_page-----abc123--------------------------------) wrote about Postgres 18 release notes covering wal segment rotation and pg_dump improvements that - Network accessline 145
it('drops bare angle-bracket urls from key_findings', async () => { const md = 'Long paragraph that includes a reference <https://example.com/long-tracking-url-that-otherwise-leaks-into-output-and-pollutes-key-findings-with-noise-bytes> - Network accessline 146
const md = 'Long paragraph that includes a reference <https://example.com/long-tracking-url-that-otherwise-leaks-into-output-and-pollutes-key-findings-with-noise-bytes> mid-text and then continues with more substantive prose to push past th - Network accessline 152
// `](http://...)` artifacts can leak into - Network accessline 158
it('flattens reference-style markdown links so [label][1] becomes label', async () => { const md = 'A substantial paragraph that talks about how the documentation [Postgres replication guide][1] describes streaming and logical replicati - Network accessline 159
const md = 'A substantial paragraph that talks about how the documentation [Postgres replication guide][1] describes streaming and logical replication choices, with notes on backpressure and lag handling in production deployments today.\n\n - Network accessline 166
it('drops bare http/https URLs from key_findings text', async () => { const md = 'A long paragraph documenting how the SDK https://example.com/sdk/install?utm_source=blog&utm_medium=referral&utm_campaign=launch handles retries with expo - Network accessline 167
const md = 'A long paragraph documenting how the SDK https://example.com/sdk/install?utm_source=blog&utm_medium=referral&utm_campaign=launch handles retries with exponential backoff plus jitter and reports outcomes to a metrics endpoint tha - Network accessline 174
it('strips HTML anchor tags from key_findings', async () => { const md = 'Some prose describing how the runtime handles errors and surfaces them through the <a href="https://example.com/errors">error reporting dashboard</a> with stable - Network accessline 175
const md = 'Some prose describing how the runtime handles errors and surfaces them through the <a href="https://example.com/errors">error reporting dashboard</a> with stable identifiers and source-map resolution that points back to the orig - Network accessline 183
it('skips image-only leading paragraphs and surfaces real prose', async () => { const md = [ '', '', - Network accessline 185
'', - Network accessline 339
it('skips sources that failed to fetch', async () => { const sources = [ mkSource({ url: 'https://ok.com' }), - Network accessline 340
const sources = [ mkSource({ url: 'https://ok.com' }), mkSource({ url: 'https://fail.com', fetched: false, markdown_content: '' }), - Network accessline 341
mkSource({ url: 'https://ok.com' }), - Network accessline 342
mkSource({ url: 'https://fail.com', fetched: false, markdown_content: '' }), - Network accessline 344
const brief = await buildResearchBrief('q', sources, [], 3000, 40000); for (const h of brief.highlights) { expect(h.source_url).not.toBe('https://fail.com'); - Network accessline 345
for (const h of brief.highlights) { expect(h.source_url).not.toBe('https://fail.com'); } - Network accessline 346
expect(h.source_url).not.toBe('https://fail.com'); - Network accessline 351
const sources = [ mkSource({ title: 'Same Title', markdown_content: 'The same identical substantive paragraph repeated across two sources to test dedupe behavior.' }), mkSource({ url: 'https://b.com', title: 'Same Title', markdo - Network accessline 352
mkSource({ title: 'Same Title', markdown_content: 'The same identical substantive paragraph repeated across two sources to test dedupe behavior.' }), mkSource({ url: 'https://b.com', title: 'Same Title', markdown_content: 'The same id - Network accessline 353
mkSource({ url: 'https://b.com', title: 'Same Title', markdown_content: 'The same identical substantive paragraph repeated across two sources to test dedupe behavior.' }), - Network accessline 376
const sources = [ mkSource({ markdown_content: 'React is faster than Vue for large applications and has better performance characteristics overall.' }), mkSource({ url: 'https://b.com', markdown_content: 'Vue has a simpler API t - Network accessline 377
mkSource({ markdown_content: 'React is faster than Vue for large applications and has better performance characteristics overall.' }), mkSource({ url: 'https://b.com', markdown_content: 'Vue has a simpler API than React and is easier - Network accessline 378
mkSource({ url: 'https://b.com', markdown_content: 'Vue has a simpler API than React and is easier to learn for beginners.' }), - Network accessline 398
it('captures source-sentence + source-index tradeoffs for the verdict', async () => { const sources = [ mkSource({ url: 'https://a.com', markdown_content: 'React is faster than Vue for large applications because its reconciler bat - Network accessline 399
const sources = [ mkSource({ url: 'https://a.com', markdown_content: 'React is faster than Vue for large applications because its reconciler batches updates.' }), mkSource({ url: 'https://b.com', markdown_content: 'Vue has a sim - Network accessline 400
mkSource({ url: 'https://a.com', markdown_content: 'React is faster than Vue for large applications because its reconciler batches updates.' }), - Network accessline 401
mkSource({ url: 'https://b.com', markdown_content: 'Vue has a simpler API than React and is easier to learn for beginners.' }), - Network accessline 426
mkSource({ url: 'https://failed.com', markdown_content: '', fetched: false }), - Network accessline 427
mkSource({ url: 'https://react.com', markdown_content: 'React is faster than Vue for large applications because its reconciler batches updates efficiently.' }), - Network accessline 428
mkSource({ url: 'https://vue.com', markdown_content: 'Vue has a simpler API than React and is easier to learn for beginners just starting out.' }), - Network accessline 436
expect(fasterTradeoff.source_index).toBe(1); expect(sources[fasterTradeoff.source_index].url).toBe('https://react.com'); - Network accessline 437
expect(sources[fasterTradeoff.source_index].url).toBe('https://react.com'); - Network accessline 439
const vueTradeoff = tradeoffs.find((t) => t.text.includes('simpler API'))!; expect(vueTradeoff.source_index).toBe(2); expect(sources[vueTradeoff.source_index].url).toBe('https://vue.com'); - Network accessline 440
expect(vueTradeoff.source_index).toBe(2); expect(sources[vueTradeoff.source_index].url).toBe('https://vue.com'); }); - Network accessline 441
expect(sources[vueTradeoff.source_index].url).toBe('https://vue.com'); - Network accessline 444
it('keeps comparison_points keywords alongside the enriched tradeoffs', async () => { const sources = [ mkSource({ url: 'https://a.com', markdown_content: 'React is faster than Vue for large applications and has better performance - Network accessline 445
const sources = [ mkSource({ url: 'https://a.com', markdown_content: 'React is faster than Vue for large applications and has better performance characteristics overall.' }), mkSource({ url: 'https://b.com', markdown_content: 'V - Network accessline 446
mkSource({ url: 'https://a.com', markdown_content: 'React is faster than Vue for large applications and has better performance characteristics overall.' }), - Network accessline 447
mkSource({ url: 'https://b.com', markdown_content: 'Vue has a simpler API than React and is easier to learn for beginners.' }), - Network accessline 454
it('populates citation_graph when synthesisText is provided', async () => { const sources = [ mkSource({ url: 'https://a.com', markdown_content: 'server components render efficiently on server' }), - Network accessline 455
const sources = [ mkSource({ url: 'https://a.com', markdown_content: 'server components render efficiently on server' }), mkSource({ url: 'https://b.com', markdown_content: 'streaming SSR flushes chunks progressively' }), - Network accessline 456
mkSource({ url: 'https://a.com', markdown_content: 'server components render efficiently on server' }), - Network accessline 457
mkSource({ url: 'https://b.com', markdown_content: 'streaming SSR flushes chunks progressively' }), - Network accessline 490
mkSource({ url: 'https://failed.com', markdown_content: '', fetched: false }), - Network accessline 492
mkSource({ url: 'https://a.com', markdown_content: 'server components render efficiently on server' }), - Network accessline 493
mkSource({ url: 'https://b.com', markdown_content: 'streaming SSR flushes chunks progressively' }), - Network accessline 523
mkSource({ url: 'https://failed.com', markdown_content: '', fetched: false }), mkSource({ url: 'https://a.com', markdown_content: 'Server components render efficiently on the server before shipping to the client, which reduces the Jav - Network accessline 524
mkSource({ url: 'https://a.com', markdown_content: 'Server components render efficiently on the server before shipping to the client, which reduces the JavaScript bundle a browser must download and parse.' }), - Network accessline 525
mkSource({ url: 'https://b.com', markdown_content: 'Streaming server-side rendering flushes HTML chunks progressively as each part of the tree finishes rendering, improving time-to-first-byte for large pages.' }), - Network accessline 542
it('orders key_finding_sources by relevance to match key_findings ordering', async () => { const sources = [ mkSource({ url: 'https://low.com', relevance_score: 0.4, markdown_content: 'A lower relevance paragraph about topic ALPHA - Network accessline 543
const sources = [ mkSource({ url: 'https://low.com', relevance_score: 0.4, markdown_content: 'A lower relevance paragraph about topic ALPHA that is substantive enough to survive the eighty character minimum length filter for a key fin - Network accessline 544
mkSource({ url: 'https://low.com', relevance_score: 0.4, markdown_content: 'A lower relevance paragraph about topic ALPHA that is substantive enough to survive the eighty character minimum length filter for a key finding entry.' }), - Network accessline 545
mkSource({ url: 'https://high.com', relevance_score: 0.95, markdown_content: 'A higher relevance paragraph about topic BETA that is clearly substantive and long enough to be included as the first finding in the ordered list.' }), - Network accessline 550
expect(brief.key_finding_sources![0]).toBe(1); expect(sources[brief.key_finding_sources![0]].url).toBe('https://high.com'); - Network accessline 551
expect(sources[brief.key_finding_sources![0]].url).toBe('https://high.com'); - Network accessline 580
it('finds findings mentioned in multiple sources', () => { const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: 'DuckDB columnar storage engine provides excellent performance for analytical worklo - Network accessline 581
const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: 'DuckDB columnar storage engine provides excellent performance for analytical workloads.' }), mkSource({ url: 'https://b.com', markdown_conte - Network accessline 582
mkSource({ url: 'https://a.com', markdown_content: 'DuckDB columnar storage engine provides excellent performance for analytical workloads.' }), - Network accessline 583
mkSource({ url: 'https://b.com', markdown_content: 'The DuckDB columnar storage engine handles OLAP queries efficiently in production systems.' }), - Network accessline 584
mkSource({ url: 'https://c.com', markdown_content: 'SQLite is best for embedded transactional use cases, not analytics.' }), - Network accessline 596
// WHY: Medium articles share identical image/byline CHROME — avatar embeds // (``), byline links - Network accessline 597
// (``), byline links - Network accessline 605
it('does NOT surface shared image/byline CHROME as cross-references', () => { const chrome = '[\n\n\n\n]' + - Network accessline 606
const chrome = '[\n\n\n\n]' + '(/@sharmaakhil.work?source=post_page---byline--7b8ac89bfaae----)\n\n' + - Network accessline 607
'[\n\n\n\n]' + - Network accessline 609
'Press enter or click to view image in full size\n\n'; const sources: ResearchSource[] = [ mkSource({ url: 'https://m1.com', markdown_content: chrome + 'Node.js 24 ships the V8 13.6 engine and npm 11.' }), - Network accessline 610
const sources: ResearchSource[] = [ mkSource({ url: 'https://m1.com', markdown_content: chrome + 'Node.js 24 ships the V8 13.6 engine and npm 11.' }), mkSource({ url: 'https://m2.com', markdown_content: chrome + 'Node.js 24 adds - Network accessline 611
mkSource({ url: 'https://m1.com', markdown_content: chrome + 'Node.js 24 ships the V8 13.6 engine and npm 11.' }), - Network accessline 612
mkSource({ url: 'https://m2.com', markdown_content: chrome + 'Node.js 24 adds explicit resource management via using.' }), - Network accessline 613
mkSource({ url: 'https://m3.com', markdown_content: chrome + 'Node.js 24 stabilizes the permission model.' }), - Network accessline 623
const sharedContent = 'kubernetes container orchestration platform runs production workloads efficiently'; const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: sharedContent }), - Network accessline 624
const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: sharedContent }), mkSource({ url: 'https://b.com', markdown_content: sharedContent }), - Network accessline 625
mkSource({ url: 'https://a.com', markdown_content: sharedContent }), - Network accessline 626
mkSource({ url: 'https://b.com', markdown_content: sharedContent }), - Network accessline 627
mkSource({ url: 'https://c.com', markdown_content: sharedContent }), - Network accessline 633
it('sets confidence medium for exactly 2 sources', () => { const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: 'Python machine learning framework supports neural network training efficiently' }), - Network accessline 634
const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: 'Python machine learning framework supports neural network training efficiently' }), mkSource({ url: 'https://b.com', markdown_content: 'Usin - Network accessline 635
mkSource({ url: 'https://a.com', markdown_content: 'Python machine learning framework supports neural network training efficiently' }), - Network accessline 636
mkSource({ url: 'https://b.com', markdown_content: 'Using Python machine learning framework for neural network training tasks' }), - Network accessline 648
).join('. '); const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: content }), - Network accessline 649
const sources: ResearchSource[] = [ mkSource({ url: 'https://a.com', markdown_content: content }), mkSource({ url: 'https://b.com', markdown_content: content }), - Network accessline 650
mkSource({ url: 'https://a.com', markdown_content: content }), - Network accessline 651
mkSource({ url: 'https://b.com', markdown_content: content }),
tests/unit/research/citation-graph.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
function mkSource(overrides: Partial<CitationGraphSource> = {}): CitationGraphSource { return { url: 'https://example.com/a', - Network accessline 6
return { url: 'https://example.com/a', title: 'Example', - Network accessline 7
url: 'https://example.com/a', - Network accessline 14
describe('buildCitationGraph', () => { it('extracts citation markers and maps to 0-based source indices', () => { const sources = [mkSource({ url: 'https://a.com' }), mkSource({ url: 'https://b.com' })]; - Network accessline 15
it('extracts citation markers and maps to 0-based source indices', () => { const sources = [mkSource({ url: 'https://a.com' }), mkSource({ url: 'https://b.com' })]; const graph = buildCitationGraph('AI is rapidly evolving these days - Network accessline 16
const sources = [mkSource({ url: 'https://a.com' }), mkSource({ url: 'https://b.com' })]; - Network accessline 102
it('preserves decimal numbers inside citation claim text', () => { const sources = Array.from({ length: 7 }, (_, i) => mkSource({ url: `https://example.com/${i}` }), - Network accessline 103
const sources = Array.from({ length: 7 }, (_, i) => mkSource({ url: `https://example.com/${i}` }), ); - Network accessline 104
mkSource({ url: `https://example.com/${i}` }),
tests/unit/research/decompose.test.ts
- Executable scriptline 1
Executable file
tests/unit/research/entity-extractor.test.ts
- Executable scriptline 1
Executable file
tests/unit/research/gap-detection.test.ts
- Executable scriptline 1
Executable file
tests/unit/research/pipeline-breadth.test.ts
- Executable scriptline 1
Executable file - Network accessline 55
return { title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 56
title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, snippet: 'SQLite FTS5 versus a dedicated vector database tradeoffs.', - Network accessline 57
url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 93
const junkHomepage = 'https://example.org/'; - Network accessline 94
const junkSerp = 'https://www.bing.com/search?q=fts5'; - Network accessline 96
'https://www.linkedin.com/posts/jane_sqlite-vector-activity-7123456789012345678-AbCd';
tests/unit/research/pipeline-budget.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
const results: RawSearchResult[] = Array.from({ length: n }, (_, i) => ({ title: `Source ${i + 1}`, url: `https://e.com/${i + 1}`, - Network accessline 31
title: `Source ${i + 1}`, url: `https://e.com/${i + 1}`, snippet: `snippet ${i + 1}`, - Network accessline 32
url: `https://e.com/${i + 1}`,
tests/unit/research/pipeline-score-floor.test.ts
- Executable scriptline 1
Executable file - Network accessline 51
return { title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 52
title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, snippet: 'SQLite FTS5 versus a dedicated vector database tradeoffs.', - Network accessline 53
url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 71
const results: RawSearchResult[] = [ ...Array.from({ length: 10 }, (_, i) => goodResult(i, 0.9 - i * 0.05)), { title: 'Some video', url: 'https://www.youtube.com/watch?v=abc123', snippet: 'unrelated', relevance_score: -0.4, engi - Network accessline 72
...Array.from({ length: 10 }, (_, i) => goodResult(i, 0.9 - i * 0.05)), { title: 'Some video', url: 'https://www.youtube.com/watch?v=abc123', snippet: 'unrelated', relevance_score: -0.4, engine: 'stub' }, { title: 'An app', url: - Network accessline 73
{ title: 'Some video', url: 'https://www.youtube.com/watch?v=abc123', snippet: 'unrelated', relevance_score: -0.4, engine: 'stub' }, - Network accessline 74
{ title: 'An app', url: 'https://play.google.com/store/apps/details?id=x', snippet: 'unrelated', relevance_score: -1.2, engine: 'stub' }, - Network accessline 75
{ title: 'Zhihu answer', url: 'https://www.zhihu.com/question/12345', snippet: 'unrelated', relevance_score: -0.8, engine: 'stub' }, - Network accessline 81
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://www.youtube.com/watch?v=abc123'); - Network accessline 82
expect(urls).not.toContain('https://www.youtube.com/watch?v=abc123'); - Network accessline 83
expect(urls).not.toContain('https://play.google.com/store/apps/details?id=x'); - Network accessline 84
expect(urls).not.toContain('https://www.zhihu.com/question/12345'); - Network accessline 87
expect(floorRejects.map((r) => r.url).sort()).toEqual( [ 'https://play.google.com/store/apps/details?id=x', - Network accessline 88
[ 'https://play.google.com/store/apps/details?id=x', 'https://www.youtube.com/watch?v=abc123', - Network accessline 89
'https://play.google.com/store/apps/details?id=x', - Network accessline 90
'https://www.youtube.com/watch?v=abc123', - Network accessline 91
'https://www.zhihu.com/question/12345', - Network accessline 100
const results: RawSearchResult[] = [ ...Array.from({ length: 10 }, (_, i) => goodResult(i, 0.9 - i * 0.05)), { title: 'video', url: 'https://www.youtube.com/watch?v=x', snippet: 'unrelated', relevance_score: -0.5, engine: 'stub' - Network accessline 101
...Array.from({ length: 10 }, (_, i) => goodResult(i, 0.9 - i * 0.05)), { title: 'video', url: 'https://www.youtube.com/watch?v=x', snippet: 'unrelated', relevance_score: -0.5, engine: 'stub' }, { title: 'video2', url: 'https:// - Network accessline 102
{ title: 'video', url: 'https://www.youtube.com/watch?v=x', snippet: 'unrelated', relevance_score: -0.5, engine: 'stub' }, - Network accessline 103
{ title: 'video2', url: 'https://www.youtube.com/watch?v=y', snippet: 'unrelated', relevance_score: -0.6, engine: 'stub' }, - Network accessline 153
const results: RawSearchResult[] = [ ...Array.from({ length: 18 }, (_, i) => goodResult(i, -0.05 - i * 0.02)), { title: 'Unrelated video', url: 'https://www.youtube.com/watch?v=junk1', snippet: 'unrelated', relevance_score: -0.9 - Network accessline 154
...Array.from({ length: 18 }, (_, i) => goodResult(i, -0.05 - i * 0.02)), { title: 'Unrelated video', url: 'https://www.youtube.com/watch?v=junk1', snippet: 'unrelated', relevance_score: -0.95, engine: 'stub' }, { title: 'Unrela - Network accessline 155
{ title: 'Unrelated video', url: 'https://www.youtube.com/watch?v=junk1', snippet: 'unrelated', relevance_score: -0.95, engine: 'stub' }, - Network accessline 156
{ title: 'Unrelated video 2', url: 'https://www.youtube.com/watch?v=junk2', snippet: 'unrelated', relevance_score: -0.99, engine: 'stub' }, - Network accessline 162
expect(result.sources.length).toBeGreaterThanOrEqual(6); const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://www.youtube.com/watch?v=junk1'); - Network accessline 163
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://www.youtube.com/watch?v=junk1'); expect(urls).not.toContain('https://www.youtube.com/watch?v=junk2'); - Network accessline 164
expect(urls).not.toContain('https://www.youtube.com/watch?v=junk1'); - Network accessline 165
expect(urls).not.toContain('https://www.youtube.com/watch?v=junk2'); - Network accessline 166
const floorRejects = (result.rejected_sources ?? []).filter((r) => r.stage === 'score-floor'); expect(floorRejects.map((r) => r.url)).toContain('https://www.youtube.com/watch?v=junk1'); expect(floorRejects.map((r) => r.url)).toConta - Network accessline 167
expect(floorRejects.map((r) => r.url)).toContain('https://www.youtube.com/watch?v=junk1'); - Network accessline 168
expect(floorRejects.map((r) => r.url)).toContain('https://www.youtube.com/watch?v=junk2'); - Network accessline 202
const keptUrls = new Set(result.sources.map((s) => s.url)); for (let i = 0; i < 6; i++) { expect(keptUrls).toContain(`https://content${i}.example.com/articles/fts5-vs-vector-${i}`); - Network accessline 203
for (let i = 0; i < 6; i++) { expect(keptUrls).toContain(`https://content${i}.example.com/articles/fts5-vs-vector-${i}`); } - Network accessline 204
expect(keptUrls).toContain(`https://content${i}.example.com/articles/fts5-vs-vector-${i}`); - Network accessline 219
const results: RawSearchResult[] = [ ...Array.from({ length: 15 }, (_, i) => goodResult(i, -0.4 - i * 0.02)), // ranks 0..14, inside window, all < -0.35 { title: 'Off-topic forum', url: 'https://www.zhihu.com/question/99', snipp - Network accessline 220
...Array.from({ length: 15 }, (_, i) => goodResult(i, -0.4 - i * 0.02)), // ranks 0..14, inside window, all < -0.35 { title: 'Off-topic forum', url: 'https://www.zhihu.com/question/99', snippet: 'unrelated', relevance_score: -0.8, eng - Network accessline 221
{ title: 'Off-topic forum', url: 'https://www.zhihu.com/question/99', snippet: 'unrelated', relevance_score: -0.8, engine: 'stub' }, // rank 15, outside window - Network accessline 227
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://www.zhihu.com/question/99'); - Network accessline 228
expect(urls).not.toContain('https://www.zhihu.com/question/99'); - Network accessline 229
const floorRejects = (result.rejected_sources ?? []).filter((r) => r.stage === 'score-floor'); expect(floorRejects.map((r) => r.url)).toContain('https://www.zhihu.com/question/99'); }); - Network accessline 230
expect(floorRejects.map((r) => r.url)).toContain('https://www.zhihu.com/question/99');
tests/unit/research/pipeline-shell-completeness.test.ts
- Executable scriptline 1
Executable file - Network accessline 67
it('excludes a shell-labeled source and records it in rejected_sources (stage shell-content)', async () => { const results: RawSearchResult[] = [ { title: 'Shell capture', url: 'https://example.com/articles/shell-page', snippet: ' - Network accessline 68
const results: RawSearchResult[] = [ { title: 'Shell capture', url: 'https://example.com/articles/shell-page', snippet: 'x', relevance_score: 0.99, engine: 'stub' }, { title: 'Full article', url: 'https://example.com/articles/fu - Network accessline 69
{ title: 'Shell capture', url: 'https://example.com/articles/shell-page', snippet: 'x', relevance_score: 0.99, engine: 'stub' }, - Network accessline 70
{ title: 'Full article', url: 'https://example.com/articles/full-page', snippet: 'x', relevance_score: 0.98, engine: 'stub' }, - Network accessline 71
...Array.from({ length: 6 }, (_, i) => ({ title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 72
title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, snippet: 'SQLite FTS5 versus a dedicated vector database tradeoffs.', - Network accessline 73
url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 84
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://example.com/articles/shell-page'); - Network accessline 85
expect(urls).not.toContain('https://example.com/articles/shell-page'); - Network accessline 87
expect(urls).toContain('https://example.com/articles/full-page'); - Network accessline 90
const shellReject = (result.rejected_sources ?? []).find( (r) => r.url === 'https://example.com/articles/shell-page', - Network accessline 91
(r) => r.url === 'https://example.com/articles/shell-page', - Network accessline 100
const results: RawSearchResult[] = Array.from({ length: 6 }, (_, i) => ({ title: `Plain HTTP article ${i}`, url: `https://plain${i}.example.com/articles/topic-${i}`, - Network accessline 101
title: `Plain HTTP article ${i}`, url: `https://plain${i}.example.com/articles/topic-${i}`, snippet: 'SQLite FTS5 versus a dedicated vector database tradeoffs.', - Network accessline 102
url: `https://plain${i}.example.com/articles/topic-${i}`, - Network accessline 121
const results: RawSearchResult[] = [ { title: 'Thin page', url: 'https://example.com/articles/thin-page', snippet: 'x', relevance_score: 0.99, engine: 'stub' }, - Network accessline 122
{ title: 'Thin page', url: 'https://example.com/articles/thin-page', snippet: 'x', relevance_score: 0.99, engine: 'stub' }, - Network accessline 123
...Array.from({ length: 5 }, (_, i) => ({ title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 124
title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, snippet: 'SQLite FTS5 versus a dedicated vector database tradeoffs.', - Network accessline 125
url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 135
expect(result.sources.map((s) => s.url)).toContain('https://example.com/articles/thin-page');
tests/unit/research/pipeline-source-validation.test.ts
- Executable scriptline 1
Executable file - Network accessline 54
return { title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 55
title: `FTS5 vs vector DB article ${i}`, url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, snippet: 'SQLite FTS5 versus a dedicated vector database tradeoffs.', - Network accessline 56
url: `https://content${i}.example.com/articles/fts5-vs-vector-${i}`, - Network accessline 72
const results: RawSearchResult[] = [ { title: 'Google', url: 'https://www.google.com/', snippet: '', relevance_score: 0.99, engine: 'stub' }, - Network accessline 73
{ title: 'Google', url: 'https://www.google.com/', snippet: '', relevance_score: 0.99, engine: 'stub' }, - Network accessline 74
{ title: 'Bing search', url: 'https://www.bing.com/search?q=fts5', snippet: '', relevance_score: 0.98, engine: 'stub' }, - Network accessline 81
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://www.google.com/'); - Network accessline 82
expect(urls).not.toContain('https://www.google.com/'); - Network accessline 83
expect(urls).not.toContain('https://www.bing.com/search?q=fts5'); - Network accessline 97
const results: RawSearchResult[] = [ { title: 'Google', url: 'https://www.google.com/', snippet: '', relevance_score: 0.99, engine: 'stub' }, - Network accessline 98
{ title: 'Google', url: 'https://www.google.com/', snippet: '', relevance_score: 0.99, engine: 'stub' }, - Network accessline 99
{ title: 'Bing search', url: 'https://www.bing.com/search?q=x', snippet: '', relevance_score: 0.98, engine: 'stub' }, - Network accessline 115
const results: RawSearchResult[] = [ { title: 'Promo post', url: 'https://www.linkedin.com/posts/jane_sqlite-vector-activity-7123456789012345678-AbCd', snippet: 'check out my post', relevance_score: 0.97, engine: 'stub' }, - Network accessline 116
{ title: 'Promo post', url: 'https://www.linkedin.com/posts/jane_sqlite-vector-activity-7123456789012345678-AbCd', snippet: 'check out my post', relevance_score: 0.97, engine: 'stub' }, - Network accessline 123
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain( 'https://www.linkedin.com/posts/jane_sqlite-vector-activity-7123456789012345678-AbCd', - Network accessline 124
expect(urls).not.toContain( 'https://www.linkedin.com/posts/jane_sqlite-vector-activity-7123456789012345678-AbCd', ); - Network accessline 125
'https://www.linkedin.com/posts/jane_sqlite-vector-activity-7123456789012345678-AbCd', - Network accessline 135
const results: RawSearchResult[] = [ { title: 'Shell page', url: 'https://content99.example.com/shell', snippet: 'x', relevance_score: 0.995, engine: 'stub' }, - Network accessline 136
{ title: 'Shell page', url: 'https://content99.example.com/shell', snippet: 'x', relevance_score: 0.995, engine: 'stub' }, - Network accessline 143
const urls = result.sources.map((s) => s.url); expect(urls).not.toContain('https://content99.example.com/shell'); - Network accessline 144
expect(urls).not.toContain('https://content99.example.com/shell'); - Network accessline 146
const shellReject = (result.rejected_sources ?? []).find( (r) => r.url === 'https://content99.example.com/shell', - Network accessline 147
(r) => r.url === 'https://content99.example.com/shell', - Network accessline 160
const results: RawSearchResult[] = Array.from({ length: 5 }, (_, i) => ({ title: `Shell ${i}`, url: `https://content${i}.example.com/shell-${i}`, - Network accessline 161
title: `Shell ${i}`, url: `https://content${i}.example.com/shell-${i}`, snippet: 'x', - Network accessline 162
url: `https://content${i}.example.com/shell-${i}`, - Network accessline 198
const results: RawSearchResult[] = [ { title: 'Docs root', url: 'https://docs.example.com/', snippet: 'x', relevance_score: 0.95, engine: 'stub' }, - Network accessline 199
{ title: 'Docs root', url: 'https://docs.example.com/', snippet: 'x', relevance_score: 0.95, engine: 'stub' }, - Network accessline 210
const homepageRejects = (result.rejected_sources ?? []).filter((r) => r.reason === 'homepage'); expect(homepageRejects).toHaveLength(0); expect(result.sources.map((s) => s.url)).toContain('https://docs.example.com/'); - Network accessline 211
expect(homepageRejects).toHaveLength(0); expect(result.sources.map((s) => s.url)).toContain('https://docs.example.com/'); }); - Network accessline 212
expect(result.sources.map((s) => s.url)).toContain('https://docs.example.com/'); - Network accessline 219
const results: RawSearchResult[] = [ { title: 'Google', url: 'https://www.google.com/', snippet: '', relevance_score: 0.99, engine: 'stub' }, - Network accessline 220
{ title: 'Google', url: 'https://www.google.com/', snippet: '', relevance_score: 0.99, engine: 'stub' }, - Network accessline 221
{ title: 'Bing search', url: 'https://www.bing.com/search?q=x', snippet: '', relevance_score: 0.98, engine: 'stub' },
tests/unit/research/pipeline.llm-gate-keystore.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Network accessline 68
return { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 69
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 70
url: 'https://example.com', - Network accessline 71
finalUrl: 'https://example.com', - Network accessline 81
const RESULTS: RawSearchResult[] = [ { title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'Learn about hooks.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 82
{ title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'Learn about hooks.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 83
{ title: 'Vue Composition API', url: 'https://vuejs.org/guide', snippet: 'Vue 3 composition API.', relevance_score: 0.88, engine: 'stub' }, - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 90
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted] - Access to secretsline 135
[Credential-related source omitted]
tests/unit/research/pipeline.local-tier.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 48
[Credential-related source omitted] - Network accessline 63
return { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 64
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 65
url: 'https://example.com', - Network accessline 66
finalUrl: 'https://example.com', - Network accessline 76
const RESULTS: RawSearchResult[] = [ { title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'Learn about hooks.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 77
{ title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'Learn about hooks.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 78
{ title: 'Vue Composition API', url: 'https://vuejs.org/guide', snippet: 'Vue 3 composition API.', relevance_score: 0.88, engine: 'stub' }, - Network accessline 90
vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', - Network accessline 91
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', - Network accessline 92
endpoint: 'http://localhost:11434', - Network accessline 106
expect(localSpy).toHaveBeenCalledTimes(1); const tierArg = localSpy.mock.calls[0]![2]; expect(tierArg?.tier).toEqual({ endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct' }); - Network accessline 107
const tierArg = localSpy.mock.calls[0]![2]; expect(tierArg?.tier).toEqual({ endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct' }); expect(out.report).toContain('Local-tier report'); - Network accessline 108
expect(tierArg?.tier).toEqual({ endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct' }); - Network accessline 127
vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', - Network accessline 128
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', - Network accessline 129
endpoint: 'http://localhost:11434', - Network accessline 146
vi.mocked(localTierModule.resolveLocalModelTier).mockResolvedValue({ available: true, endpoint: 'http://localhost:11434', - Network accessline 147
available: true, endpoint: 'http://localhost:11434', model: 'qwen2.5:7b-instruct', - Network accessline 148
endpoint: 'http://localhost:11434', - Network accessline 157
const threeResults: RawSearchResult[] = [ { title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'react', relevance_score: 0.95, engine: 'stub' }, - Network accessline 158
{ title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'react', relevance_score: 0.95, engine: 'stub' }, - Network accessline 159
{ title: 'Vue Reactivity', url: 'https://vuejs.org/guide', snippet: 'vue', relevance_score: 0.9, engine: 'stub' }, - Network accessline 160
{ title: 'Svelte Runes', url: 'https://svelte.dev/runes', snippet: 'svelte', relevance_score: 0.85, engine: 'stub' },
tests/unit/research/pipeline.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
const defaultResults: RawSearchResult[] = [ { title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'Learn about hooks.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 54
{ title: 'React Hooks Guide', url: 'https://react.dev/hooks', snippet: 'Learn about hooks.', relevance_score: 0.95, engine: 'stub' }, - Network accessline 55
{ title: 'Vue Composition API', url: 'https://vuejs.org/guide', snippet: 'Vue 3 composition API.', relevance_score: 0.88, engine: 'stub' }, - Network accessline 56
{ title: 'Svelte Stores', url: 'https://svelte.dev/docs', snippet: 'Svelte reactive stores.', relevance_score: 0.82, engine: 'stub' }, - Network accessline 57
{ title: 'Angular Signals', url: 'https://angular.io/signals', snippet: 'Angular signal primitives.', relevance_score: 0.75, engine: 'stub' }, - Network accessline 58
{ title: 'Solid Signals', url: 'https://solidjs.com/docs', snippet: 'SolidJS fine-grained reactivity.', relevance_score: 0.70, engine: 'stub' }, - Network accessline 233
name: 'dedup-stub', search: vi.fn().mockResolvedValue([ { title: 'Same Article', url: 'https://example.com/article', snippet: 'content', relevance_score: 0.9, engine: 'dedup-stub' }, - Network accessline 234
search: vi.fn().mockResolvedValue([ { title: 'Same Article', url: 'https://example.com/article', snippet: 'content', relevance_score: 0.9, engine: 'dedup-stub' }, ]), - Network accessline 235
{ title: 'Same Article', url: 'https://example.com/article', snippet: 'content', relevance_score: 0.9, engine: 'dedup-stub' },
tests/unit/research/render-brief.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
function mkSource(overrides: Partial<ResearchSource> = {}): ResearchSource { return { url: 'https://example.com/1', - Network accessline 6
return { url: 'https://example.com/1', title: 'Example Source One', - Network accessline 7
url: 'https://example.com/1', - Network accessline 61
}); const sources = [ mkSource({ url: 'https://a.com', title: 'FTS5 guide' }), - Network accessline 62
const sources = [ mkSource({ url: 'https://a.com', title: 'FTS5 guide' }), mkSource({ url: 'https://b.com', title: 'Vector DB guide' }), - Network accessline 63
mkSource({ url: 'https://a.com', title: 'FTS5 guide' }), - Network accessline 64
mkSource({ url: 'https://b.com', title: 'Vector DB guide' }), - Network accessline 115
}); const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 116
const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 117
mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 118
mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 128
expect(md).toContain('### Sources'); expect(md).toContain('Source A'); expect(md).toContain('https://a.com'); - Network accessline 129
expect(md).toContain('Source A'); expect(md).toContain('https://a.com'); }); - Network accessline 130
expect(md).toContain('https://a.com'); - Network accessline 145
}, }); const sources = [mkSource({ url: 'https://a.com' }), mkSource({ url: 'https://b.com' }), mkSource({ url: 'https://c.com' })]; - Network accessline 146
}); const sources = [mkSource({ url: 'https://a.com' }), mkSource({ url: 'https://b.com' }), mkSource({ url: 'https://c.com' })]; const md = renderBriefReport('q', brief, sources); - Network accessline 147
const sources = [mkSource({ url: 'https://a.com' }), mkSource({ url: 'https://b.com' }), mkSource({ url: 'https://c.com' })]; - Network accessline 219
}); const sources = [ mkSource({ url: 'https://a.com', title: '### Sources\nfake source line [4]' }), - Network accessline 220
const sources = [ mkSource({ url: 'https://a.com', title: '### Sources\nfake source line [4]' }), mkSource({ url: 'https://b.com', title: 'Real Title B' }), - Network accessline 221
mkSource({ url: 'https://a.com', title: '### Sources\nfake source line [4]' }), - Network accessline 222
mkSource({ url: 'https://b.com', title: 'Real Title B' }), - Network accessline 255
}); const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 256
const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 257
mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 258
mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 259
mkSource({ url: 'https://c.com', title: 'Source C' }), - Network accessline 275
}); const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 276
const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 277
mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 278
mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 311
}); const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 312
const sources = [ mkSource({ url: 'https://a.com', title: 'Source A' }), mkSource({ url: 'https://b.com', title: 'Source B' }), - Network accessline 313
mkSource({ url: 'https://a.com', title: 'Source A' }), - Network accessline 314
mkSource({ url: 'https://b.com', title: 'Source B' }),
tests/unit/research/source-validation.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
expect(classifyUrlShape('https://www.google.com/')).toEqual({ - Network accessline 14
reason: 'homepage', }); expect(classifyUrlShape('https://example.com')).toEqual({ - Network accessline 15
}); expect(classifyUrlShape('https://example.com')).toEqual({ reject: true, - Network accessline 16
expect(classifyUrlShape('https://example.com')).toEqual({ - Network accessline 25
expect(classifyUrlShape('https://www.google.com/search?q=fts5+vs+vector+db')).toEqual({ - Network accessline 27
reason: 'serp', }); expect(classifyUrlShape('https://www.bing.com/search?q=anything')).toEqual({ - Network accessline 28
}); expect(classifyUrlShape('https://www.bing.com/search?q=anything')).toEqual({ reject: true, - Network accessline 29
expect(classifyUrlShape('https://www.bing.com/search?q=anything')).toEqual({ - Network accessline 42
expect(classifyUrlShape('https://www.startpage.com/search?q=fts5+vs+vector+db')).toEqual({ - Network accessline 51
expect(classifyUrlShape('https://blogsearch.example.jp/blogsearch?q=foo').reject).toBe(true); - Network accessline 52
expect(classifyUrlShape('https://blogsearch.example.jp/blogsearch?q=foo').reason).toBe('serp'); - Network accessline 55
it('keeps a normal content URL with a real path', () => { expect(classifyUrlShape('https://react.dev/reference/react')).toEqual({ reject: false }); - Network accessline 56
expect(classifyUrlShape('https://react.dev/reference/react')).toEqual({ reject: false }); - Network accessline 57
expect(classifyUrlShape('https://alexgarcia.xyz/sqlite-vec/api-reference.html')).toEqual({ - Network accessline 65
expect( classifyUrlShape('https://docs.stripe.com/', ['docs.stripe.com']), - Network accessline 66
classifyUrlShape('https://docs.stripe.com/', ['docs.stripe.com']), - Network accessline 73
expect(classifyUrlShape('https://blog.google/products/search/some-article/')).toEqual({ - Network accessline 82
expect(classifyUrlShape('https://task.evil.com/search?q=x')).toEqual({ reject: false }); - Network accessline 83
expect(classifyUrlShape('https://flask.palletsprojects.com/search?q=x')).toEqual({ - Network accessline 84
reject: false, }); expect(classifyUrlShape('https://notgoogle.com/search?q=x')).toEqual({ reject: false }); - Network accessline 85
}); expect(classifyUrlShape('https://notgoogle.com/search?q=x')).toEqual({ reject: false }); }); - Network accessline 86
expect(classifyUrlShape('https://notgoogle.com/search?q=x')).toEqual({ reject: false }); - Network accessline 94
expect( classifyUrlShape( 'https://www.linkedin.com/posts/janedoe_sqlite-vector-search-activity-7123456789012345678-AbCd', - Network accessline 95
classifyUrlShape( 'https://www.linkedin.com/posts/janedoe_sqlite-vector-search-activity-7123456789012345678-AbCd', ), - Network accessline 96
'https://www.linkedin.com/posts/janedoe_sqlite-vector-search-activity-7123456789012345678-AbCd', - Network accessline 108
expect( classifyUrlShape('https://www.linkedin.com/pulse/sqlite-fts5-vs-vector-db-jane-doe'), - Network accessline 109
classifyUrlShape('https://www.linkedin.com/pulse/sqlite-fts5-vs-vector-db-jane-doe'), - Network accessline 117
expect(classifyUrlShape('https://www.linkedin.com/in/jane-doe')).toEqual({ - Network accessline 119
reason: 'social-promo', }); expect(classifyUrlShape('https://www.linkedin.com/company/acme')).toEqual({ - Network accessline 120
}); expect(classifyUrlShape('https://www.linkedin.com/company/acme')).toEqual({ reject: true, - Network accessline 121
expect(classifyUrlShape('https://www.linkedin.com/company/acme')).toEqual({ - Network accessline 130
expect( classifyUrlShape( 'https://www.linkedin.com/pulse/sqlite-fts5-vs-vector-db-jane-doe', - Network accessline 131
classifyUrlShape( 'https://www.linkedin.com/pulse/sqlite-fts5-vs-vector-db-jane-doe', ['linkedin.com'], - Network accessline 132
'https://www.linkedin.com/pulse/sqlite-fts5-vs-vector-db-jane-doe', - Network accessline 141
expect(classifyUrlShape('https://sqlite.org/fts5.html')).toEqual({ reject: false }); - Network accessline 147
expect(classifyUrlShape('https://example.com/posts/my-article')).toEqual({ reject: false });
tests/unit/research/synthesis-local.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 7
[Credential-related source omitted] - Access to secretsline 8
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Network accessline 52
it('POSTs to {provider}/v1/chat/completions with prompt + sources', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; - Network accessline 53
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; process.env['WIGOLO_LLM_MODEL'] = 'my-model'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 62
const result = await synthesizeLocal('What is AI?', [ { url: 'https://a.com', title: 'A', markdown: 'AI rocks' }, - Network accessline 63
{ url: 'https://a.com', title: 'A', markdown: 'AI rocks' }, - Network accessline 67
expect(result.citations).toEqual([0]); const [url, init] = fetchSpy.mock.calls[0]!; expect(url).toBe('http://localhost:1234/v1/chat/completions'); - Network accessline 68
const [url, init] = fetchSpy.mock.calls[0]!; expect(url).toBe('http://localhost:1234/v1/chat/completions'); const body = JSON.parse(String((init as RequestInit).body)); - Network accessline 69
expect(url).toBe('http://localhost:1234/v1/chat/completions'); - Network accessline 78
it('instructs the model to place an inline [N] citation after EVERY claim', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 79
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 96
it('extracts multiple citation markers (1-based -> 0-based)', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 97
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 114
it('keeps out-of-range citations verbatim (caller validates)', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 115
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 128
it('throws on non-200 response', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('boom', { status: 500 })); - Network accessline 129
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('boom', { status: 500 })); await expect( - Network accessline 136
it('throws when fetch errors out', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; - Network accessline 137
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('econnrefused')); await expect( - Network accessline 144
it('still calls endpoint when sources empty (caller responsibility)', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 145
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 158
it('respects maxSources slice', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 159
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 165
); const sources = Array.from({ length: 10 }, (_, i) => ({ url: `https://s${i}.com`, - Network accessline 166
const sources = Array.from({ length: 10 }, (_, i) => ({ url: `https://s${i}.com`, title: `T${i}`, - Network accessline 167
url: `https://s${i}.com`, - Network accessline 182
it('accepts a full endpoint URL ending in /v1/chat/completions', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234/v1/chat/completions'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 183
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234/v1/chat/completions'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 189
); await synthesizeLocal('q', []); expect(fetchSpy.mock.calls[0]![0]).toBe('http://localhost:1234/v1/chat/completions'); - Network accessline 190
await synthesizeLocal('q', []); expect(fetchSpy.mock.calls[0]![0]).toBe('http://localhost:1234/v1/chat/completions'); }); - Network accessline 191
expect(fetchSpy.mock.calls[0]![0]).toBe('http://localhost:1234/v1/chat/completions'); - Network accessline 194
it('truncates source markdown to maxCharsPerSource', async () => { process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( - Network accessline 195
process.env['WIGOLO_LLM_PROVIDER'] = 'http://localhost:1234'; const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( - Network accessline 242
const result = await synthesizeLocal( 'What is AI?', [{ url: 'https://a.com', title: 'A', markdown: 'AI rocks' }], - Network accessline 243
'What is AI?', [{ url: 'https://a.com', title: 'A', markdown: 'AI rocks' }], { tier: { endpoint: 'http://localhost:9999', model: 'qwen2.5:7b-instruct' } }, - Network accessline 244
[{ url: 'https://a.com', title: 'A', markdown: 'AI rocks' }], - Network accessline 245
{ tier: { endpoint: 'http://localhost:9999', model: 'qwen2.5:7b-instruct' } }, - Network accessline 249
expect(result.citations).toEqual([0]); const [url, init] = fetchSpy.mock.calls[0]!; expect(url).toBe('http://localhost:9999/v1/chat/completions'); - Network accessline 250
const [url, init] = fetchSpy.mock.calls[0]!; expect(url).toBe('http://localhost:9999/v1/chat/completions'); const body = JSON.parse(String((init as RequestInit).body)); - Network accessline 251
expect(url).toBe('http://localhost:9999/v1/chat/completions'); - Network accessline 268
'q', [{ url: 'u', title: 't', markdown: 'm' }], { tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, - Network accessline 269
[{ url: 'u', title: 't', markdown: 'm' }], { tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, ); - Network accessline 270
{ tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, - Network accessline 285
'q', [{ url: 'u', title: 't', markdown: 'm' }], { tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, - Network accessline 286
[{ url: 'u', title: 't', markdown: 'm' }], { tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, ), - Network accessline 287
{ tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, - Network accessline 294
// Concurrency regression: an env-bridge (set/restore process.env around the // call) corrupts a shared WIGOLO_LLM_PROVIDER when two tier calls overlap — // the second captures the first's mutated 'http://...' as its baseline and - Network accessline 295
// call) corrupts a shared WIGOLO_LLM_PROVIDER when two tier calls overlap — // the second captures the first's mutated 'http://...' as its baseline and // restores THAT, durably rerouting the process cloud->local. The additive - Network accessline 296
// the second captures the first's mutated 'http://...' as its baseline and - Network accessline 320
'q', [{ url: 'u', title: 't', markdown: 'm' }], { tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, - Network accessline 321
[{ url: 'u', title: 't', markdown: 'm' }], { tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, ); - Network accessline 322
{ tier: { endpoint: 'http://localhost:9999', model: 'm1' } }, - Access to secretsline 340
[Credential-related source omitted] - Access to secretsline 348
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Access to secretsline 350
[Credential-related source omitted] - Access to secretsline 351
[Credential-related source omitted] - Access to secretsline 353
[Credential-related source omitted] - Access to secretsline 377
[Credential-related source omitted] - Access to secretsline 379
[Credential-related source omitted] - Access to secretsline 381
[Credential-related source omitted] - Access to secretsline 384
[Credential-related source omitted] - Access to secretsline 393
[Credential-related source omitted] - Access to secretsline 396
[Credential-related source omitted]
tests/unit/research/synthesize.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
function makeSource(overrides: Partial<ResearchSource> = {}): ResearchSource { return { url: overrides.url ?? 'https://example.com/article', - Network accessline 6
return { url: overrides.url ?? 'https://example.com/article', title: overrides.title ?? 'Test Article', - Network accessline 7
url: overrides.url ?? 'https://example.com/article', - Network accessline 22
it('produces a report from multiple sources', async () => { const sources: ResearchSource[] = [ makeSource({ title: 'React Hooks Guide', url: 'https://react.dev/hooks', markdown_content: 'React Hooks allow function components - Network accessline 23
const sources: ResearchSource[] = [ makeSource({ title: 'React Hooks Guide', url: 'https://react.dev/hooks', markdown_content: 'React Hooks allow function components to manage state.' }), makeSource({ title: 'Vue Composition - Network accessline 24
makeSource({ title: 'React Hooks Guide', url: 'https://react.dev/hooks', markdown_content: 'React Hooks allow function components to manage state.' }), - Network accessline 25
makeSource({ title: 'Vue Composition API', url: 'https://vuejs.org/guide', markdown_content: 'Vue 3 introduces the Composition API for better code organization.' }), - Network accessline 39
it('includes citations with correct indices', async () => { const sources: ResearchSource[] = [ makeSource({ title: 'Source A', url: 'https://a.com' }), - Network accessline 40
const sources: ResearchSource[] = [ makeSource({ title: 'Source A', url: 'https://a.com' }), makeSource({ title: 'Source B', url: 'https://b.com' }), - Network accessline 41
makeSource({ title: 'Source A', url: 'https://a.com' }), - Network accessline 42
makeSource({ title: 'Source B', url: 'https://b.com' }), - Network accessline 43
makeSource({ title: 'Source C', url: 'https://c.com' }), - Network accessline 91
makeSource({ title: `Source ${i}`, url: `https://example.com/${i}`, - Network accessline 92
title: `Source ${i}`, url: `https://example.com/${i}`, markdown_content: `Content for source ${i}. `.repeat(50), - Network accessline 93
url: `https://example.com/${i}`, - Network accessline 121
content: { type: 'text', text: '## Research Report\n\nReact and Vue take different approaches to state management. React uses hooks [1] while Vue uses the Composition API [2].\n\n### Sources\n[1] https://react.dev\n[ - Network accessline 122
type: 'text', text: '## Research Report\n\nReact and Vue take different approaches to state management. React uses hooks [1] while Vue uses the Composition API [2].\n\n### Sources\n[1] https://react.dev\n[2] https://vuejs.org', - Network accessline 123
text: '## Research Report\n\nReact and Vue take different approaches to state management. React uses hooks [1] while Vue uses the Composition API [2].\n\n### Sources\n[1] https://react.dev\n[2] https://vuejs.org', - Network accessline 128
const sources: ResearchSource[] = [ makeSource({ title: 'React Hooks', url: 'https://react.dev', markdown_content: 'Hooks content' }), - Network accessline 129
makeSource({ title: 'React Hooks', url: 'https://react.dev', markdown_content: 'Hooks content' }), - Network accessline 130
makeSource({ title: 'Vue Guide', url: 'https://vuejs.org', markdown_content: 'Vue content' }), - Network accessline 190
makeSource({ title: `Source ${i}`, url: `https://example.com/${i}`, - Network accessline 191
title: `Source ${i}`, url: `https://example.com/${i}`, markdown_content: 'x'.repeat(5000), - Network accessline 192
url: `https://example.com/${i}`, - Network accessline 207
it('produces formatted report with source blocks', () => { const sources: ResearchSource[] = [ makeSource({ title: 'Source A', url: 'https://a.com', markdown_content: 'Content A here.' }), - Network accessline 208
const sources: ResearchSource[] = [ makeSource({ title: 'Source A', url: 'https://a.com', markdown_content: 'Content A here.' }), makeSource({ title: 'Source B', url: 'https://b.com', markdown_content: 'Content B here.' }), - Network accessline 209
makeSource({ title: 'Source A', url: 'https://a.com', markdown_content: 'Content A here.' }), - Network accessline 210
makeSource({ title: 'Source B', url: 'https://b.com', markdown_content: 'Content B here.' }), - Network accessline 215
expect(report).toContain('Test question'); expect(report).toContain('Source A'); expect(report).toContain('https://a.com'); - Network accessline 216
expect(report).toContain('Source A'); expect(report).toContain('https://a.com'); expect(report).toContain('Content A here'); - Network accessline 217
expect(report).toContain('https://a.com');
tests/unit/response-time.test.ts
- Executable scriptline 1
Executable file - Network accessline 71
it('SearchOutput carries a non-negative response_time_ms', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 72
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 73
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]),
tests/unit/search/answer-fallback.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
const results: SearchResultItem[] = [ { title: 'Doc A', url: 'https://a.example/1', snippet: 'short A', - Network accessline 15
{ title: 'Doc A', url: 'https://a.example/1', snippet: 'short A', relevance_score: 0.9, - Network accessline 16
title: 'Doc A', url: 'https://a.example/1', snippet: 'short A', - Network accessline 19
}, { title: 'Doc B', url: 'https://b.example/2', snippet: 'short B', - Network accessline 20
{ title: 'Doc B', url: 'https://b.example/2', snippet: 'short B', relevance_score: 0.8, - Network accessline 21
title: 'Doc B', url: 'https://b.example/2', snippet: 'short B', - Network accessline 30
expect(out.answer).toContain('Doc B'); expect(out.citations).toHaveLength(2); expect(out.citations[0]).toMatchObject({ index: 1, url: 'https://a.example/1', title: 'Doc A' }); - Network accessline 31
expect(out.citations).toHaveLength(2); expect(out.citations[0]).toMatchObject({ index: 1, url: 'https://a.example/1', title: 'Doc A' }); expect(out.citations[1]).toMatchObject({ index: 2, url: 'https://b.example/2', title: 'Doc B' } - Network accessline 32
expect(out.citations[0]).toMatchObject({ index: 1, url: 'https://a.example/1', title: 'Doc A' }); - Network accessline 33
expect(out.citations[1]).toMatchObject({ index: 2, url: 'https://b.example/2', title: 'Doc B' }); - Network accessline 37
const results: SearchResultItem[] = [ { title: 'S1', url: 'https://s.example/1', snippet: 'This is the snippet.', - Network accessline 38
{ title: 'S1', url: 'https://s.example/1', snippet: 'This is the snippet.', relevance_score: 0.7, - Network accessline 39
title: 'S1', url: 'https://s.example/1', snippet: 'This is the snippet.', - Network accessline 49
const results: SearchResultItem[] = Array.from({ length: 10 }, (_, i) => ({ title: `T${i + 1}`, url: `https://e.com/${i + 1}`, - Network accessline 50
title: `T${i + 1}`, url: `https://e.com/${i + 1}`, snippet: `snippet ${i + 1}`, - Network accessline 51
url: `https://e.com/${i + 1}`, - Network accessline 62
it('skips sources with empty content and snippet', () => { const results: SearchResultItem[] = [ { title: 'OK', url: 'https://ok.example/1', snippet: 'good', relevance_score: 0.9, markdown_content: 'ok body' }, - Network accessline 63
const results: SearchResultItem[] = [ { title: 'OK', url: 'https://ok.example/1', snippet: 'good', relevance_score: 0.9, markdown_content: 'ok body' }, { title: 'Empty', url: 'https://x.example/2', snippet: '', relevance_score: - Network accessline 64
{ title: 'OK', url: 'https://ok.example/1', snippet: 'good', relevance_score: 0.9, markdown_content: 'ok body' }, - Network accessline 65
{ title: 'Empty', url: 'https://x.example/2', snippet: '', relevance_score: 0.8, markdown_content: '' },
tests/unit/search/answer-synthesis-quota.test.ts
- Executable scriptline 1
Executable file - Network accessline 7
return { title: overrides.title ?? 'PostgreSQL 18 Release', url: overrides.url ?? 'https://www.postgresql.org/docs/18/release-18.html', - Network accessline 8
title: overrides.title ?? 'PostgreSQL 18 Release', url: overrides.url ?? 'https://www.postgresql.org/docs/18/release-18.html', snippet: overrides.snippet ?? 'PG 18 introduces async I/O and UUIDv7', - Network accessline 9
url: overrides.url ?? 'https://www.postgresql.org/docs/18/release-18.html', - Access to secretsline 24
[Credential-related source omitted]
tests/unit/search/answer-synthesis.provider-priority.test.ts
- Executable scriptline 1
Executable file - Network accessline 7
return { title: overrides.title ?? 'PostgreSQL 18 Release', url: overrides.url ?? 'https://www.postgresql.org/docs/18/release-18.html', - Network accessline 8
title: overrides.title ?? 'PostgreSQL 18 Release', url: overrides.url ?? 'https://www.postgresql.org/docs/18/release-18.html', snippet: overrides.snippet ?? 'PG 18 introduces async I/O and UUIDv7', - Network accessline 9
url: overrides.url ?? 'https://www.postgresql.org/docs/18/release-18.html', - Access to secretsline 41
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 95
[Credential-related source omitted]
tests/unit/search/answer-synthesis.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
return { title: overrides.title ?? 'Test Title', url: overrides.url ?? 'https://example.com', - Network accessline 34
title: overrides.title ?? 'Test Title', url: overrides.url ?? 'https://example.com', snippet: overrides.snippet ?? 'A test snippet', - Network accessline 35
url: overrides.url ?? 'https://example.com', - Network accessline 47
makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', - Network accessline 48
title: 'React Hooks', url: 'https://react.dev/hooks', markdown_content: 'Hooks let you use state and other features.', - Network accessline 49
url: 'https://react.dev/hooks', - Network accessline 52
makeResult({ title: 'Vue Guide', url: 'https://vuejs.org/guide', - Network accessline 53
title: 'Vue Guide', url: 'https://vuejs.org/guide', markdown_content: 'The Composition API provides reactive features.', - Network accessline 54
url: 'https://vuejs.org/guide', - Network accessline 61
expect(text).toContain('[1] React Hooks (https://react.dev/hooks)'); - Network accessline 62
expect(text).toContain('Hooks let you use state'); expect(text).toContain('[2] Vue Guide (https://vuejs.org/guide)'); expect(text).toContain('Composition API'); - Network accessline 63
expect(text).toContain('[2] Vue Guide (https://vuejs.org/guide)'); - Network accessline 70
makeResult({ title: 'No Content', url: 'https://no.com', - Network accessline 71
title: 'No Content', url: 'https://no.com', markdown_content: undefined, - Network accessline 72
url: 'https://no.com', - Network accessline 76
makeResult({ title: 'Has Content', url: 'https://has.com', - Network accessline 77
title: 'Has Content', url: 'https://has.com', markdown_content: 'Some useful content here.', - Network accessline 78
url: 'https://has.com', - Network accessline 91
makeResult({ title: 'Snippet Only', url: 'https://snippet.com', - Network accessline 92
title: 'Snippet Only', url: 'https://snippet.com', snippet: 'This is the fallback snippet text.', - Network accessline 93
url: 'https://snippet.com', - Network accessline 106
makeResult({ title: 'Long', url: 'https://long.com', - Network accessline 107
title: 'Long', url: 'https://long.com', markdown_content: 'x'.repeat(5000), - Network accessline 108
url: 'https://long.com', - Network accessline 134
makeResult({ title: `Result ${i}`, url: `https://example.com/${i}`, - Network accessline 135
title: `Result ${i}`, url: `https://example.com/${i}`, markdown_content: `Content for result ${i} with some detail.`, - Network accessline 136
url: `https://example.com/${i}`, - Network accessline 177
it('extracts citation indices from answer text', () => { const results: SearchResultItem[] = [ makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'Hooks info' }), - Network accessline 178
const results: SearchResultItem[] = [ makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'Hooks info' }), makeResult({ title: 'Vue Guide', url: 'https://vuejs.org/guide', snippet: 'Vue info' }), - Network accessline 179
makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'Hooks info' }), - Network accessline 180
makeResult({ title: 'Vue Guide', url: 'https://vuejs.org/guide', snippet: 'Vue info' }), - Network accessline 181
makeResult({ title: 'Svelte', url: 'https://svelte.dev', snippet: 'Svelte info' }), - Network accessline 188
expect(citations[0]).toEqual({ index: 1, url: 'https://react.dev/hooks', - Network accessline 189
index: 1, url: 'https://react.dev/hooks', title: 'React Hooks', - Network accessline 190
url: 'https://react.dev/hooks', - Network accessline 194
expect(citations[1]).toEqual({ index: 2, url: 'https://vuejs.org/guide', - Network accessline 195
index: 2, url: 'https://vuejs.org/guide', title: 'Vue Guide', - Network accessline 196
url: 'https://vuejs.org/guide', - Network accessline 208
it('handles duplicate citation references', () => { const results = [ makeResult({ title: 'A', url: 'https://a.com', snippet: 'A info' }), - Network accessline 209
const results = [ makeResult({ title: 'A', url: 'https://a.com', snippet: 'A info' }), ]; - Network accessline 210
makeResult({ title: 'A', url: 'https://a.com', snippet: 'A info' }), - Network accessline 220
it('ignores out-of-range citation indices', () => { const results = [ makeResult({ title: 'Only', url: 'https://only.com', snippet: 'Only result' }), - Network accessline 221
const results = [ makeResult({ title: 'Only', url: 'https://only.com', snippet: 'Only result' }), ]; - Network accessline 222
makeResult({ title: 'Only', url: 'https://only.com', snippet: 'Only result' }), - Network accessline 232
it('extracts citations with various formats', () => { const results = [ makeResult({ title: 'A', url: 'https://a.com', snippet: 'A' }), - Network accessline 233
const results = [ makeResult({ title: 'A', url: 'https://a.com', snippet: 'A' }), makeResult({ title: 'B', url: 'https://b.com', snippet: 'B' }), - Network accessline 234
makeResult({ title: 'A', url: 'https://a.com', snippet: 'A' }), - Network accessline 235
makeResult({ title: 'B', url: 'https://b.com', snippet: 'B' }), - Network accessline 253
it('handles results with missing snippet gracefully', () => { const results = [ makeResult({ title: 'No Snippet', url: 'https://ns.com', snippet: '' }), - Network accessline 254
const results = [ makeResult({ title: 'No Snippet', url: 'https://ns.com', snippet: '' }), ]; - Network accessline 255
makeResult({ title: 'No Snippet', url: 'https://ns.com', snippet: '' }), - Network accessline 278
makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', - Network accessline 279
title: 'React Hooks', url: 'https://react.dev/hooks', markdown_content: 'Hooks let you use state and other features.', - Network accessline 280
url: 'https://react.dev/hooks', - Network accessline 297
makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', - Network accessline 298
title: 'React Hooks', url: 'https://react.dev/hooks', markdown_content: 'Hooks content.', - Network accessline 299
url: 'https://react.dev/hooks', - Network accessline 354
makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', - Network accessline 355
title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'Hooks in React', - Network accessline 356
url: 'https://react.dev/hooks', - Network accessline 360
makeResult({ title: 'Vue Composition', url: 'https://vuejs.org/composition', - Network accessline 361
title: 'Vue Composition', url: 'https://vuejs.org/composition', snippet: 'Vue composition API', - Network accessline 362
url: 'https://vuejs.org/composition', - Network accessline 370
expect(output.citations).toBeDefined(); expect(output.citations!.length).toBe(2); expect(output.citations![0].url).toBe('https://react.dev/hooks'); - Network accessline 371
expect(output.citations!.length).toBe(2); expect(output.citations![0].url).toBe('https://react.dev/hooks'); expect(output.citations![1].url).toBe('https://vuejs.org/composition'); - Network accessline 372
expect(output.citations![0].url).toBe('https://react.dev/hooks'); - Network accessline 373
expect(output.citations![1].url).toBe('https://vuejs.org/composition'); - Network accessline 437
it('level 2: heuristic fallback when no sampling server but results exist', async () => { const results = [ { url: 'https://a', title: 'A', snippet: 'aa', markdown_content: 'A long body about postgres replication...' }, - Network accessline 438
const results = [ { url: 'https://a', title: 'A', snippet: 'aa', markdown_content: 'A long body about postgres replication...' }, ] as SearchResultItem[]; - Network accessline 439
{ url: 'https://a', title: 'A', snippet: 'aa', markdown_content: 'A long body about postgres replication...' }, - Network accessline 455
it('level 3: evidence dump when content is too sparse for bullets', async () => { const results = [ { url: 'https://a', title: 'A', snippet: '', markdown_content: '' }, - Network accessline 456
const results = [ { url: 'https://a', title: 'A', snippet: '', markdown_content: '' }, { url: 'https://b', title: 'B', snippet: '', markdown_content: '' }, - Network accessline 457
{ url: 'https://a', title: 'A', snippet: '', markdown_content: '' }, - Network accessline 458
{ url: 'https://b', title: 'B', snippet: '', markdown_content: '' }, - Network accessline 492
makeResult({ title: 'Source One', url: 'https://a.example/one', - Network accessline 493
title: 'Source One', url: 'https://a.example/one', snippet: 'first source', - Network accessline 494
url: 'https://a.example/one', - Network accessline 524
makeResult({ title: 'Source One', url: 'https://a.example/one', - Network accessline 525
title: 'Source One', url: 'https://a.example/one', snippet: 'first', - Network accessline 526
url: 'https://a.example/one', - Network accessline 573
makeResult({ title: 'Streaming Replication', url: 'https://postgres.example/streaming', - Network accessline 574
title: 'Streaming Replication', url: 'https://postgres.example/streaming', snippet: 'WAL streaming overview', - Network accessline 575
url: 'https://postgres.example/streaming', - Network accessline 579
makeResult({ title: 'Logical Replication', url: 'https://postgres.example/logical', - Network accessline 580
title: 'Logical Replication', url: 'https://postgres.example/logical', snippet: 'Logical replication overview', - Network accessline 581
url: 'https://postgres.example/logical', - Network accessline 601
expect(out.data.citations[0]).toEqual<Citation>({ index: 1, url: 'https://postgres.example/streaming', - Network accessline 602
index: 1, url: 'https://postgres.example/streaming', title: 'Streaming Replication', - Network accessline 603
url: 'https://postgres.example/streaming', - Network accessline 607
expect(out.data.citations[1]).toEqual<Citation>({ index: 2, url: 'https://postgres.example/logical', - Network accessline 608
index: 2, url: 'https://postgres.example/logical', title: 'Logical Replication', - Network accessline 609
url: 'https://postgres.example/logical',
tests/unit/search/authority-boost.aliases.test.ts
- Executable scriptline 1
Executable file - Network accessline 17
it('boosts postgresql.org and neon.tech when query uses "PG" abbreviation', () => { const results = [ r('https://www.w3schools.com/sql/sql_uuid.asp'), - Network accessline 18
const results = [ r('https://www.w3schools.com/sql/sql_uuid.asp'), r('https://www.postgresql.org/docs/18/release-18.html'), - Network accessline 19
r('https://www.w3schools.com/sql/sql_uuid.asp'), - Network accessline 20
r('https://www.postgresql.org/docs/18/release-18.html'), - Network accessline 21
r('https://neon.tech/blog/pg18-async-io'), - Network accessline 31
it('matches numeric-suffix subject tokens to base alias (pg18 → pg)', () => { const results = [ r('https://neon.tech/postgres-18-features'), - Network accessline 32
const results = [ r('https://neon.tech/postgres-18-features'), r('https://random-blog.example.com/postgres-18'), - Network accessline 33
r('https://neon.tech/postgres-18-features'), - Network accessline 34
r('https://random-blog.example.com/postgres-18'), - Network accessline 42
it('only applies generic TLD nudge on unrelated queries (no subject boost)', () => { const results = [r('https://www.postgresql.org/')]; - Network accessline 43
const results = [r('https://www.postgresql.org/')];
tests/unit/search/authority-boost.cap.test.ts
- Executable scriptline 1
Executable file - Network accessline 4
describe('applyAuthorityBoost capUrls', () => { it('caps generic-domain authority for a URL in the rare-term-miss set', () => { const results = [{ url: 'https://sqlite.org/', relevance_score: 0.5 }]; - Network accessline 5
it('caps generic-domain authority for a URL in the rare-term-miss set', () => { const results = [{ url: 'https://sqlite.org/', relevance_score: 0.5 }]; const normal = applyAuthorityBoost('sqlite vec', results)[0].relevance_score; - Network accessline 6
const results = [{ url: 'https://sqlite.org/', relevance_score: 0.5 }]; - Network accessline 7
const normal = applyAuthorityBoost('sqlite vec', results)[0].relevance_score; const capped = applyAuthorityBoost('sqlite vec', results, { capUrls: new Set(['https://sqlite.org/']), - Network accessline 8
const capped = applyAuthorityBoost('sqlite vec', results, { capUrls: new Set(['https://sqlite.org/']), })[0].relevance_score; - Network accessline 9
capUrls: new Set(['https://sqlite.org/']), - Network accessline 14
it('does NOT cap a URL absent from the miss set (a rare-term hit)', () => { const results = [{ url: 'https://sqlite.org/', relevance_score: 0.5 }]; - Network accessline 15
const results = [{ url: 'https://sqlite.org/', relevance_score: 0.5 }]; - Network accessline 16
const normal = applyAuthorityBoost('sqlite vec', results)[0].relevance_score; const uncapped = applyAuthorityBoost('sqlite vec', results, { capUrls: new Set(['https://other.example/']), - Network accessline 17
const uncapped = applyAuthorityBoost('sqlite vec', results, { capUrls: new Set(['https://other.example/']), })[0].relevance_score; - Network accessline 18
capUrls: new Set(['https://other.example/']), - Network accessline 23
it('leaves a known-subject exact-match domain unaffected even when in the miss set', () => { const results = [{ url: 'https://react.dev/reference', relevance_score: 0.5 }]; - Network accessline 24
const results = [{ url: 'https://react.dev/reference', relevance_score: 0.5 }]; - Network accessline 25
const normal = applyAuthorityBoost('react hooks', results)[0].relevance_score; const capped = applyAuthorityBoost('react hooks', results, { capUrls: new Set(['https://react.dev/reference']), - Network accessline 26
const capped = applyAuthorityBoost('react hooks', results, { capUrls: new Set(['https://react.dev/reference']), })[0].relevance_score; - Network accessline 27
capUrls: new Set(['https://react.dev/reference']),
tests/unit/search/brand-collision-warning.test.ts
- Executable scriptline 1
Executable file - Network accessline 71
describe('detectBrandCollision (sub-ticket 3.12)', () => { it('returns null when query is not a common noun', () => { expect(detectBrandCollision('next.js server actions', ['https://www.next.co.uk'])).toBeNull(); - Network accessline 72
it('returns null when query is not a common noun', () => { expect(detectBrandCollision('next.js server actions', ['https://www.next.co.uk'])).toBeNull(); }); - Network accessline 73
expect(detectBrandCollision('next.js server actions', ['https://www.next.co.uk'])).toBeNull(); - Network accessline 76
it('returns null when top-3 has no brand domain', () => { expect(detectBrandCollision('next', ['https://nextjs.org/docs'])).toBeNull(); - Network accessline 77
expect(detectBrandCollision('next', ['https://nextjs.org/docs'])).toBeNull(); - Network accessline 80
it('detects brand collision when query is "next" and top-3 includes next.co.uk', () => { const w = detectBrandCollision('next', [ 'https://www.next.co.uk/women', - Network accessline 81
const w = detectBrandCollision('next', [ 'https://www.next.co.uk/women', 'https://nextjs.org/docs', - Network accessline 82
'https://www.next.co.uk/women', - Network accessline 83
'https://nextjs.org/docs', - Network accessline 92
it('handles boutique TLD too', () => { const w = detectBrandCollision('best', [ 'https://example.boutique/x', - Network accessline 93
const w = detectBrandCollision('best', [ 'https://example.boutique/x', ]); - Network accessline 94
'https://example.boutique/x', - Network accessline 103
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://www.next.co.uk/women'), - Network accessline 104
makeEntry('bing', [ makeResult('bing', 'https://www.next.co.uk/women'), makeResult('bing', 'https://nextjs.org/docs'), - Network accessline 105
makeResult('bing', 'https://www.next.co.uk/women'), - Network accessline 106
makeResult('bing', 'https://nextjs.org/docs'), - Network accessline 120
it('omits warning when no brand collision detected', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs')]), - Network accessline 121
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs')]), ]; - Network accessline 122
makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs')]), - Network accessline 142
it('emits a warning when the query is the popular React hook "useState"', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 143
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 144
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 158
it('does NOT warn on a unique, made-up term', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 159
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 160
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 236
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/phoenix-a'), - Network accessline 237
makeEntry('bing', [ makeResult('bing', 'https://example.com/phoenix-a'), makeResult('bing', 'https://example.com/phoenix-b'), - Network accessline 238
makeResult('bing', 'https://example.com/phoenix-a'), - Network accessline 239
makeResult('bing', 'https://example.com/phoenix-b'), - Network accessline 240
makeResult('bing', 'https://example.com/phoenix-c'), - Network accessline 264
it('does NOT add an entity variant for a capitalized-head query with no generic tail', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 265
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 266
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 283
it('does NOT add an entity variant nor warn for a plain proper-noun-lead prose query', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 284
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 285
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 300
it('does NOT add an entity variant nor warn for a sentence-lead question', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 301
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 302
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]),
tests/unit/search/burst-cascade.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/content-fetch.test.ts
- Executable scriptline 1
Executable file - Network accessline 72
} as unknown as SmartRouter; const results = [ makeResult('https://a.com/1'), - Network accessline 73
const results = [ makeResult('https://a.com/1'), makeResult('https://a.com/2'), - Network accessline 74
makeResult('https://a.com/1'), - Network accessline 75
makeResult('https://a.com/2'), - Network accessline 76
makeResult('https://a.com/3'), - Network accessline 110
} as unknown as SmartRouter; const results = [ makeResult('https://a.com/1'), - Network accessline 111
const results = [ makeResult('https://a.com/1'), makeResult('https://a.com/2'), - Network accessline 112
makeResult('https://a.com/1'), - Network accessline 113
makeResult('https://a.com/2'), - Network accessline 140
} as unknown as SmartRouter; const results = [ makeResult('https://a.com/top-1'), - Network accessline 141
const results = [ makeResult('https://a.com/top-1'), makeResult('https://a.com/top-2'), - Network accessline 142
makeResult('https://a.com/top-1'), - Network accessline 143
makeResult('https://a.com/top-2'), - Network accessline 144
makeResult('https://a.com/backup-3'), - Network accessline 173
} as unknown as SmartRouter; const results = [ makeResult('https://a.com/top-1'), - Network accessline 174
const results = [ makeResult('https://a.com/top-1'), makeResult('https://a.com/top-2'), - Network accessline 175
makeResult('https://a.com/top-1'), - Network accessline 176
makeResult('https://a.com/top-2'), - Network accessline 177
makeResult('https://a.com/backup-3'), - Network accessline 178
makeResult('https://a.com/backup-4'), - Network accessline 209
} as unknown as SmartRouter; const results = [ makeResult('https://a.com/top-1'), - Network accessline 210
const results = [ makeResult('https://a.com/top-1'), makeResult('https://a.com/top-2'), - Network accessline 211
makeResult('https://a.com/top-1'), - Network accessline 212
makeResult('https://a.com/top-2'), - Network accessline 213
makeResult('https://a.com/backup-3'), - Network accessline 254
const cap = 5; const results: SearchResultItem[] = []; for (let i = 0; i < cap; i++) results.push(makeResult(`https://a.com/top-${i}`)); - Network accessline 255
const results: SearchResultItem[] = []; for (let i = 0; i < cap; i++) results.push(makeResult(`https://a.com/top-${i}`)); for (let i = 0; i < cap; i++) results.push(makeResult(`https://a.com/backup-${i}`)); - Network accessline 256
for (let i = 0; i < cap; i++) results.push(makeResult(`https://a.com/top-${i}`)); - Network accessline 257
for (let i = 0; i < cap; i++) results.push(makeResult(`https://a.com/backup-${i}`)); - Network accessline 304
const cap = 3; const results: SearchResultItem[] = [ makeResult('https://a.com/top-0'), - Network accessline 305
const results: SearchResultItem[] = [ makeResult('https://a.com/top-0'), makeResult('https://a.com/top-1'), - Network accessline 306
makeResult('https://a.com/top-0'), - Network accessline 307
makeResult('https://a.com/top-1'), - Network accessline 308
makeResult('https://a.com/top-2'), - Network accessline 309
makeResult('https://a.com/backup-0'), // fails - Network accessline 310
makeResult('https://a.com/backup-1'), // fails - Network accessline 311
makeResult('https://a.com/backup-2'), // succeeds - Network accessline 312
makeResult('https://a.com/backup-3'), // succeeds - Network accessline 313
makeResult('https://a.com/backup-4'), // succeeds - Network accessline 503
it('gives a known anti-bot/TLS-first domain (stackoverflow.com) the larger budget so a ~3.5s attempt completes', async () => { vi.useFakeTimers(); const url = 'https://stackoverflow.com/questions/123/x'; - Network accessline 504
vi.useFakeTimers(); const url = 'https://stackoverflow.com/questions/123/x'; const router = mockRouter(slowFetch(3500, url)); - Network accessline 505
const url = 'https://stackoverflow.com/questions/123/x'; - Network accessline 517
it('keeps a non-anti-bot domain on the SMALL budget — a ~3.5s attempt still times out at fetchTimeoutMs', async () => { vi.useFakeTimers(); const url = 'https://example.com/article'; - Network accessline 518
vi.useFakeTimers(); const url = 'https://example.com/article'; const router = mockRouter(slowFetch(3500, url)); - Network accessline 519
const url = 'https://example.com/article'; - Network accessline 531
it('keeps the OVERALL stage bounded — anti-bot per-URL budget never exceeds the stage budget (latency ceiling)', async () => { vi.useFakeTimers(); const url = 'https://stackoverflow.com/questions/456/y'; - Network accessline 533
const url = 'https://stackoverflow.com/questions/456/y'; - Network accessline 597
const urls = ['https://example.com/a', 'https://example.com/b']; - Network accessline 613
const url = 'https://example.com/wide'; - Network accessline 628
const url = 'https://example.com/single'; - Network accessline 640
it('back-compat: no narrowSetBudgetMs => small base budget regardless of candidate count', async () => { vi.useFakeTimers(); const url = 'https://example.com/legacy'; - Network accessline 641
vi.useFakeTimers(); const url = 'https://example.com/legacy'; const router = mockRouter(slowFetch(3000, url)); - Network accessline 642
const url = 'https://example.com/legacy'; - Network accessline 684
new Promise((_, rej) => opts.signal?.addEventListener('abort', () => rej(opts.signal!.reason))), ); const results = [item('https://example.com/slow', 'This snippet is real evidence text.')]; - Network accessline 685
); const results = [item('https://example.com/slow', 'This snippet is real evidence text.')]; const p = fetchContentForResults(results, router, ctx()); - Network accessline 686
const results = [item('https://example.com/slow', 'This snippet is real evidence text.')]; - Network accessline 719
new Promise((_, rej) => opts.signal?.addEventListener('abort', () => rej(opts.signal!.reason))), ); const results = [item('https://example.com/slow', 'unused snippet')]; - Network accessline 720
); const results = [item('https://example.com/slow', 'unused snippet')]; const p = fetchContentForResults(results, router, ctx({ snippetFallback: undefined })); - Network accessline 721
const results = [item('https://example.com/slow', 'unused snippet')]; - Network accessline 730
it('does NOT promote a snippet on a non-timeout failure (only timeouts fall back)', async () => { const router = mockRouter(async () => { throw new Error('403 blocked'); }); const results = [item('https://example.com/blocked', 'shou - Network accessline 731
const router = mockRouter(async () => { throw new Error('403 blocked'); }); const results = [item('https://example.com/blocked', 'should not be used')]; await fetchContentForResults(results, router, ctx()); - Network accessline 732
const results = [item('https://example.com/blocked', 'should not be used')]; - Network accessline 742
new Promise((_, rej) => opts.signal?.addEventListener('abort', () => rej(opts.signal!.reason))), ); const results = [item('https://example.com/slow', '')]; - Network accessline 743
); const results = [item('https://example.com/slow', '')]; const p = fetchContentForResults(results, router, ctx()); - Network accessline 744
const results = [item('https://example.com/slow', '')]; - Network accessline 792
it('forces renderJs:always for a NARROW set (candidateCount <= maxCandidates) so the SPA is rendered', async () => { const { router, renderModes } = captureRouter(); const results = [item('https://docs.example.com/a'), item('https:/ - Network accessline 793
const { router, renderModes } = captureRouter(); const results = [item('https://docs.example.com/a'), item('https://docs.example.com/b')]; await fetchContentForResults(results, router, baseCtx({ - Network accessline 794
const results = [item('https://docs.example.com/a'), item('https://docs.example.com/b')]; - Network accessline 804
it('keeps renderJs:auto for a WIDE set (candidateCount > maxCandidates) — fast path unchanged', async () => { const { router, renderModes } = captureRouter(); const results = Array.from({ length: 5 }, (_, i) => item(`https://docs.ex - Network accessline 805
const { router, renderModes } = captureRouter(); const results = Array.from({ length: 5 }, (_, i) => item(`https://docs.example.com/${i}`)); await fetchContentForResults(results, router, baseCtx({ - Network accessline 806
const results = Array.from({ length: 5 }, (_, i) => item(`https://docs.example.com/${i}`)); - Network accessline 815
it('keeps renderJs:auto when renderNarrowSet is absent regardless of candidate count (legacy path)', async () => { const { router, renderModes } = captureRouter(); const results = [item('https://docs.example.com/a'), item('https://d - Network accessline 816
const { router, renderModes } = captureRouter(); const results = [item('https://docs.example.com/a'), item('https://docs.example.com/b')]; await fetchContentForResults(results, router, baseCtx({ candidateCount: 2 })); - Network accessline 817
const results = [item('https://docs.example.com/a'), item('https://docs.example.com/b')]; - Network accessline 830
} as unknown as SmartRouter; const results: SearchResultItem[] = [ { title: 't', url: 'https://docs.example.com/slow', snippet: 'real snippet evidence', relevance_score: 1 }, - Network accessline 831
const results: SearchResultItem[] = [ { title: 't', url: 'https://docs.example.com/slow', snippet: 'real snippet evidence', relevance_score: 1 }, ]; - Network accessline 832
{ title: 't', url: 'https://docs.example.com/slow', snippet: 'real snippet evidence', relevance_score: 1 },
tests/unit/search/context-formatter.test.ts
- Executable scriptline 1
Executable file - Network accessline 6
return { title: overrides.title ?? 'Test Title', url: overrides.url ?? 'https://example.com', - Network accessline 7
title: overrides.title ?? 'Test Title', url: overrides.url ?? 'https://example.com', snippet: overrides.snippet ?? 'A test snippet', - Network accessline 8
url: overrides.url ?? 'https://example.com', - Network accessline 20
makeResult({ title: 'React Hooks', url: 'https://react.dev/hooks', - Network accessline 21
title: 'React Hooks', url: 'https://react.dev/hooks', markdown_content: 'React Hooks let you use state and other features without classes.', - Network accessline 22
url: 'https://react.dev/hooks', - Network accessline 25
makeResult({ title: 'Vue Composition API', url: 'https://vuejs.org/api', - Network accessline 26
title: 'Vue Composition API', url: 'https://vuejs.org/api', markdown_content: 'The Composition API is a set of function-based APIs.', - Network accessline 27
url: 'https://vuejs.org/api', - Network accessline 30
makeResult({ title: 'Svelte Stores', url: 'https://svelte.dev/stores', - Network accessline 31
title: 'Svelte Stores', url: 'https://svelte.dev/stores', markdown_content: 'Svelte stores provide reactive state management.', - Network accessline 32
url: 'https://svelte.dev/stores', - Network accessline 39
expect(text).toContain('Source: React Hooks (https://react.dev/hooks)'); - Network accessline 40
expect(text).toContain('React Hooks let you use state'); expect(text).toContain('Source: Vue Composition API (https://vuejs.org/api)'); expect(text).toContain('Source: Svelte Stores (https://svelte.dev/stores)'); - Network accessline 41
expect(text).toContain('Source: Vue Composition API (https://vuejs.org/api)'); - Network accessline 42
expect(text).toContain('Source: Svelte Stores (https://svelte.dev/stores)'); - Network accessline 56
makeResult({ title: 'Long', url: 'https://example.com/long', - Network accessline 57
title: 'Long', url: 'https://example.com/long', markdown_content: 'a'.repeat(5000), - Network accessline 58
url: 'https://example.com/long', - Network accessline 65
expect(text).toContain('Source: Long (https://example.com/long)'); - Network accessline 72
makeResult({ title: 'First', url: 'https://a.com', - Network accessline 73
title: 'First', url: 'https://a.com', markdown_content: 'First content here.', - Network accessline 74
url: 'https://a.com', - Network accessline 77
makeResult({ title: 'Second', url: 'https://b.com', - Network accessline 78
title: 'Second', url: 'https://b.com', markdown_content: 'Second content here that is also reasonably long and would push us over budget.', - Network accessline 79
url: 'https://b.com', - Network accessline 84
const headerLen = 'Source: First (https://a.com)\n'.length; - Network accessline 96
makeResult({ title: 'Snippet Only', url: 'https://snippet.com', - Network accessline 97
title: 'Snippet Only', url: 'https://snippet.com', snippet: 'This is the snippet text', - Network accessline 98
url: 'https://snippet.com', - Network accessline 110
makeResult({ title: 'Failed Fetch', url: 'https://failed.com', - Network accessline 111
title: 'Failed Fetch', url: 'https://failed.com', snippet: 'Fallback snippet', - Network accessline 112
url: 'https://failed.com', - Network accessline 125
makeResult({ title: 'Unicode Test', url: 'https://example.com/unicode', - Network accessline 126
title: 'Unicode Test', url: 'https://example.com/unicode', markdown_content: 'React 18 hat viele Verbesserungen.', - Network accessline 127
url: 'https://example.com/unicode', - Network accessline 139
makeResult({ title: longTitle, url: 'https://example.com', - Network accessline 140
title: longTitle, url: 'https://example.com', markdown_content: 'content', - Network accessline 141
url: 'https://example.com', - Network accessline 151
it('handles very long URLs gracefully', () => { const longUrl = 'https://example.com/' + 'path/'.repeat(100); - Network accessline 152
const longUrl = 'https://example.com/' + 'path/'.repeat(100); - Network accessline 165
it('distributes budget across multiple results', () => { const results = [ makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'x'.repeat(200) }), - Network accessline 166
const results = [ makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'x'.repeat(200) }), makeResult({ title: 'B', url: 'https://b.com', markdown_content: 'y'.repeat(200) }), - Network accessline 167
makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'x'.repeat(200) }), - Network accessline 168
makeResult({ title: 'B', url: 'https://b.com', markdown_content: 'y'.repeat(200) }), - Network accessline 169
makeResult({ title: 'C', url: 'https://c.com', markdown_content: 'z'.repeat(200) }), - Network accessline 180
makeResult({ title: 'Only', url: 'https://only.com', - Network accessline 181
title: 'Only', url: 'https://only.com', markdown_content: 'a'.repeat(1000), - Network accessline 182
url: 'https://only.com', - Network accessline 192
it('separates results with double newline', () => { const results = [ makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'first' }), - Network accessline 193
const results = [ makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'first' }), makeResult({ title: 'B', url: 'https://b.com', markdown_content: 'second' }), - Network accessline 194
makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'first' }), - Network accessline 195
makeResult({ title: 'B', url: 'https://b.com', markdown_content: 'second' }), - Network accessline 202
it('produces no trailing whitespace or newlines', () => { const results = [ makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'content' }), - Network accessline 203
const results = [ makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'content' }), ]; - Network accessline 204
makeResult({ title: 'A', url: 'https://a.com', markdown_content: 'content' }), - Network accessline 213
makeResult({ title: 'Empty', url: 'https://empty.com', - Network accessline 214
title: 'Empty', url: 'https://empty.com', snippet: '', - Network accessline 215
url: 'https://empty.com',
tests/unit/search/core/canonical-url.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
describe('canonicalizeUrl — utm + tracking params', () => { it('drops utm_source and utm_medium from the canonical form', () => { const a = canonicalizeUrl('https://foo.com/x?utm_source=bar&utm_medium=newsletter'); - Network accessline 15
it('drops utm_source and utm_medium from the canonical form', () => { const a = canonicalizeUrl('https://foo.com/x?utm_source=bar&utm_medium=newsletter'); const b = canonicalizeUrl('https://foo.com/x'); - Network accessline 16
const a = canonicalizeUrl('https://foo.com/x?utm_source=bar&utm_medium=newsletter'); - Network accessline 17
const b = canonicalizeUrl('https://foo.com/x'); - Network accessline 21
it('drops fbclid and gclid', () => { const a = canonicalizeUrl('https://foo.com/x?fbclid=abc'); - Network accessline 22
const a = canonicalizeUrl('https://foo.com/x?fbclid=abc'); - Network accessline 23
const b = canonicalizeUrl('https://foo.com/x?gclid=def'); - Network accessline 24
const c = canonicalizeUrl('https://foo.com/x'); - Network accessline 29
it('preserves non-tracking query params', () => { const a = canonicalizeUrl('https://foo.com/x?id=42&utm_source=bar'); - Network accessline 30
const a = canonicalizeUrl('https://foo.com/x?id=42&utm_source=bar'); - Network accessline 31
const b = canonicalizeUrl('https://foo.com/x?id=42'); - Network accessline 38
describe('canonicalizeUrl — AMP variants', () => { it('strips trailing /amp/ path segment', () => { expect(canonicalizeUrl('https://foo.com/x/amp/')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 39
it('strips trailing /amp/ path segment', () => { expect(canonicalizeUrl('https://foo.com/x/amp/')).toBe(canonicalizeUrl('https://foo.com/x')); }); - Network accessline 40
expect(canonicalizeUrl('https://foo.com/x/amp/')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 43
it('strips leading /amp/ before the path', () => { expect(canonicalizeUrl('https://foo.com/amp/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 44
expect(canonicalizeUrl('https://foo.com/amp/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 47
it('strips ?amp=1 query parameter', () => { expect(canonicalizeUrl('https://foo.com/x?amp=1')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 48
expect(canonicalizeUrl('https://foo.com/x?amp=1')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 51
it('strips a .amp suffix on the path', () => { expect(canonicalizeUrl('https://foo.com/x.amp')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 52
expect(canonicalizeUrl('https://foo.com/x.amp')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 56
describe('canonicalizeUrl — mobile vs desktop subdomain', () => { it('treats m.foo.com as equivalent to foo.com', () => { expect(canonicalizeUrl('https://m.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 57
it('treats m.foo.com as equivalent to foo.com', () => { expect(canonicalizeUrl('https://m.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); }); - Network accessline 58
expect(canonicalizeUrl('https://m.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 61
it('treats mobile.foo.com as equivalent to foo.com', () => { expect(canonicalizeUrl('https://mobile.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 62
expect(canonicalizeUrl('https://mobile.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 67
expect(canonicalizeUrl('https://docs.foo.com/x')).not.toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 71
describe('canonicalizeUrl — trailing slash + protocol normalization', () => { it('treats trailing-slash and no-trailing-slash as equivalent', () => { expect(canonicalizeUrl('https://foo.com/x/')).toBe(canonicalizeUrl('https://foo.com/ - Network accessline 72
it('treats trailing-slash and no-trailing-slash as equivalent', () => { expect(canonicalizeUrl('https://foo.com/x/')).toBe(canonicalizeUrl('https://foo.com/x')); }); - Network accessline 73
expect(canonicalizeUrl('https://foo.com/x/')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 76
it('treats http and https as equivalent', () => { expect(canonicalizeUrl('http://foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 77
expect(canonicalizeUrl('http://foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 80
it('combines protocol + trailing-slash + utm into a single canonical form', () => { expect(canonicalizeUrl('http://foo.com/x/?utm_source=bar')).toBe( - Network accessline 81
expect(canonicalizeUrl('http://foo.com/x/?utm_source=bar')).toBe( - Network accessline 82
canonicalizeUrl('https://foo.com/x'), - Network accessline 86
it('drops www subdomain', () => { expect(canonicalizeUrl('https://www.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 87
expect(canonicalizeUrl('https://www.foo.com/x')).toBe(canonicalizeUrl('https://foo.com/x')); - Network accessline 91
describe('canonicalizeUrl — negative cases', () => { it('does NOT merge URLs with different paths', () => { expect(canonicalizeUrl('https://foo.com/x')).not.toBe(canonicalizeUrl('https://foo.com/y')); - Network accessline 92
it('does NOT merge URLs with different paths', () => { expect(canonicalizeUrl('https://foo.com/x')).not.toBe(canonicalizeUrl('https://foo.com/y')); }); - Network accessline 93
expect(canonicalizeUrl('https://foo.com/x')).not.toBe(canonicalizeUrl('https://foo.com/y')); - Network accessline 96
it('does NOT merge different hosts', () => { expect(canonicalizeUrl('https://foo.com/x')).not.toBe(canonicalizeUrl('https://bar.com/x')); - Network accessline 97
expect(canonicalizeUrl('https://foo.com/x')).not.toBe(canonicalizeUrl('https://bar.com/x'));
tests/unit/search/core/code-routing.test.ts
- Executable scriptline 1
Executable file - Network accessline 92
makeResult( 'primary-eng', 'https://primary.example.com/page', - Network accessline 93
'primary-eng', 'https://primary.example.com/page', 'Primary doc', - Network accessline 94
'https://primary.example.com/page', - Network accessline 104
makeResult( 'secondary-eng', 'https://secondary.example.com/page', - Network accessline 105
'secondary-eng', 'https://secondary.example.com/page', 'Secondary doc', - Network accessline 106
'https://secondary.example.com/page', - Network accessline 139
makeResult( 'primary-eng', 'https://primary.example.com/different', - Network accessline 140
'primary-eng', 'https://primary.example.com/different', 'Primary doc', - Network accessline 141
'https://primary.example.com/different', - Network accessline 151
makeResult( 'secondary-eng', 'https://secondary.example.com/match', - Network accessline 152
'secondary-eng', 'https://secondary.example.com/match', 'HTML search element semantics landmark', - Network accessline 153
'https://secondary.example.com/match', - Network accessline 174
it('does NOT demote a URL contributed by BOTH a primary and a secondary engine', async () => { const sharedUrl = 'https://docs.example.com/page'; - Network accessline 175
const sharedUrl = 'https://docs.example.com/page'; - Network accessline 194
makeResult( 'primary-eng-2', 'https://other.example.com/other', - Network accessline 195
'primary-eng-2', 'https://other.example.com/other', 'Other doc', - Network accessline 196
'https://other.example.com/other', - Network accessline 210
const sharedIdx = out.results.findIndex((r) => r.url === sharedUrl); const otherIdx = out.results.findIndex((r) => r.url === 'https://other.example.com/other'); - Network accessline 211
const otherIdx = out.results.findIndex((r) => r.url === 'https://other.example.com/other'); - Network accessline 230
makeResult( 'bing', 'https://caddyserver.com/docs/reverse-proxy', - Network accessline 231
'bing', 'https://caddyserver.com/docs/reverse-proxy', 'Caddy reverse proxy configuration', - Network accessline 232
'https://caddyserver.com/docs/reverse-proxy', - Network accessline 255
makeResult( 'mdn', 'https://developer.mozilla.org/en-US/docs/Web/API/fetch', - Network accessline 256
'mdn', 'https://developer.mozilla.org/en-US/docs/Web/API/fetch', 'javascript fetch api reference global function', - Network accessline 257
'https://developer.mozilla.org/en-US/docs/Web/API/fetch', - Network accessline 258
'javascript fetch api reference global function', 'The fetch() method starts the process of fetching a resource from the network.', ), - Network accessline 259
'The fetch() method starts the process of fetching a resource from the network.', - Network accessline 270
makeResult( 'bing', 'https://random-blog.example.com/post', - Network accessline 271
'bing', 'https://random-blog.example.com/post', 'A fetch api opinion piece', - Network accessline 272
'https://random-blog.example.com/post', 'A fetch api opinion piece', 'Loose blog musings that mention fetch and api once each in passing.', - Network accessline 300
makeResult( 'stackoverflow', 'https://stackoverflow.com/q/12345', - Network accessline 301
'stackoverflow', 'https://stackoverflow.com/q/12345', 'Tuning pgvector HNSW ef_search for recall', - Network accessline 302
'https://stackoverflow.com/q/12345', - Network accessline 312
makeResult( 'mdn', 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 313
'mdn', 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', 'HTML <search> element', - Network accessline 314
'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 328
expect(out.results[0]?.url).toBe('https://stackoverflow.com/q/12345');
tests/unit/search/core/core-provider-collision-dispatch.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
it('auto-dispatches the top rewrite for a single-token dev-term lexical collision (useState)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 21
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 40
it('auto-dispatches the top rewrite for a short common-noun brand collision (next)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 41
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 53
it('does NOT fire a collision variant for a plain multi-word query', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 54
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 66
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 79
it('does NOT auto-dispatch a "React hook" rewrite for a library/tool term (docker)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 80
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 93
it('does NOT auto-dispatch a "React hook" rewrite for a build-tool term (vite)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 94
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 106
it('does NOT auto-dispatch a "React hook" rewrite for an ORM term (prisma)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 107
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 122
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 135
runV1Search.mockResolvedValue(dispatch('https://a.com'));
tests/unit/search/core/core-provider-error-intent.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
it('fires ONE extra bare-token dispatch for an error-intent query', async () => { runV1Search.mockResolvedValue(dispatch([r('a', 'https://a.com')])); - Network accessline 21
runV1Search.mockResolvedValue(dispatch([r('a', 'https://a.com')])); - Network accessline 33
it('does NOT fire a bare-token variant for a non-error query', async () => { runV1Search.mockResolvedValue(dispatch([r('a', 'https://a.com')])); - Network accessline 34
runV1Search.mockResolvedValue(dispatch([r('a', 'https://a.com')])); - Network accessline 45
runV1Search.mockResolvedValue( dispatch([ r('uudised | ERR', 'https://www.err.ee/x', 'estonian broadcaster', 1.0), - Network accessline 46
dispatch([ r('uudised | ERR', 'https://www.err.ee/x', 'estonian broadcaster', 1.0), r('ERR | Cambridge Dictionary', 'https://dictionary.cambridge.org/err', 'definition of err', 0.9), - Network accessline 47
r('uudised | ERR', 'https://www.err.ee/x', 'estonian broadcaster', 1.0), - Network accessline 48
r('ERR | Cambridge Dictionary', 'https://dictionary.cambridge.org/err', 'definition of err', 0.9), - Network accessline 49
r('Error [ERR_MODULE_NOT_FOUND]: Cannot find module', 'https://stackoverflow.com/q/1', 'node esm import', 0.5), - Network accessline 60
expect(res.data.results[0].url).toBe('https://stackoverflow.com/q/1'); - Network accessline 62
const topUrls = res.data.results.slice(0, 1).map((x) => x.url); expect(topUrls).not.toContain('https://www.err.ee/x'); - Network accessline 63
expect(topUrls).not.toContain('https://www.err.ee/x'); - Network accessline 67
runV1Search.mockResolvedValue( dispatch([ r('React docs', 'https://react.dev/a', 'hooks', 1.0), - Network accessline 68
dispatch([ r('React docs', 'https://react.dev/a', 'hooks', 1.0), r('MDN useState', 'https://developer.mozilla.org/b', 'state', 0.9), - Network accessline 69
r('React docs', 'https://react.dev/a', 'hooks', 1.0), - Network accessline 70
r('MDN useState', 'https://developer.mozilla.org/b', 'state', 0.9), - Network accessline 71
r('Blog', 'https://blog.example.com/c', 'tutorial', 0.5), - Network accessline 80
if (!res.ok) return; expect(res.data.results.map((x) => x.url)).toEqual([ 'https://react.dev/a', - Network accessline 81
expect(res.data.results.map((x) => x.url)).toEqual([ 'https://react.dev/a', 'https://developer.mozilla.org/b', - Network accessline 82
'https://react.dev/a', - Network accessline 83
'https://developer.mozilla.org/b', - Network accessline 84
'https://blog.example.com/c', - Network accessline 89
runV1Search.mockResolvedValue( dispatch([ r('some page', 'https://a.com', 'nothing matching', 1.0), - Network accessline 90
dispatch([ r('some page', 'https://a.com', 'nothing matching', 1.0), r('other page', 'https://b.com', 'also nothing', 0.9), - Network accessline 91
r('some page', 'https://a.com', 'nothing matching', 1.0), - Network accessline 92
r('other page', 'https://b.com', 'also nothing', 0.9),
tests/unit/search/core/core-provider-kept-zero.test.ts
- Executable scriptline 1
Executable file - Network accessline 38
runV1Search.mockResolvedValue( dispatchOf([ res('https://developer.mozilla.org/glossary-wrong-1', 0.95, 'mdn'), - Network accessline 39
dispatchOf([ res('https://developer.mozilla.org/glossary-wrong-1', 0.95, 'mdn'), res('https://developer.mozilla.org/glossary-wrong-2', 0.85, 'mdn'), - Network accessline 40
res('https://developer.mozilla.org/glossary-wrong-1', 0.95, 'mdn'), - Network accessline 41
res('https://developer.mozilla.org/glossary-wrong-2', 0.85, 'mdn'), - Network accessline 42
res('https://developer.mozilla.org/glossary-wrong-3', 0.75, 'mdn'), - Network accessline 43
res('https://correct-entity.example/a', 0.03, 'bing'), - Network accessline 44
res('https://correct-entity.example/b', 0.02, 'bing'), - Network accessline 45
res('https://correct-entity.example/c', 0.01, 'bing'), - Network accessline 58
expect(urls).toContain('https://correct-entity.example/a'); - Network accessline 60
expect(urls).toContain('https://developer.mozilla.org/glossary-wrong-1'); - Network accessline 62
expect(urls).not.toContain('https://correct-entity.example/b'); - Network accessline 63
expect(urls).not.toContain('https://correct-entity.example/c'); - Network accessline 71
runV1Search.mockResolvedValue( dispatchOf([ res('https://developer.mozilla.org/a', 0.95, 'mdn'), - Network accessline 72
dispatchOf([ res('https://developer.mozilla.org/a', 0.95, 'mdn'), res('https://developer.mozilla.org/b', 0.85, 'mdn'), - Network accessline 73
res('https://developer.mozilla.org/a', 0.95, 'mdn'), - Network accessline 74
res('https://developer.mozilla.org/b', 0.85, 'mdn'), - Network accessline 75
res('https://off-topic-junk.example/x', 0.006, 'bing'), - Network accessline 76
res('https://off-topic-junk.example/y', 0.004, 'bing'), - Network accessline 88
expect(urls).not.toContain('https://off-topic-junk.example/x'); - Network accessline 89
expect(urls).not.toContain('https://off-topic-junk.example/y'); - Network accessline 90
expect(urls).toContain('https://developer.mozilla.org/a'); - Network accessline 94
runV1Search.mockResolvedValue( dispatchOf([ res('https://developer.mozilla.org/a', 0.95, 'mdn'), - Network accessline 95
dispatchOf([ res('https://developer.mozilla.org/a', 0.95, 'mdn'), res('https://correct.example/top', 0.6, 'bing'), - Network accessline 96
res('https://developer.mozilla.org/a', 0.95, 'mdn'), - Network accessline 97
res('https://correct.example/top', 0.6, 'bing'), - Network accessline 98
res('https://correct.example/junk', 0.01, 'bing'), - Network accessline 107
if (!out.ok) return; const urls = out.data.results.map((r) => r.url); expect(urls).toContain('https://correct.example/top'); - Network accessline 109
expect(urls).toContain('https://correct.example/top'); - Network accessline 111
expect(urls).not.toContain('https://correct.example/junk');
tests/unit/search/core/core-provider-rare-variant.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
it('fires ONE extra quoted-phrase dispatch for a compound-term query', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 21
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 32
it('does NOT fire a variant for a plain query', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 33
runV1Search.mockResolvedValue(dispatch('https://a.com'));
tests/unit/search/core/core-provider-recency-backfill.test.ts
- Executable scriptline 1
Executable file - Network accessline 63
runV1Search.mockResolvedValue( dispatchOf([ res('https://stale.example.com/old', 0.90, isoDaysAgo(800)), - Network accessline 64
dispatchOf([ res('https://stale.example.com/old', 0.90, isoDaysAgo(800)), res('https://fresh.example.com/new', 0.80, isoDaysAgo(2)), - Network accessline 65
res('https://stale.example.com/old', 0.90, isoDaysAgo(800)), - Network accessline 66
res('https://fresh.example.com/new', 0.80, isoDaysAgo(2)), - Network accessline 78
expect(urls[0]).toBe('https://fresh.example.com/new'); - Network accessline 85
runV1Search.mockResolvedValue( dispatchOf([ res('https://stale.example.com/old', 0.90, isoDaysAgo(800)), - Network accessline 86
dispatchOf([ res('https://stale.example.com/old', 0.90, isoDaysAgo(800)), res('https://fresh.example.com/new', 0.80, isoDaysAgo(2)), - Network accessline 87
res('https://stale.example.com/old', 0.90, isoDaysAgo(800)), - Network accessline 88
res('https://fresh.example.com/new', 0.80, isoDaysAgo(2)), - Network accessline 97
if (!out.ok) return; const urls = out.data.results.map((r) => r.url); expect(urls[0]).toBe('https://stale.example.com/old'); - Network accessline 98
const urls = out.data.results.map((r) => r.url); expect(urls[0]).toBe('https://stale.example.com/old'); }); - Network accessline 99
expect(urls[0]).toBe('https://stale.example.com/old'); - Network accessline 125
const POOL = [ res('https://good1.com', 1.0), - Network accessline 126
res('https://good1.com', 1.0), - Network accessline 127
res('https://junk1.com', 0.001), - Network accessline 128
res('https://good2.com', 0.9), - Network accessline 129
res('https://junk2.com', 0.002), - Network accessline 130
res('https://good3.com', 0.8), - Network accessline 131
res('https://good4.com', 0.7), - Network accessline 132
res('https://good5.com', 0.6), - Network accessline 144
if (!out.ok) return; const urls = out.data.results.map((r) => r.url); expect(urls).not.toContain('https://junk1.com'); - Network accessline 145
const urls = out.data.results.map((r) => r.url); expect(urls).not.toContain('https://junk1.com'); expect(urls).not.toContain('https://junk2.com'); - Network accessline 146
expect(urls).not.toContain('https://junk1.com'); - Network accessline 147
expect(urls).not.toContain('https://junk2.com'); - Network accessline 149
expect(out.data.results).toHaveLength(5); expect(urls).toEqual([ 'https://good1.com', - Network accessline 150
expect(urls).toEqual([ 'https://good1.com', 'https://good2.com', - Network accessline 151
'https://good1.com', - Network accessline 152
'https://good2.com', - Network accessline 153
'https://good3.com', - Network accessline 154
'https://good4.com', - Network accessline 155
'https://good5.com',
tests/unit/search/core/core-provider-score-floor.test.ts
- Executable scriptline 1
Executable file - Network accessline 54
runV1Search.mockResolvedValue( dispatchOf([ res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 1.0), - Network accessline 55
dispatchOf([ res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 1.0), res('https://safjan.com/rrf-python', 0.71), - Network accessline 56
res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 1.0), - Network accessline 57
res('https://safjan.com/rrf-python', 0.71), - Network accessline 58
res('https://plg.uwaterloo.ca/cormack-rrf.pdf', 0.63), - Network accessline 59
res('https://dictionary.cambridge.org/dictionary/english/reciprocal', 0.0097), - Network accessline 60
res('https://dictionary.cambridge.org/dictionary/english/rank', 0.0003), - Network accessline 69
if (!out.ok) return; const urls = out.data.results.map((r) => r.url); expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/reciprocal'); - Network accessline 70
const urls = out.data.results.map((r) => r.url); expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/reciprocal'); expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/rank'); - Network accessline 71
expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/reciprocal'); - Network accessline 72
expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/rank'); - Network accessline 73
expect(urls).toContain('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion'); - Network accessline 74
expect(urls).toContain('https://safjan.com/rrf-python'); - Network accessline 75
expect(urls).toContain('https://plg.uwaterloo.ca/cormack-rrf.pdf'); - Network accessline 79
it('keeps all results when none fall below the floor', async () => { runV1Search.mockResolvedValue( dispatchOf([res('https://a.com', 1.0), res('https://b.com', 0.4), res('https://c.com', 0.2)]), - Network accessline 80
runV1Search.mockResolvedValue( dispatchOf([res('https://a.com', 1.0), res('https://b.com', 0.4), res('https://c.com', 0.2)]), ); - Network accessline 81
dispatchOf([res('https://a.com', 1.0), res('https://b.com', 0.4), res('https://c.com', 0.2)]), - Network accessline 93
it('never empties the result set even if every score is below the floor', async () => { runV1Search.mockResolvedValue( dispatchOf([res('https://a.com', 0.004), res('https://b.com', 0.002)]), - Network accessline 94
runV1Search.mockResolvedValue( dispatchOf([res('https://a.com', 0.004), res('https://b.com', 0.002)]), ); - Network accessline 95
dispatchOf([res('https://a.com', 0.004), res('https://b.com', 0.002)]), - Network accessline 103
if (!out.ok) return; expect(out.data.results).toHaveLength(1); expect(out.data.results[0].url).toBe('https://a.com'); - Network accessline 104
expect(out.data.results).toHaveLength(1); expect(out.data.results[0].url).toBe('https://a.com'); }); - Network accessline 105
expect(out.data.results[0].url).toBe('https://a.com'); - Network accessline 118
runV1Search.mockResolvedValue( dispatchOf([ res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 0.6), - Network accessline 119
dispatchOf([ res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 0.6), res('https://safjan.com/rrf-python', 0.55), - Network accessline 120
res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 0.6), - Network accessline 121
res('https://safjan.com/rrf-python', 0.55), - Network accessline 122
res('https://plg.uwaterloo.ca/cormack-rrf.pdf', 0.52), - Network accessline 123
res('https://dictionary.cambridge.org/dictionary/english/reciprocal', 0.51), - Network accessline 124
res('https://dictionary.cambridge.org/dictionary/english/rank', 0.5), - Network accessline 129
foldRerankIntoOrdering.mockResolvedValue([ res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 0.98), - Network accessline 130
res('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 0.98), - Network accessline 131
res('https://safjan.com/rrf-python', 0.71), - Network accessline 132
res('https://plg.uwaterloo.ca/cormack-rrf.pdf', 0.63), - Network accessline 133
res('https://dictionary.cambridge.org/dictionary/english/reciprocal', 0.0097), - Network accessline 134
res('https://dictionary.cambridge.org/dictionary/english/rank', 0.0003), - Network accessline 147
expect(foldRerankIntoOrdering).toHaveBeenCalledTimes(1); const urls = out.data.results.map((r) => r.url); expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/reciprocal'); - Network accessline 148
const urls = out.data.results.map((r) => r.url); expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/reciprocal'); expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/rank'); - Network accessline 149
expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/reciprocal'); - Network accessline 150
expect(urls).not.toContain('https://dictionary.cambridge.org/dictionary/english/rank'); - Network accessline 151
expect(urls).toContain('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion');
tests/unit/search/core/core-provider-tier-budgets.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
it('balanced depth passes fetchTimeoutMs=3000 and stageBudgetMs=4000 to fetchContentForResults', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 43
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 55
it('deep depth passes fetchTimeoutMs=8000 and stageBudgetMs=10000 to fetchContentForResults', async () => { runV1Search.mockResolvedValue(dispatch('https://b.com')); - Network accessline 56
runV1Search.mockResolvedValue(dispatch('https://b.com')); - Network accessline 68
it('fast depth skips fetchContentForResults entirely', async () => { runV1Search.mockResolvedValue(dispatch('https://c.com')); - Network accessline 69
runV1Search.mockResolvedValue(dispatch('https://c.com')); - Network accessline 83
it('pre-warms the browser pool BEFORE fetchContentForResults on balanced depth with include_content', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 84
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 96
it('pre-warms the browser pool on deep depth too', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 97
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 107
it('does NOT pre-warm on fast depth (no enrichment) or when include_content is false', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 108
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 121
it('passes candidateCount + narrowSetBudgetMs into the fetch context (narrow-set scaling seam)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 122
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 143
it('threads renderNarrowSet into the fetch context when include_domains is present', async () => { runV1Search.mockResolvedValue(dispatch('https://docs.example.com/x')); - Network accessline 144
runV1Search.mockResolvedValue(dispatch('https://docs.example.com/x')); - Network accessline 154
it('does NOT thread renderNarrowSet for a broad (no include_domains) search — fast path unchanged', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 155
runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 165
it('does not throw when the router has no prewarmBrowser method (back-compat)', async () => { runV1Search.mockResolvedValue(dispatch('https://a.com')); - Network accessline 166
runV1Search.mockResolvedValue(dispatch('https://a.com'));
tests/unit/search/core/date-window.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/core/domain-quality.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
it('penalises next.co.uk on a technical Next.js query', () => { const score = domainQualityScore( 'https://www.next.co.uk/women', - Network accessline 6
const score = domainQualityScore( 'https://www.next.co.uk/women', 'general', - Network accessline 7
'https://www.next.co.uk/women', - Network accessline 14
it('penalises next.us on a technical Next.js query', () => { const score = domainQualityScore( 'https://www.next.us/clearance', - Network accessline 15
const score = domainQualityScore( 'https://www.next.us/clearance', 'general', - Network accessline 16
'https://www.next.us/clearance', - Network accessline 23
it('penalises next.de on a technical Next.js query', () => { const score = domainQualityScore( 'https://www.next.de/de', - Network accessline 24
const score = domainQualityScore( 'https://www.next.de/de', 'general', - Network accessline 25
'https://www.next.de/de', - Network accessline 32
it('penalises bestbuy.com on a generic short query', () => { const score = domainQualityScore( 'https://www.bestbuy.com/site/best-deals', - Network accessline 33
const score = domainQualityScore( 'https://www.bestbuy.com/site/best-deals', 'general', - Network accessline 34
'https://www.bestbuy.com/site/best-deals', - Network accessline 41
it('penalises a commercial-TLD host (.shop) on a technical query', () => { const score = domainQualityScore( 'https://example.shop/redis', - Network accessline 42
const score = domainQualityScore( 'https://example.shop/redis', 'general', - Network accessline 43
'https://example.shop/redis', - Network accessline 50
it('does not penalise a canonical docs domain', () => { const score = domainQualityScore( 'https://nextjs.org/docs/app/api-reference', - Network accessline 51
const score = domainQualityScore( 'https://nextjs.org/docs/app/api-reference', 'general', - Network accessline 52
'https://nextjs.org/docs/app/api-reference', - Network accessline 59
it('does not penalise stackoverflow.com on a code query', () => { const score = domainQualityScore( 'https://stackoverflow.com/questions/12345', - Network accessline 60
const score = domainQualityScore( 'https://stackoverflow.com/questions/12345', 'code', - Network accessline 61
'https://stackoverflow.com/questions/12345', - Network accessline 68
it('does not penalise github.com on a general query', () => { const score = domainQualityScore( 'https://github.com/anthropics/claude-code', - Network accessline 69
const score = domainQualityScore( 'https://github.com/anthropics/claude-code', 'general', - Network accessline 70
'https://github.com/anthropics/claude-code', - Network accessline 77
it('heavily penalises MDN /Web/HTML/Element/* on a database code query', () => { const score = domainQualityScore( 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 78
const score = domainQualityScore( 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', 'code', - Network accessline 79
'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 86
it('does not penalise MDN /Web/HTML/Element/* on a relevant HTML query', () => { const score = domainQualityScore( 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 87
const score = domainQualityScore( 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', 'code', - Network accessline 88
'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 107
it('leaves a dictionary host at full score on a non-error query', () => { const score = domainQualityScore( 'https://www.merriam-webster.com/dictionary/reciprocal', - Network accessline 108
const score = domainQualityScore( 'https://www.merriam-webster.com/dictionary/reciprocal', 'general', - Network accessline 109
'https://www.merriam-webster.com/dictionary/reciprocal', - Network accessline 116
it('demotes a dictionary host on an error-token query', () => { const score = domainQualityScore( 'https://www.merriam-webster.com/dictionary/permission', - Network accessline 117
const score = domainQualityScore( 'https://www.merriam-webster.com/dictionary/permission', 'general', - Network accessline 118
'https://www.merriam-webster.com/dictionary/permission', - Network accessline 125
it('demotes a wiktionary host on an error-token query', () => { const score = domainQualityScore( 'https://en.wiktionary.org/wiki/violation', - Network accessline 126
const score = domainQualityScore( 'https://en.wiktionary.org/wiki/violation', 'general', - Network accessline 127
'https://en.wiktionary.org/wiki/violation', - Network accessline 134
it('does NOT demote a non-dictionary host on an error-token query', () => { const score = domainQualityScore( 'https://github.com/nodejs/node/issues/1234', - Network accessline 135
const score = domainQualityScore( 'https://github.com/nodejs/node/issues/1234', 'general', - Network accessline 136
'https://github.com/nodejs/node/issues/1234', - Network accessline 146
it('does NOT demote a dictionary host on a plain-acronym query', () => { const score = domainQualityScore( 'https://www.merriam-webster.com/dictionary/proxy', - Network accessline 147
const score = domainQualityScore( 'https://www.merriam-webster.com/dictionary/proxy', 'general', - Network accessline 148
'https://www.merriam-webster.com/dictionary/proxy', - Network accessline 155
it('DOES demote a dictionary host when a numeric status code makes it an error', () => { const score = domainQualityScore( 'https://en.wiktionary.org/wiki/violation', - Network accessline 156
const score = domainQualityScore( 'https://en.wiktionary.org/wiki/violation', 'general', - Network accessline 157
'https://en.wiktionary.org/wiki/violation',
tests/unit/search/core/engine-quality.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/core/error-intent.test.ts
- Executable scriptline 1
Executable file - Network accessline 135
expect( resultMatchesErrorToken( { title: 'Error [ERR_MODULE_NOT_FOUND]: Cannot find module', url: 'https://x', snippet: '' }, - Network accessline 136
resultMatchesErrorToken( { title: 'Error [ERR_MODULE_NOT_FOUND]: Cannot find module', url: 'https://x', snippet: '' }, tokens, - Network accessline 137
{ title: 'Error [ERR_MODULE_NOT_FOUND]: Cannot find module', url: 'https://x', snippet: '' }, - Network accessline 144
expect( resultMatchesErrorToken( { title: 'Fix Node.js', url: 'https://x', snippet: 'the err_module_not_found error happens when' }, - Network accessline 145
resultMatchesErrorToken( { title: 'Fix Node.js', url: 'https://x', snippet: 'the err_module_not_found error happens when' }, tokens, - Network accessline 146
{ title: 'Fix Node.js', url: 'https://x', snippet: 'the err_module_not_found error happens when' }, - Network accessline 153
expect( resultMatchesErrorToken( { title: 'ERR | English meaning - Cambridge Dictionary', url: 'https://dictionary.cambridge.org', snippet: 'err definition' }, - Network accessline 154
resultMatchesErrorToken( { title: 'ERR | English meaning - Cambridge Dictionary', url: 'https://dictionary.cambridge.org', snippet: 'err definition' }, tokens, - Network accessline 155
{ title: 'ERR | English meaning - Cambridge Dictionary', url: 'https://dictionary.cambridge.org', snippet: 'err definition' }, - Network accessline 159
expect( resultMatchesErrorToken( { title: 'Err : Urban Rustic Thai', url: 'https://errurbanrusticthai.co.th', snippet: 'restaurant bangkok' }, - Network accessline 160
resultMatchesErrorToken( { title: 'Err : Urban Rustic Thai', url: 'https://errurbanrusticthai.co.th', snippet: 'restaurant bangkok' }, tokens, - Network accessline 161
{ title: 'Err : Urban Rustic Thai', url: 'https://errurbanrusticthai.co.th', snippet: 'restaurant bangkok' }, - Network accessline 168
expect( resultMatchesErrorToken( { title: 'E0499 - Error codes index', url: 'https://doc.rust-lang.org', snippet: '' }, - Network accessline 169
resultMatchesErrorToken( { title: 'E0499 - Error codes index', url: 'https://doc.rust-lang.org', snippet: '' }, ['E0499'], - Network accessline 170
{ title: 'E0499 - Error codes index', url: 'https://doc.rust-lang.org', snippet: '' },
tests/unit/search/core/lexical-alignment.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/core/orchestrator-cache.test.ts
- Executable scriptline 1
Executable file - Network accessline 32
const cachedItems: SearchResultItem[] = [ { title: 'Next docs', url: 'https://nextjs.org/docs/app', snippet: 's1', relevance_score: 1 }, - Network accessline 33
{ title: 'Next docs', url: 'https://nextjs.org/docs/app', snippet: 's1', relevance_score: 1 }, - Network accessline 34
{ title: 'Next blog', url: 'https://nextjs.org/blog/next-15', snippet: 's2', relevance_score: 0.9 }, - Network accessline 35
{ title: 'React docs', url: 'https://react.dev/learn', snippet: 's3', relevance_score: 0.85 }, - Network accessline 36
{ title: 'Vue guide', url: 'https://vuejs.org/guide', snippet: 's4', relevance_score: 0.8 }, - Network accessline 37
{ title: 'Brand', url: 'https://www.next.co.uk/', snippet: 's5', relevance_score: 0.7 },
tests/unit/search/core/orchestrator-rank.test.ts
- Executable scriptline 1
Executable file - Network accessline 89
makeResult( 'bing', 'https://www.next.co.uk/women', - Network accessline 90
'bing', 'https://www.next.co.uk/women', "Women's Clothing | Next Official Site", - Network accessline 91
'https://www.next.co.uk/women', - Network accessline 95
makeResult( 'bing', 'https://nextjs.org/docs/app/api-reference/functions/server-actions', - Network accessline 96
'bing', 'https://nextjs.org/docs/app/api-reference/functions/server-actions', 'Next.js 15 — Server Actions | App Router', - Network accessline 97
'https://nextjs.org/docs/app/api-reference/functions/server-actions', - Network accessline 108
expect(out.results.length).toBeGreaterThanOrEqual(2); const canonicalIdx = out.results.findIndex((r) => r.url.startsWith('https://nextjs.org/')); - Network accessline 109
const canonicalIdx = out.results.findIndex((r) => r.url.startsWith('https://nextjs.org/')); - Network accessline 110
const brandIdx = out.results.findIndex((r) => r.url.startsWith('https://www.next.co.uk/')); - Network accessline 118
makeResult( 'bing', 'https://nextjs.org/docs/app', - Network accessline 119
'bing', 'https://nextjs.org/docs/app', 'Next.js 15 App Router', - Network accessline 120
'https://nextjs.org/docs/app', - Network accessline 124
makeResult( 'bing', 'https://www.next.co.uk/', - Network accessline 125
'bing', 'https://www.next.co.uk/', 'Next Clothing', - Network accessline 126
'https://www.next.co.uk/', - Network accessline 134
query: 'next.js 15 server actions caching', }); const canonical = out.results.find((r) => r.url.startsWith('https://nextjs.org/')); - Network accessline 135
}); const canonical = out.results.find((r) => r.url.startsWith('https://nextjs.org/')); expect(canonical).toBeDefined(); - Network accessline 136
const canonical = out.results.find((r) => r.url.startsWith('https://nextjs.org/')); - Network accessline 143
makeResult( 'bing', 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 144
'bing', 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', 'HTML <search> element', - Network accessline 145
'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search', - Network accessline 149
makeResult( 'bing', 'https://jkatz.github.io/post/postgres/pgvector-hnsw-performance/', - Network accessline 150
'bing', 'https://jkatz.github.io/post/postgres/pgvector-hnsw-performance/', 'pgvector HNSW performance tuning', - Network accessline 151
'https://jkatz.github.io/post/postgres/pgvector-hnsw-performance/', - Network accessline 178
const lowEngine = makeEntry( 'low-quality', [makeResult('low-quality', 'https://low.test/top', 'low result', 'unrelated body')], - Network accessline 179
'low-quality', [makeResult('low-quality', 'https://low.test/top', 'low result', 'unrelated body')], { quality: 'low' }, - Network accessline 180
[makeResult('low-quality', 'https://low.test/top', 'low result', 'unrelated body')], - Network accessline 183
const highEngine = makeEntry( 'high-quality', [makeResult('high-quality', 'https://high.test/top', 'high result', 'unrelated body')], - Network accessline 184
'high-quality', [makeResult('high-quality', 'https://high.test/top', 'high result', 'unrelated body')], { quality: 'high' }, - Network accessline 185
[makeResult('high-quality', 'https://high.test/top', 'high result', 'unrelated body')], - Network accessline 192
const out = await runV1Search({ query: 'opaque query without lexical signal' }); expect(out.results.length).toBeGreaterThanOrEqual(2); const highIdx = out.results.findIndex((r) => r.url === 'https://high.test/top'); - Network accessline 193
expect(out.results.length).toBeGreaterThanOrEqual(2); const highIdx = out.results.findIndex((r) => r.url === 'https://high.test/top'); const lowIdx = out.results.findIndex((r) => r.url === 'https://low.test/top'); - Network accessline 194
const highIdx = out.results.findIndex((r) => r.url === 'https://high.test/top'); - Network accessline 195
const lowIdx = out.results.findIndex((r) => r.url === 'https://low.test/top'); - Network accessline 205
const sharedUrl = 'https://shared.test/x'; - Network accessline 226
const heavyButLowTier = makeEntry( 'a', [makeResult('a', 'https://a.test/top', 'a title', 'unrelated snippet body')], - Network accessline 227
'a', [makeResult('a', 'https://a.test/top', 'a title', 'unrelated snippet body')], { weight: 5.0, quality: 'low' }, - Network accessline 228
[makeResult('a', 'https://a.test/top', 'a title', 'unrelated snippet body')], - Network accessline 231
const lightButHighTier = makeEntry( 'b', [makeResult('b', 'https://b.test/top', 'b title', 'unrelated snippet body')], - Network accessline 232
'b', [makeResult('b', 'https://b.test/top', 'b title', 'unrelated snippet body')], { weight: 0.1, quality: 'high' }, - Network accessline 233
[makeResult('b', 'https://b.test/top', 'b title', 'unrelated snippet body')], - Network accessline 241
expect(out.results[0].url).toBe('https://b.test/top'); - Network accessline 249
it('merges utm-tagged and untagged variants into one result', async () => { const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/x?utm_source=newsletter', 'page x', 'body of x'), - Network accessline 250
const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/x?utm_source=newsletter', 'page x', 'body of x'), ]); - Network accessline 251
makeResult('a', 'https://foo.com/x?utm_source=newsletter', 'page x', 'body of x'), - Network accessline 252
]); const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x', 'page x', 'body of x'), - Network accessline 253
const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x', 'page x', 'body of x'), ]); - Network accessline 254
makeResult('b', 'https://foo.com/x', 'page x', 'body of x'), - Network accessline 263
it('merges AMP and non-AMP variants', async () => { const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/amp/x', 'page x', 'body'), - Network accessline 264
const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/amp/x', 'page x', 'body'), ]); - Network accessline 265
makeResult('a', 'https://foo.com/amp/x', 'page x', 'body'), - Network accessline 266
]); const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x', 'page x', 'body'), - Network accessline 267
const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x', 'page x', 'body'), ]); - Network accessline 268
makeResult('b', 'https://foo.com/x', 'page x', 'body'), - Network accessline 277
it('merges mobile-subdomain and root variants', async () => { const engineA = makeEntry('a', [ makeResult('a', 'https://m.foo.com/x', 'page x', 'body'), - Network accessline 278
const engineA = makeEntry('a', [ makeResult('a', 'https://m.foo.com/x', 'page x', 'body'), ]); - Network accessline 279
makeResult('a', 'https://m.foo.com/x', 'page x', 'body'), - Network accessline 280
]); const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x', 'page x', 'body'), - Network accessline 281
const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x', 'page x', 'body'), ]); - Network accessline 282
makeResult('b', 'https://foo.com/x', 'page x', 'body'), - Network accessline 291
it('merges http-trailing-slash and https variants', async () => { const engineA = makeEntry('a', [ makeResult('a', 'http://foo.com/x', 'page x', 'body'), - Network accessline 292
const engineA = makeEntry('a', [ makeResult('a', 'http://foo.com/x', 'page x', 'body'), ]); - Network accessline 293
makeResult('a', 'http://foo.com/x', 'page x', 'body'), - Network accessline 294
]); const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x/', 'page x', 'body'), - Network accessline 295
const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/x/', 'page x', 'body'), ]); - Network accessline 296
makeResult('b', 'https://foo.com/x/', 'page x', 'body'), - Network accessline 305
it('does NOT merge different paths under the same host', async () => { const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/x', 'page x', 'body'), - Network accessline 306
const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/x', 'page x', 'body'), ]); - Network accessline 307
makeResult('a', 'https://foo.com/x', 'page x', 'body'), - Network accessline 308
]); const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/y', 'page y', 'body'), - Network accessline 309
const engineB = makeEntry('b', [ makeResult('b', 'https://foo.com/y', 'page y', 'body'), ]); - Network accessline 310
makeResult('b', 'https://foo.com/y', 'page y', 'body'), - Network accessline 325
const engineA = makeEntry('a', [ makeResult('a', 'https://foo.com/x?utm_source=a', 'page', 'body'), - Network accessline 326
makeResult('a', 'https://foo.com/x?utm_source=a', 'page', 'body'), - Network accessline 327
]); const engineB = makeEntry('b', [ makeResult('b', 'https://www.foo.com/x', 'page', 'body'), - Network accessline 328
const engineB = makeEntry('b', [ makeResult('b', 'https://www.foo.com/x', 'page', 'body'), ]); - Network accessline 329
makeResult('b', 'https://www.foo.com/x', 'page', 'body'), - Network accessline 342
makeResult( 'bing', 'https://nextjs.org/docs/app', - Network accessline 343
'bing', 'https://nextjs.org/docs/app', 'Next.js docs', - Network accessline 344
'https://nextjs.org/docs/app', - Network accessline 384
const survivor = makeEntry('bing', [ makeResult('bing', 'https://junk.example/jp', 'driving school reservation', 'lessons and pricing'), - Network accessline 385
makeResult('bing', 'https://junk.example/jp', 'driving school reservation', 'lessons and pricing'), - Network accessline 389
const out = await runV1Search({ query: 'kubernetes ingress controller', maxResults: 10 }); expect(out.results.length).toBeGreaterThanOrEqual(1); const junk = out.results.find((r) => r.url === 'https://junk.example/jp')!; - Network accessline 391
const junk = out.results.find((r) => r.url === 'https://junk.example/jp')!; - Network accessline 401
makeResult( 'bing', 'https://kubernetes.io/docs/ingress', - Network accessline 402
'bing', 'https://kubernetes.io/docs/ingress', 'kubernetes ingress controller setup', - Network accessline 403
'https://kubernetes.io/docs/ingress', - Network accessline 410
const out = await runV1Search({ query: 'kubernetes ingress controller', maxResults: 10 }); const top = out.results.find((r) => r.url === 'https://kubernetes.io/docs/ingress')!; - Network accessline 411
const top = out.results.find((r) => r.url === 'https://kubernetes.io/docs/ingress')!; - Network accessline 419
const engine = makeEntry('bing', [ makeResult('bing', 'https://only.example/x', 'unrelated homepage', 'nothing matching'), - Network accessline 420
makeResult('bing', 'https://only.example/x', 'unrelated homepage', 'nothing matching'), - Network accessline 431
verticalState.general = [ makeEntry('e1', [ makeResult('e1', 'https://sqlite.org/', 'SQLite Home Page', 'small fast self-contained database'), - Network accessline 432
makeEntry('e1', [ makeResult('e1', 'https://sqlite.org/', 'SQLite Home Page', 'small fast self-contained database'), makeResult('e1', 'https://sqlite.org/download.html', 'SQLite Download', 'precompiled binaries'), - Network accessline 433
makeResult('e1', 'https://sqlite.org/', 'SQLite Home Page', 'small fast self-contained database'), makeResult('e1', 'https://sqlite.org/download.html', 'SQLite Download', 'precompiled binaries'), makeResult('e1', 'https://al - Network accessline 434
makeResult('e1', 'https://sqlite.org/download.html', 'SQLite Download', 'precompiled binaries'), - Network accessline 435
makeResult('e1', 'https://alexgarcia.xyz/sqlite-vec/', 'sqlite-vec: vec0 virtual tables', 'knn query syntax for vec0 virtual tables'), - Network accessline 438
const out = await runV1Search({ query: 'sqlite-vec vec0 virtual table knn query syntax', category: 'general' }); const urls = out.results.map((r) => r.url); const docIdx = urls.indexOf('https://alexgarcia.xyz/sqlite-vec/'); - Network accessline 439
const urls = out.results.map((r) => r.url); const docIdx = urls.indexOf('https://alexgarcia.xyz/sqlite-vec/'); const homeIdx = urls.indexOf('https://sqlite.org/'); - Network accessline 440
const docIdx = urls.indexOf('https://alexgarcia.xyz/sqlite-vec/'); - Network accessline 441
const homeIdx = urls.indexOf('https://sqlite.org/'); - Network accessline 444
expect(docIdx).toBeGreaterThanOrEqual(0); expect(docIdx).toBeLessThan(homeIdx); expect(out.results.slice(0, 2).map((r) => r.url)).toContain('https://alexgarcia.xyz/sqlite-vec/'); - Network accessline 445
expect(docIdx).toBeLessThan(homeIdx); expect(out.results.slice(0, 2).map((r) => r.url)).toContain('https://alexgarcia.xyz/sqlite-vec/'); }); - Network accessline 446
expect(out.results.slice(0, 2).map((r) => r.url)).toContain('https://alexgarcia.xyz/sqlite-vec/'); - Network accessline 450
verticalState.general = [ makeEntry('e1', [ makeResult('e1', 'https://en.wikipedia.org/wiki/Multiplicative_inverse', 'Reciprocal (mathematics)', 'the reciprocal of a number x is 1/x'), - Network accessline 451
makeEntry('e1', [ makeResult('e1', 'https://en.wikipedia.org/wiki/Multiplicative_inverse', 'Reciprocal (mathematics)', 'the reciprocal of a number x is 1/x'), makeResult('e1', 'https://example.com/rrf', 'Reciprocal Rank Fusi - Network accessline 452
makeResult('e1', 'https://en.wikipedia.org/wiki/Multiplicative_inverse', 'Reciprocal (mathematics)', 'the reciprocal of a number x is 1/x'), - Network accessline 453
makeResult('e1', 'https://example.com/rrf', 'Reciprocal Rank Fusion explained', 'how reciprocal rank fusion combines result rankings'), - Network accessline 455
]; const out = await runV1Search({ query: 'reciprocal rank fusion explained', category: 'general' }); expect(out.results[0].url).toBe('https://example.com/rrf'); - Network accessline 456
const out = await runV1Search({ query: 'reciprocal rank fusion explained', category: 'general' }); expect(out.results[0].url).toBe('https://example.com/rrf'); }); - Network accessline 457
expect(out.results[0].url).toBe('https://example.com/rrf'); - Network accessline 470
makeResult( 'e1', 'https://www.merriam-webster.com/dictionary/permission', - Network accessline 471
'e1', 'https://www.merriam-webster.com/dictionary/permission', 'Permission definition', - Network accessline 472
'https://www.merriam-webster.com/dictionary/permission', - Network accessline 476
makeResult( 'e1', 'https://github.com/nodejs/node/issues/9111', - Network accessline 477
'e1', 'https://github.com/nodejs/node/issues/9111', 'EACCES: permission denied when listening on port', - Network accessline 478
'https://github.com/nodejs/node/issues/9111', - Network accessline 498
const entry = makeEntry('bing', [ makeResult('bing', 'https://example.com/x', 'x', 'body'), - Network accessline 499
makeResult('bing', 'https://example.com/x', 'x', 'body'), - Network accessline 510
it('keeps an all-caps code with digits atomic in the engineQuery', async () => { const entry = makeEntry('bing', [ makeResult('bing', 'https://example.com/x', 'x', 'body'), - Network accessline 511
const entry = makeEntry('bing', [ makeResult('bing', 'https://example.com/x', 'x', 'body'), ]); - Network accessline 512
makeResult('bing', 'https://example.com/x', 'x', 'body'),
tests/unit/search/core/query-expansion.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/core/rare-terms.test.ts
- Executable scriptline 1
Executable file - Network accessline 58
it('boosts a doc containing the verbatim compound above one missing it', () => { const hit = rareTermFactor( { title: 'sqlite-vec: vec0 virtual tables', url: 'https://alexgarcia.xyz/sqlite-vec', snippet: 'knn query' }, - Network accessline 59
const hit = rareTermFactor( { title: 'sqlite-vec: vec0 virtual tables', url: 'https://alexgarcia.xyz/sqlite-vec', snippet: 'knn query' }, rareCompound, - Network accessline 60
{ title: 'sqlite-vec: vec0 virtual tables', url: 'https://alexgarcia.xyz/sqlite-vec', snippet: 'knn query' }, - Network accessline 62
); const miss = rareTermFactor( { title: 'SQLite Home Page', url: 'https://sqlite.org', snippet: 'small fast database' }, - Network accessline 63
const miss = rareTermFactor( { title: 'SQLite Home Page', url: 'https://sqlite.org', snippet: 'small fast database' }, rareCompound, - Network accessline 64
{ title: 'SQLite Home Page', url: 'https://sqlite.org', snippet: 'small fast database' }, - Network accessline 72
const rare = detectRareTerms('reciprocal rank fusion explained'); const phrasePage = rareTermFactor( { title: 'Reciprocal Rank Fusion', url: 'https://example.com/rrf', snippet: 'how RRF combines rankings' }, - Network accessline 73
const phrasePage = rareTermFactor( { title: 'Reciprocal Rank Fusion', url: 'https://example.com/rrf', snippet: 'how RRF combines rankings' }, rare, - Network accessline 74
{ title: 'Reciprocal Rank Fusion', url: 'https://example.com/rrf', snippet: 'how RRF combines rankings' }, - Network accessline 76
); const dictPage = rareTermFactor( { title: 'Reciprocal (mathematics)', url: 'https://en.wikipedia.org/wiki/Multiplicative_inverse', snippet: 'the reciprocal of a number' }, - Network accessline 77
const dictPage = rareTermFactor( { title: 'Reciprocal (mathematics)', url: 'https://en.wikipedia.org/wiki/Multiplicative_inverse', snippet: 'the reciprocal of a number' }, rare, - Network accessline 78
{ title: 'Reciprocal (mathematics)', url: 'https://en.wikipedia.org/wiki/Multiplicative_inverse', snippet: 'the reciprocal of a number' }, - Network accessline 84
it('returns 1.0 for plain queries with no rare terms', () => { expect(rareTermFactor({ title: 'x', url: 'https://x.com', snippet: 'y' }, detectRareTerms('best laptop'))).toBe(1); - Network accessline 85
expect(rareTermFactor({ title: 'x', url: 'https://x.com', snippet: 'y' }, detectRareTerms('best laptop'))).toBe(1); - Network accessline 89
const rare = detectRareTerms('北京人工智能大会最新消息'); const relevant = rareTermFactor( { title: '北京人工智能大会发布最新成果', url: 'https://example.com/ai', snippet: '产业动态' }, - Network accessline 90
const relevant = rareTermFactor( { title: '北京人工智能大会发布最新成果', url: 'https://example.com/ai', snippet: '产业动态' }, rare, - Network accessline 91
{ title: '北京人工智能大会发布最新成果', url: 'https://example.com/ai', snippet: '产业动态' }, - Network accessline 93
); const irrelevant = rareTermFactor( { title: '今日黄历与北京天气预报', url: 'https://example.com/calendar', snippet: '出行指数' }, - Network accessline 94
const irrelevant = rareTermFactor( { title: '今日黄历与北京天气预报', url: 'https://example.com/calendar', snippet: '出行指数' }, rare, - Network accessline 95
{ title: '今日黄历与北京天气预报', url: 'https://example.com/calendar', snippet: '出行指数' }, - Network accessline 107
it('is a miss when the query has compounds but the doc contains none', () => { expect(isRareTermMiss({ title: 'SQLite Home', url: 'https://sqlite.org', snippet: 'database' }, compound)).toBe(true); - Network accessline 108
expect(isRareTermMiss({ title: 'SQLite Home', url: 'https://sqlite.org', snippet: 'database' }, compound)).toBe(true); - Network accessline 109
expect(isRareTermMiss({ title: 'sqlite-vec docs', url: 'https://x.io/sqlite-vec', snippet: 'vec0' }, compound)).toBe(false); - Network accessline 112
it('is a miss when a concept-phrase query result has phrase run < 2', () => { expect(isRareTermMiss({ title: 'Reciprocal (math)', url: 'https://w.org', snippet: 'the reciprocal of x' }, phrase)).toBe(true); - Network accessline 113
expect(isRareTermMiss({ title: 'Reciprocal (math)', url: 'https://w.org', snippet: 'the reciprocal of x' }, phrase)).toBe(true); - Network accessline 114
expect(isRareTermMiss({ title: 'Reciprocal Rank Fusion', url: 'https://e.com', snippet: 'how RRF works' }, phrase)).toBe(false); - Network accessline 120
expect(isRareTermMiss( { title: '北京人工智能大会发布最新成果', url: 'https://e.com/ai', snippet: '产业动态' }, - Network accessline 121
{ title: '北京人工智能大会发布最新成果', url: 'https://e.com/ai', snippet: '产业动态' }, - Network accessline 123
)).toBe(false); expect(isRareTermMiss( { title: '今日黄历与北京天气预报', url: 'https://e.com/calendar', snippet: '出行指数' }, - Network accessline 124
expect(isRareTermMiss( { title: '今日黄历与北京天气预报', url: 'https://e.com/calendar', snippet: '出行指数' }, cjk, - Network accessline 125
{ title: '今日黄历与北京天气预报', url: 'https://e.com/calendar', snippet: '出行指数' }, - Network accessline 132
expect(isRareTermMiss({ title: 'x', url: 'https://x.com', snippet: 'y' }, detectRareTerms('laptop'))).toBe(false);
tests/unit/search/core/rerank-fold.test.ts
- Executable scriptline 1
Executable file - Network accessline 48
}; const results = [ r('https://developer.mozilla.org/en-US/docs/Web/JavaScript', 0.9, 'Array.prototype.map', 'maps values'), - Network accessline 49
const results = [ r('https://developer.mozilla.org/en-US/docs/Web/JavaScript', 0.9, 'Array.prototype.map', 'maps values'), r('https://spam.example/x', 0.1, 'buy now', 'cheap'), - Network accessline 50
r('https://developer.mozilla.org/en-US/docs/Web/JavaScript', 0.9, 'Array.prototype.map', 'maps values'), - Network accessline 51
r('https://spam.example/x', 0.1, 'buy now', 'cheap'), - Network accessline 127
const results = [ rr('https://github.com/asg017/sqlite-vec', 0.9, 'sqlite-vec vector search extension', 'knn queries with sqlite-vec'), - Network accessline 128
rr('https://github.com/asg017/sqlite-vec', 0.9, 'sqlite-vec vector search extension', 'knn queries with sqlite-vec'), - Network accessline 129
rr('https://spam.example/deal', 0.5, 'buy cheap flights today', 'unrelated marketing copy'), - Network accessline 133
rerank: rerankByTitleToken({ 'sqlite-vec': 5, buy: 9 }), }); const junk = out.find((x) => x.url === 'https://spam.example/deal')!; - Network accessline 135
const junk = out.find((x) => x.url === 'https://spam.example/deal')!; - Network accessline 146
const results = [ rr('https://a.example/vec', 0.5, 'sqlite-vec tutorial', 'about sqlite-vec'), - Network accessline 147
rr('https://a.example/vec', 0.5, 'sqlite-vec tutorial', 'about sqlite-vec'), - Network accessline 148
rr('https://b.example/vec', 0.5, 'another sqlite-vec guide', 'sqlite-vec usage'), - Network accessline 161
const results = [ rr('https://x.example/1', 0.5, 'red widgets', 'about widgets'), - Network accessline 162
rr('https://x.example/1', 0.5, 'red widgets', 'about widgets'), - Network accessline 163
rr('https://y.example/2', 0.5, 'blue gadgets', 'about gadgets'), - Network accessline 180
const results = [ rr('https://ok.example/a', 0.5, 'reciprocal rank fusion explained', 'reciprocal rank fusion method'), - Network accessline 181
rr('https://ok.example/a', 0.5, 'reciprocal rank fusion explained', 'reciprocal rank fusion method'), - Network accessline 182
rr('https://para.example/b', 0.5, 'combining ranked lists by score sum', 'a paraphrase of the concept'), - Network accessline 190
const para = out.find((x) => x.url === 'https://para.example/b')!; - Network accessline 199
const results = [ rr('https://off.example.com', 0.9, 'OFFTOPIC', 'unrelated filler'), - Network accessline 200
rr('https://off.example.com', 0.9, 'OFFTOPIC', 'unrelated filler'), - Network accessline 201
rr('https://on.example.com', 0.1, 'ONTOPIC', 'the actual answer'), - Network accessline 205
rerank: rerankByTitleToken({ OFFTOPIC: -5, ONTOPIC: 5 }), }); expect(out[0].url).toBe('https://on.example.com'); - Network accessline 206
}); expect(out[0].url).toBe('https://on.example.com'); expect(out[0].relevance_score).toBeGreaterThanOrEqual(0.5); - Network accessline 207
expect(out[0].url).toBe('https://on.example.com'); - Network accessline 268
const results = [ rc('https://on.example/a', 0.5, 'kubernetes ingress controller setup', 'configure kubernetes ingress', 1), - Network accessline 269
rc('https://on.example/a', 0.5, 'kubernetes ingress controller setup', 'configure kubernetes ingress', 1), - Network accessline 270
rc('https://junk.example/jp', 0.5, 'driving school reservation', 'lessons and pricing', 1), - Network accessline 274
rerank: byTitleHead({ kubernetes: 4, driving: 9 }), }); const junk = out.find((x) => x.url === 'https://junk.example/jp')!; - Network accessline 275
}); const junk = out.find((x) => x.url === 'https://junk.example/jp')!; expect(junk.relevance_score).toBeLessThan(0.5); // forced tier-0 - Network accessline 276
const junk = out.find((x) => x.url === 'https://junk.example/jp')!; - Network accessline 277
expect(junk.relevance_score).toBeLessThan(0.5); // forced tier-0 const hit = out.find((x) => x.url === 'https://on.example/a')!; expect(hit.relevance_score).toBeGreaterThanOrEqual(0.5); - Network accessline 278
const hit = out.find((x) => x.url === 'https://on.example/a')!; - Network accessline 279
expect(hit.relevance_score).toBeGreaterThanOrEqual(0.5); expect(out[0].url).toBe('https://on.example/a'); }); - Network accessline 280
expect(out[0].url).toBe('https://on.example/a'); - Network accessline 287
const results = [ rc('https://para.example/syn', 0.5, 'container orchestration platform', 'manage clusters at scale', 3), - Network accessline 288
rc('https://para.example/syn', 0.5, 'container orchestration platform', 'manage clusters at scale', 3), - Network accessline 289
rc('https://other.example/b', 0.5, 'kubernetes docs reference', 'k8s reference', 1), - Network accessline 296
const para = out.find((x) => x.url === 'https://para.example/syn')!; - Network accessline 297
expect(para.relevance_score).toBeGreaterThanOrEqual(0.5); expect(out[0].url).toBe('https://para.example/syn'); }); - Network accessline 298
expect(out[0].url).toBe('https://para.example/syn'); - Network accessline 304
const results = [ rc('https://hit.example/a', 0.5, 'kubernetes networking guide', 'kubernetes cni', 1), - Network accessline 305
rc('https://hit.example/a', 0.5, 'kubernetes networking guide', 'kubernetes cni', 1), - Network accessline 306
rc('https://low.example/b', 0.5, 'unrelated storage topic', 'volumes', 1), - Network accessline 310
rerank: byTitleHead({ kubernetes: 5, unrelated: -3 }), }); const hit = out.find((x) => x.url === 'https://hit.example/a')!; - Network accessline 311
}); const hit = out.find((x) => x.url === 'https://hit.example/a')!; expect(hit.relevance_score).toBeGreaterThanOrEqual(0.5); - Network accessline 312
const hit = out.find((x) => x.url === 'https://hit.example/a')!; - Network accessline 319
const results = [ rc('https://a.example/1', 0.5, 'anything here', 'body', 1), - Network accessline 320
rc('https://a.example/1', 0.5, 'anything here', 'body', 1), - Network accessline 321
rc('https://b.example/2', 0.5, 'other text', 'body', 1), - Network accessline 325
rerank: byTitleHead({ anything: 5, other: 1 }), }); const a = out.find((x) => x.url === 'https://a.example/1')!; - Network accessline 326
}); const a = out.find((x) => x.url === 'https://a.example/1')!; expect(a.relevance_score).toBe(0.5); // unchanged, fold short-circuits empty queries - Network accessline 327
const a = out.find((x) => x.url === 'https://a.example/1')!; - Network accessline 334
const results = [ rc('https://a.example/1', 0.5, 'kubernetes ingress', 'setup', 1), - Network accessline 335
rc('https://a.example/1', 0.5, 'kubernetes ingress', 'setup', 1), - Network accessline 336
rc('https://b.example/2', 0.5, 'other content topic', 'body', 1), - Network accessline 340
rerank: byTitleHead({ kubernetes: 5, other: -3 }), }); const a = out.find((x) => x.url === 'https://a.example/1')!; - Network accessline 341
}); const a = out.find((x) => x.url === 'https://a.example/1')!; expect(a.relevance_score).toBeGreaterThanOrEqual(0.5); - Network accessline 342
const a = out.find((x) => x.url === 'https://a.example/1')!; - Network accessline 349
const results = [ { title: 'driving school lessons', url: 'https://j.example/x', snippet: 'lessons', engine: 'test', relevance_score: 0.5 }, - Network accessline 350
{ title: 'driving school lessons', url: 'https://j.example/x', snippet: 'lessons', engine: 'test', relevance_score: 0.5 }, - Network accessline 351
{ title: 'kubernetes ingress setup', url: 'https://k.example/y', snippet: 'setup', engine: 'test', relevance_score: 0.5 }, - Network accessline 359
const junk = out.find((x) => x.url === 'https://j.example/x')!;
tests/unit/search/core/score-floor-per-engine.test.ts
- Executable scriptline 1
Executable file - Network accessline 18
const results = [ e('https://developer.mozilla.org/g1', 0.9, 'mdn'), - Network accessline 19
e('https://developer.mozilla.org/g1', 0.9, 'mdn'), - Network accessline 20
e('https://developer.mozilla.org/g2', 0.8, 'mdn'), - Network accessline 21
e('https://developer.mozilla.org/g3', 0.7, 'mdn'), - Network accessline 22
e('https://bing-correct-1.example/a', 0.03, 'bing'), - Network accessline 23
e('https://bing-correct-2.example/b', 0.02, 'bing'), - Network accessline 24
e('https://bing-correct-3.example/c', 0.01, 'bing'), - Network accessline 29
expect(keptUrls).toContain('https://developer.mozilla.org/g1'); - Network accessline 31
expect(keptUrls).toContain('https://bing-correct-1.example/a'); - Network accessline 33
expect(keptUrls).not.toContain('https://bing-correct-2.example/b'); - Network accessline 34
expect(keptUrls).not.toContain('https://bing-correct-3.example/c'); - Network accessline 40
const results = [ e('https://a/1', 0.9, 'a'), - Network accessline 41
e('https://a/1', 0.9, 'a'), - Network accessline 42
e('https://b/1', 0.5, 'b'), - Network accessline 43
e('https://b/2', 0.02, 'b'), - Network accessline 45
const { kept } = applyScoreFloor(results, DEFAULT_SEARCH_SCORE_FLOOR, { perEngineKeep: 1 }); const keptUrls = kept.map((r) => r.url); expect(keptUrls).toEqual(['https://a/1', 'https://b/1']); - Network accessline 46
const keptUrls = kept.map((r) => r.url); expect(keptUrls).toEqual(['https://a/1', 'https://b/1']); expect(keptUrls).not.toContain('https://b/2'); - Network accessline 47
expect(keptUrls).toEqual(['https://a/1', 'https://b/1']); - Network accessline 48
expect(keptUrls).not.toContain('https://b/2'); - Network accessline 51
it('is a no-op relative to the plain floor when every engine has an above-floor survivor', () => { const results = [ e('https://a/1', 0.9, 'a'), - Network accessline 52
const results = [ e('https://a/1', 0.9, 'a'), e('https://b/1', 0.4, 'b'), - Network accessline 53
e('https://a/1', 0.9, 'a'), - Network accessline 54
e('https://b/1', 0.4, 'b'), - Network accessline 55
e('https://a/2', 0.01, 'a'), - Network accessline 62
it('without the option, behaves exactly like the plain floor (default off)', () => { const results = [ e('https://a/1', 0.9, 'a'), - Network accessline 63
const results = [ e('https://a/1', 0.9, 'a'), e('https://b/1', 0.02, 'b'), - Network accessline 64
e('https://a/1', 0.9, 'a'), - Network accessline 65
e('https://b/1', 0.02, 'b'), - Network accessline 66
]; const { kept, dropped } = applyScoreFloor(results, DEFAULT_SEARCH_SCORE_FLOOR); expect(kept.map((r) => r.url)).toEqual(['https://a/1']); - Network accessline 67
const { kept, dropped } = applyScoreFloor(results, DEFAULT_SEARCH_SCORE_FLOOR); expect(kept.map((r) => r.url)).toEqual(['https://a/1']); expect(dropped.map((r) => r.url)).toEqual(['https://b/1']); - Network accessline 68
expect(kept.map((r) => r.url)).toEqual(['https://a/1']); - Network accessline 69
expect(dropped.map((r) => r.url)).toEqual(['https://b/1']); - Network accessline 76
const results = [ e('https://a/1', 0.9, 'a'), - Network accessline 77
e('https://a/1', 0.9, 'a'), - Network accessline 78
e('https://junk/1', 0.006, 'junkengine'), - Network accessline 79
e('https://junk/2', 0.004, 'junkengine'), - Network accessline 84
expect(keptUrls).toEqual(['https://a/1']); - Network accessline 85
expect(dropped.map((r) => r.url)).toEqual(['https://junk/1', 'https://junk/2']); - Network accessline 91
const results = [ e('https://top/1', 0.9, 'dominant'), - Network accessline 92
e('https://top/1', 0.9, 'dominant'), - Network accessline 93
e('https://close/1', 0.03, 'closeengine'), // ~60% of the 0.05 floor → rescue - Network accessline 94
e('https://faraway/1', 0.003, 'farengine'), // ~6% of floor → junk, drop - Network accessline 96
const { kept } = applyScoreFloor(results, DEFAULT_SEARCH_SCORE_FLOOR, { perEngineKeep: 1 }); const keptUrls = kept.map((r) => r.url); expect(keptUrls).toContain('https://close/1'); - Network accessline 97
const keptUrls = kept.map((r) => r.url); expect(keptUrls).toContain('https://close/1'); expect(keptUrls).not.toContain('https://faraway/1'); - Network accessline 98
expect(keptUrls).toContain('https://close/1'); - Network accessline 99
expect(keptUrls).not.toContain('https://faraway/1'); - Network accessline 105
const results = [ e('https://a/1', 0.9, 'a'), - Network accessline 106
e('https://a/1', 0.9, 'a'), - Network accessline 107
e('https://b/1', 0.03, 'b'), - Network accessline 108
e('https://a/2', 0.6, 'a'), - Network accessline 112
expect(kept.map((r) => r.url)).toEqual(['https://a/1', 'https://b/1', 'https://a/2']);
tests/unit/search/core/score-floor.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
it('drops the A1 near-zero tail (0.0097 / 0.0003) and keeps the 3 on-topic results', () => { const results = [ s('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 1.0), - Network accessline 15
const results = [ s('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 1.0), s('https://safjan.com/implementing-rank-fusion-in-python/', 0.71), - Network accessline 16
s('https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 1.0), - Network accessline 17
s('https://safjan.com/implementing-rank-fusion-in-python/', 0.71), - Network accessline 18
s('https://plg.uwaterloo.ca/cormack-rrf.pdf', 0.63), - Network accessline 19
s('https://dictionary.cambridge.org/dictionary/english/reciprocal', 0.0097), - Network accessline 20
s('https://dictionary.cambridge.org/dictionary/english/rank', 0.0003), - Network accessline 22
const { kept, dropped } = applyScoreFloor(results, DEFAULT_SEARCH_SCORE_FLOOR); expect(kept.map((r) => r.url)).toEqual([ 'https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', - Network accessline 23
expect(kept.map((r) => r.url)).toEqual([ 'https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', 'https://safjan.com/implementing-rank-fusion-in-python/', - Network accessline 24
'https://en.wikipedia.org/wiki/Reciprocal_rank_fusion', - Network accessline 25
'https://safjan.com/implementing-rank-fusion-in-python/', - Network accessline 26
'https://plg.uwaterloo.ca/cormack-rrf.pdf', - Network accessline 27
]); expect(dropped.map((r) => r.url)).toEqual([ 'https://dictionary.cambridge.org/dictionary/english/reciprocal', - Network accessline 28
expect(dropped.map((r) => r.url)).toEqual([ 'https://dictionary.cambridge.org/dictionary/english/reciprocal', 'https://dictionary.cambridge.org/dictionary/english/rank', - Network accessline 29
'https://dictionary.cambridge.org/dictionary/english/reciprocal', - Network accessline 30
'https://dictionary.cambridge.org/dictionary/english/rank',
tests/unit/search/core/text-tokenizer.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/country.test.ts
- Executable scriptline 1
Executable file - Network accessline 65
search: vi.fn(async (_q: string, opts?: SearchEngineOptions) => { captured = opts; return [makeResult('bing', 'https://example.com/a')]; - Network accessline 66
captured = opts; return [makeResult('bing', 'https://example.com/a')]; }), - Network accessline 67
return [makeResult('bing', 'https://example.com/a')];
tests/unit/search/dedup.test.ts
- Executable scriptline 1
Executable file - Network accessline 6
it('merges duplicate URLs keeping highest score', () => { const results: RawSearchResult[] = [ { title: 'React Docs', url: 'https://react.dev/learn', snippet: 'Learn React', relevance_score: 0.9, engine: 'searxng' }, - Network accessline 7
const results: RawSearchResult[] = [ { title: 'React Docs', url: 'https://react.dev/learn', snippet: 'Learn React', relevance_score: 0.9, engine: 'searxng' }, { title: 'React - Learn', url: 'https://react.dev/learn', snippet: 'R - Network accessline 8
{ title: 'React Docs', url: 'https://react.dev/learn', snippet: 'Learn React', relevance_score: 0.9, engine: 'searxng' }, - Network accessline 9
{ title: 'React - Learn', url: 'https://react.dev/learn', snippet: 'React learning guide', relevance_score: 0.7, engine: 'duckduckgo' }, - Network accessline 18
it('normalizes URLs before comparing (www, trailing slash, tracking params)', () => { const results: RawSearchResult[] = [ { title: 'Example', url: 'https://www.example.com/', snippet: 'A', relevance_score: 0.8, engine: 'bing' }, - Network accessline 19
const results: RawSearchResult[] = [ { title: 'Example', url: 'https://www.example.com/', snippet: 'A', relevance_score: 0.8, engine: 'bing' }, { title: 'Example', url: 'https://example.com?utm_source=google', snippet: 'B', rele - Network accessline 20
{ title: 'Example', url: 'https://www.example.com/', snippet: 'A', relevance_score: 0.8, engine: 'bing' }, - Network accessline 21
{ title: 'Example', url: 'https://example.com?utm_source=google', snippet: 'B', relevance_score: 0.6, engine: 'duckduckgo' }, - Network accessline 28
it('sorts results by relevance score descending', () => { const results: RawSearchResult[] = [ { title: 'Low', url: 'https://low.com', snippet: '', relevance_score: 0.3, engine: 'a' }, - Network accessline 29
const results: RawSearchResult[] = [ { title: 'Low', url: 'https://low.com', snippet: '', relevance_score: 0.3, engine: 'a' }, { title: 'High', url: 'https://high.com', snippet: '', relevance_score: 0.9, engine: 'a' }, - Network accessline 30
{ title: 'Low', url: 'https://low.com', snippet: '', relevance_score: 0.3, engine: 'a' }, - Network accessline 31
{ title: 'High', url: 'https://high.com', snippet: '', relevance_score: 0.9, engine: 'a' }, - Network accessline 32
{ title: 'Mid', url: 'https://mid.com', snippet: '', relevance_score: 0.6, engine: 'a' }, - Network accessline 42
it('preserves original URL (not normalized) in output', () => { const results: RawSearchResult[] = [ { title: 'Ex', url: 'https://www.example.com/page?ref=1', snippet: '', relevance_score: 1, engine: 'a' }, - Network accessline 43
const results: RawSearchResult[] = [ { title: 'Ex', url: 'https://www.example.com/page?ref=1', snippet: '', relevance_score: 1, engine: 'a' }, ]; - Network accessline 44
{ title: 'Ex', url: 'https://www.example.com/page?ref=1', snippet: '', relevance_score: 1, engine: 'a' }, - Network accessline 45
]; const merged = deduplicateResults(results); expect(merged[0].url).toBe('https://www.example.com/page?ref=1'); - Network accessline 46
const merged = deduplicateResults(results); expect(merged[0].url).toBe('https://www.example.com/page?ref=1'); }); - Network accessline 47
expect(merged[0].url).toBe('https://www.example.com/page?ref=1'); - Network accessline 50
it('preserves published_date on merge (best score wins)', () => { const results: RawSearchResult[] = [ { title: 'Fresh', url: 'https://a.com', snippet: '', relevance_score: 0.9, engine: 'a', published_date: '2026-04-10T00:00:00Z' - Network accessline 51
const results: RawSearchResult[] = [ { title: 'Fresh', url: 'https://a.com', snippet: '', relevance_score: 0.9, engine: 'a', published_date: '2026-04-10T00:00:00Z' }, { title: 'Fresh dup', url: 'https://a.com', snippet: '', rele - Network accessline 52
{ title: 'Fresh', url: 'https://a.com', snippet: '', relevance_score: 0.9, engine: 'a', published_date: '2026-04-10T00:00:00Z' }, - Network accessline 53
{ title: 'Fresh dup', url: 'https://a.com', snippet: '', relevance_score: 0.5, engine: 'b' }, - Network accessline 59
it('preserves published_date when higher-score duplicate has it', () => { const results: RawSearchResult[] = [ { title: 'Old', url: 'https://a.com', snippet: '', relevance_score: 0.5, engine: 'a' }, - Network accessline 60
const results: RawSearchResult[] = [ { title: 'Old', url: 'https://a.com', snippet: '', relevance_score: 0.5, engine: 'a' }, { title: 'New', url: 'https://a.com', snippet: '', relevance_score: 0.9, engine: 'b', published_date: ' - Network accessline 61
{ title: 'Old', url: 'https://a.com', snippet: '', relevance_score: 0.5, engine: 'a' }, - Network accessline 62
{ title: 'New', url: 'https://a.com', snippet: '', relevance_score: 0.9, engine: 'b', published_date: '2026-04-10T00:00:00Z' },
tests/unit/search/degraded-recovery.test.ts
- Executable scriptline 1
Executable file - Network accessline 108
const bing = healthyEntry('bing', [ makeResult('bing', 'https://a.com/1'), - Network accessline 109
makeResult('bing', 'https://a.com/1'), - Network accessline 110
makeResult('bing', 'https://a.com/2'), - Network accessline 111
]); const ddg = healthyEntry('ddg', [ makeResult('ddg', 'https://b.com/1'), - Network accessline 112
const ddg = healthyEntry('ddg', [ makeResult('ddg', 'https://b.com/1'), makeResult('ddg', 'https://b.com/2'), - Network accessline 113
makeResult('ddg', 'https://b.com/1'), - Network accessline 114
makeResult('ddg', 'https://b.com/2'), - Network accessline 115
]); const probe = probeOnlyEntry('mojeek', [makeResult('mojeek', 'https://probe.com/1')]); verticalState.general = [bing, ddg, probe]; - Network accessline 116
const probe = probeOnlyEntry('mojeek', [makeResult('mojeek', 'https://probe.com/1')]); - Network accessline 126
expect(out.results.some((r) => r.url === 'https://probe.com/1')).toBe(false); - Network accessline 133
const bing = healthyEntry('bing', [makeResult('bing', 'https://only.com/1')]); - Network accessline 135
const wikiEmpty = emptyEntry('wikipedia'); const probe = probeOnlyEntry('mojeek', [ makeResult('mojeek', 'https://recovered.com/1'), - Network accessline 136
const probe = probeOnlyEntry('mojeek', [ makeResult('mojeek', 'https://recovered.com/1'), makeResult('mojeek', 'https://recovered.com/2'), - Network accessline 137
makeResult('mojeek', 'https://recovered.com/1'), - Network accessline 138
makeResult('mojeek', 'https://recovered.com/2'), - Network accessline 147
expect(out.results.some((r) => r.url === 'https://recovered.com/1')).toBe(true); - Network accessline 157
const bing = healthyEntry('bing', [makeResult('bing', 'https://one.com/1')]); - Network accessline 158
const ddgEmpty = emptyEntry('ddg'); const wikiEmpty = emptyEntry('wikipedia'); const brave = probeOnlyEntry('brave', [makeResult('brave', 'https://two.com/1')]); - Network accessline 159
const wikiEmpty = emptyEntry('wikipedia'); const brave = probeOnlyEntry('brave', [makeResult('brave', 'https://two.com/1')]); verticalState.general = [bing, ddgEmpty, wikiEmpty, brave]; - Network accessline 160
const brave = probeOnlyEntry('brave', [makeResult('brave', 'https://two.com/1')]); - Network accessline 179
const survivor = healthyEntry('bing', [ makeResult('bing', 'https://junk.example/jp'), - Network accessline 180
makeResult('bing', 'https://junk.example/jp'), - Network accessline 187
const out = await runV1Search({ query: 'kubernetes ingress controller', maxResults: 10 }); const junk = out.results.find((r) => r.url === 'https://junk.example/jp'); - Network accessline 188
const junk = out.results.find((r) => r.url === 'https://junk.example/jp'); - Network accessline 200
const bing = healthyEntry('bing', [makeResult('bing', 'https://only.com/1')]); - Network accessline 201
const ddgEmpty = emptyEntry('ddg'); const wikiEmpty = emptyEntry('wikipedia'); const probe = probeOnlyEntry('mojeek', [makeResult('mojeek', 'https://recovered.com/1')]); - Network accessline 202
const wikiEmpty = emptyEntry('wikipedia'); const probe = probeOnlyEntry('mojeek', [makeResult('mojeek', 'https://recovered.com/1')]); verticalState.general = [bing, ddgEmpty, wikiEmpty, probe]; - Network accessline 203
const probe = probeOnlyEntry('mojeek', [makeResult('mojeek', 'https://recovered.com/1')]); - Network accessline 221
const bing = healthyEntry('bing', [makeResult('bing', 'https://a.com/1')]); - Network accessline 222
const ddg = healthyEntry('ddg', [makeResult('ddg', 'https://b.com/1')]); - Network accessline 242
const entries: EngineEntry[] = []; for (let i = 0; i < 7; i++) { entries.push(healthyEntry(`e${i}`, [makeResult(`e${i}`, `https://ok${i}.com/1`)])); - Network accessline 243
for (let i = 0; i < 7; i++) { entries.push(healthyEntry(`e${i}`, [makeResult(`e${i}`, `https://ok${i}.com/1`)])); } - Network accessline 244
entries.push(healthyEntry(`e${i}`, [makeResult(`e${i}`, `https://ok${i}.com/1`)])); - Network accessline 262
const a = healthyEntry('bing', [makeResult('bing', 'https://a.com/1')]); - Network accessline 263
const b = healthyEntry('ddg', [makeResult('ddg', 'https://b.com/1')]); - Network accessline 275
const bing = healthyEntry('bing', [makeResult('bing', 'https://a.com/1')]); - Network accessline 276
const ddg = healthyEntry('ddg', [makeResult('ddg', 'https://b.com/1')]); - Network accessline 277
const wiki = healthyEntry('wikipedia', [makeResult('wikipedia', 'https://c.com/1')]); - Network accessline 289
const bing = healthyEntry('bing', [makeResult('bing', 'https://only.com/1')]); - Network accessline 304
const bing = healthyEntry('bing', [makeResult('bing', 'https://good.com/1')]); - Network accessline 305
const ddg = healthyEntry('ddg', [makeResult('ddg', 'https://good.com/2')]); - Network accessline 306
const probe = probeOnlyEntry('mojeek', [makeResult('mojeek', 'https://noise.com/1')]); - Network accessline 311
expect(probe.engine.search).not.toHaveBeenCalled(); expect(out.results.some((r) => r.url === 'https://good.com/1')).toBe(true); - Network accessline 312
expect(out.results.some((r) => r.url === 'https://good.com/1')).toBe(true); - Network accessline 313
expect(out.results.some((r) => r.url === 'https://good.com/2')).toBe(true); - Network accessline 314
expect(out.results.some((r) => r.url === 'https://noise.com/1')).toBe(false);
tests/unit/search/engine-breaker.test.ts
tests/unit/search/engine-health.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted]
tests/unit/search/engine-quality.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/engine-soft-deadline.test.ts
- Executable scriptline 1
Executable file - Network accessline 73
it('returns as soon as the soft deadline elapses without blocking on a hung engine', async () => { const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 74
const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), hangingEngine('marginalia'), - Network accessline 75
fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 92
it('still collects a slow-but-within-deadline engine before returning', async () => { const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 93
const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), slowEngine('marginalia', 1_500, [makeResult('marginalia', 'https://b.com/1')]), - Network accessline 94
fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 95
slowEngine('marginalia', 1_500, [makeResult('marginalia', 'https://b.com/1')]), - Network accessline 108
it('resolves immediately once ALL engines settle, without waiting out the deadline', async () => { const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 109
const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), slowEngine('marginalia', 500, [makeResult('marginalia', 'https://b.com/1')]), - Network accessline 110
fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 111
slowEngine('marginalia', 500, [makeResult('marginalia', 'https://b.com/1')]), - Network accessline 121
it('preserves legacy Promise.all behaviour when no soft deadline is given', async () => { const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 122
const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), slowEngine('marginalia', 3_000, [makeResult('marginalia', 'https://b.com/1')]), - Network accessline 123
fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 124
slowEngine('marginalia', 3_000, [makeResult('marginalia', 'https://b.com/1')]), - Network accessline 163
if (calls <= 3) throw new Error('down'); return [makeResult('e', 'https://ok/1')]; - Network accessline 164
return [makeResult('e', 'https://ok/1')]; - Network accessline 248
const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 249
fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 270
const entries: EngineEntry[] = [ fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 271
fastEngine('bing', [makeResult('bing', 'https://a.com/1')]), - Network accessline 272
slowEngine('healthy', 2_000, [makeResult('healthy', 'https://b.com/1')]),
tests/unit/search/engine-telemetry.test.ts
- Executable scriptline 1
Executable file - Network accessline 82
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://a.com/x'), - Network accessline 83
makeEntry('bing', [ makeResult('bing', 'https://a.com/x'), makeResult('bing', 'https://b.com/x'), - Network accessline 84
makeResult('bing', 'https://a.com/x'), - Network accessline 85
makeResult('bing', 'https://b.com/x'), - Network accessline 115
}; verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 116
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), { engine: breakerEngine }, - Network accessline 117
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 141
name: 'mojeek', search: vi.fn(async (q: string) => { if (q === 'q1') return [makeResult('mojeek', 'https://m.com/x')]; - Network accessline 142
search: vi.fn(async (q: string) => { if (q === 'q1') return [makeResult('mojeek', 'https://m.com/x')]; throw new BreakerOpenError('mojeek', 42_000); - Network accessline 143
if (q === 'q1') return [makeResult('mojeek', 'https://m.com/x')]; - Network accessline 146
}; verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 147
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), { engine: flaky }, - Network accessline 148
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 176
}; verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 177
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), { engine: dark }, - Network accessline 178
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 195
it('marks failing engine outcome=error', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 196
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), makeFailingEntry('ddg'), - Network accessline 197
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 231
it('emits empty engine_warnings when no engine errored', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 232
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), ]; - Network accessline 233
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 246
it('promotes a 400 engine failure into engine_warnings with http_400 code', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 247
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), makeHttpStatusFailingEntry('lobsters', 400), - Network accessline 248
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 264
it('promotes a github-code 401 with the WIGOLO_GITHUB_TOKEN env hint', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 265
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), makeHttpStatusFailingEntry('github-code', 401), - Network accessline 266
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]),
tests/unit/search/engine-throttle.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
function makeResult(engine: string): RawSearchResult { return { title: 'T', url: `https://x/${engine}`, snippet: '', relevance_score: 1, engine }; - Network accessline 31
return { title: 'T', url: `https://x/${engine}`, snippet: '', relevance_score: 1, engine };
tests/unit/search/engine-warnings.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/engines-used-semantics.test.ts
- Executable scriptline 1
Executable file - Network accessline 106
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 107
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 127
it('failing engine appears in engine_telemetry but not in engines_used', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 128
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), makeFailingEntry('ddg'), - Network accessline 129
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 153
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 154
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 155
makeEntry('ddg', [makeResult('ddg', 'https://a.com/x')]),
tests/unit/search/engines/arxiv.test.ts
- Executable scriptline 1
Executable file - Network accessline 23
const ATOM_FIXTURE = `<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - Network accessline 24
<feed xmlns="http://www.w3.org/2005/Atom"> - Network accessline 25
<entry> <id>http://arxiv.org/abs/2301.00001v1</id> <title> - Network accessline 26
<id>http://arxiv.org/abs/2301.00001v1</id> - Network accessline 33
</entry> <entry> <id>http://arxiv.org/abs/2301.00002v1</id> - Network accessline 34
<entry> <id>http://arxiv.org/abs/2301.00002v1</id> <title>Second Paper</title> - Network accessline 35
<id>http://arxiv.org/abs/2301.00002v1</id> - Network accessline 55
expect(results).toHaveLength(2); expect(results[0].title).toBe('Attention Is All You Need: A Survey'); expect(results[0].url).toBe('http://arxiv.org/abs/2301.00001v1'); - Network accessline 56
expect(results[0].title).toBe('Attention Is All You Need: A Survey'); expect(results[0].url).toBe('http://arxiv.org/abs/2301.00001v1'); expect(results[0].engine).toBe('arxiv'); - Network accessline 57
expect(results[0].url).toBe('http://arxiv.org/abs/2301.00001v1'); - Network accessline 78
it('returns empty array when there are no entries', async () => { captureFetch('<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom"></feed>'); - Network accessline 79
captureFetch('<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom"></feed>'); - Network accessline 88
it('encodes max_results from maxResults', async () => { const { calls } = captureFetch('<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom"></feed>'); - Network accessline 89
const { calls } = captureFetch('<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom"></feed>'); - Network accessline 94
it('passes AbortSignal to fetch', async () => { const { calls } = captureFetch('<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom"></feed>'); - Network accessline 95
const { calls } = captureFetch('<?xml version="1.0"?><feed xmlns="http://www.w3.org/2005/Atom"></feed>');
tests/unit/search/engines/bing-decoder.test.ts
- Executable scriptline 1
Executable file - Network accessline 20
it('returns the input unchanged for a non-Bing URL', () => { const url = 'https://example.com/foo?q=bar'; - Network accessline 21
const url = 'https://example.com/foo?q=bar'; - Network accessline 25
it('returns the input unchanged when the Bing URL has no u param', () => { const url = 'https://www.bing.com/ck/a?foo=bar'; - Network accessline 26
const url = 'https://www.bing.com/ck/a?foo=bar'; - Network accessline 30
it('returns the input unchanged for malformed base64', () => { const url = 'https://www.bing.com/ck/a?u=xx!!!notbase64!!!'; - Network accessline 31
const url = 'https://www.bing.com/ck/a?u=xx!!!notbase64!!!'; - Network accessline 35
it('returns the input unchanged when decoded value is not a valid URL', () => { const encoded = Buffer.from('not a url').toString('base64'); const url = `https://www.bing.com/ck/a?u=a1${encoded}`; - Network accessline 36
const encoded = Buffer.from('not a url').toString('base64'); const url = `https://www.bing.com/ck/a?u=a1${encoded}`; expect(decodeBingTrackerUrl(url)).toBe(url); - Network accessline 37
const url = `https://www.bing.com/ck/a?u=a1${encoded}`;
tests/unit/search/engines/bing-news.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
<html><body> <li class="news-card"> <h3><a href="https://news.example/story-1">First story</a></h3> - Network accessline 10
<li class="news-card"> <h3><a href="https://news.example/story-1">First story</a></h3> <div class="snippet">Quarterly results beat expectations.</div> - Network accessline 11
<h3><a href="https://news.example/story-1">First story</a></h3> - Network accessline 21
expect(results).toHaveLength(1); expect(results[0].title).toBe('First story'); expect(results[0].url).toBe('https://news.example/story-1'); - Network accessline 22
expect(results[0].title).toBe('First story'); expect(results[0].url).toBe('https://news.example/story-1'); expect(results[0].snippet).toContain('Quarterly results'); - Network accessline 23
expect(results[0].url).toBe('https://news.example/story-1'); - Network accessline 31
<html><body> <div class="news-card-body"> <a class="news-card-title" href="https://news.example/story-2">Second story</a> - Network accessline 32
<div class="news-card-body"> <a class="news-card-title" href="https://news.example/story-2">Second story</a> <div class="news-card-body-text">Major announcement today.</div> - Network accessline 33
<a class="news-card-title" href="https://news.example/story-2">Second story</a> - Network accessline 46
it('decodes /ck/a tracker URLs in the link href', () => { const target = 'https://news.example/wrapped'; - Network accessline 47
const target = 'https://news.example/wrapped'; - Network accessline 49
const trackerUrl = `https://www.bing.com/ck/a?u=a1${encoded}`; - Network accessline 65
const cards = Array.from({ length: 6 }, (_, i) => ` <li class="news-card"> <h3><a href="https://news.example/s/${i}">Story ${i}</a></h3> - Network accessline 66
<li class="news-card"> <h3><a href="https://news.example/s/${i}">Story ${i}</a></h3> <div class="snippet">Snippet ${i}</div> - Network accessline 67
<h3><a href="https://news.example/s/${i}">Story ${i}</a></h3> - Network accessline 79
<html><body> <li class="news-card"><h3><a href="">No href</a></h3></li> <li class="news-card"><h3><a href="https://news.example/ok">OK</a></h3><div class="snippet">x</div></li> - Network accessline 80
<li class="news-card"><h3><a href="">No href</a></h3></li> <li class="news-card"><h3><a href="https://news.example/ok">OK</a></h3><div class="snippet">x</div></li> </body></html> - Network accessline 81
<li class="news-card"><h3><a href="https://news.example/ok">OK</a></h3><div class="snippet">x</div></li> - Network accessline 92
<html><body> <li class="b_algo"> <h2><a href="https://news.example/inline">Inline story</a></h2> - Network accessline 93
<li class="b_algo"> <h2><a href="https://news.example/inline">Inline story</a></h2> <p class="b_caption"><span aria-label="2 days ago">2 days ago</span> Some context.</p> - Network accessline 94
<h2><a href="https://news.example/inline">Inline story</a></h2>
tests/unit/search/engines/bing.test.ts
- Executable scriptline 1
Executable file - Network accessline 46
expect(results.length).toBe(3); expect(results[0].title).toBe('React'); expect(results[0].url).toBe('https://react.dev/'); - Network accessline 47
expect(results[0].title).toBe('React'); expect(results[0].url).toBe('https://react.dev/'); expect(results[0].snippet).toContain('library for web'); - Network accessline 48
expect(results[0].url).toBe('https://react.dev/');
tests/unit/search/engines/brave-image.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 7
[Credential-related source omitted] - Access to secretsline 8
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 36
{ title: 'A cat', url: 'https://example.com/cats', - Network accessline 37
title: 'A cat', url: 'https://example.com/cats', properties: { url: 'https://cdn.example.com/cat.jpg' }, - Network accessline 38
url: 'https://example.com/cats', - Network accessline 39
properties: { url: 'https://cdn.example.com/cat.jpg' }, - Network accessline 40
thumbnail: { src: 'https://cdn.example.com/cat-thumb.jpg' }, - Network accessline 45
{ title: 'Other cat', url: 'https://other.example/cat', - Network accessline 46
title: 'Other cat', url: 'https://other.example/cat', properties: { url: 'https://cdn.example.com/cat2.png' }, - Network accessline 47
url: 'https://other.example/cat', - Network accessline 48
properties: { url: 'https://cdn.example.com/cat2.png' }, - Network accessline 49
thumbnail: { src: 'https://cdn.example.com/cat2-thumb.png' }, - Network accessline 56
expect(results[0]).toMatchObject({ title: 'A cat', url: 'https://example.com/cats', - Network accessline 57
title: 'A cat', url: 'https://example.com/cats', image_url: 'https://cdn.example.com/cat.jpg', - Network accessline 58
url: 'https://example.com/cats', - Network accessline 59
image_url: 'https://cdn.example.com/cat.jpg', - Network accessline 60
thumbnail_url: 'https://cdn.example.com/cat-thumb.jpg', - Network accessline 75
const body = { results: [ { title: 'A', url: 'https://s/a', properties: { url: 'https://i/a.jpg' } }, - Network accessline 76
results: [ { title: 'A', url: 'https://s/a', properties: { url: 'https://i/a.jpg' } }, { title: 'B', url: 'https://s/b', properties: { url: 'https://i/b.jpg' } }, - Network accessline 77
{ title: 'A', url: 'https://s/a', properties: { url: 'https://i/a.jpg' } }, - Network accessline 78
{ title: 'B', url: 'https://s/b', properties: { url: 'https://i/b.jpg' } }, - Network accessline 79
{ title: 'C', url: 'https://s/c', properties: { url: 'https://i/c.jpg' } }, - Network accessline 86
const body = { results: [ { title: 'A', url: 'https://s/a', properties: { url: 'https://i/a.jpg' } }, // ok - Network accessline 87
results: [ { title: 'A', url: 'https://s/a', properties: { url: 'https://i/a.jpg' } }, // ok { title: 'B', url: 'https://s/b' }, // no properties - Network accessline 88
{ title: 'A', url: 'https://s/a', properties: { url: 'https://i/a.jpg' } }, // ok - Network accessline 89
{ title: 'B', url: 'https://s/b' }, // no properties - Network accessline 90
{ title: 'C', url: 'https://s/c', properties: {} }, // no properties.url - Network accessline 91
{ title: 'D', properties: { url: 'https://i/d.jpg' } }, // no url (source) - Network accessline 100
{ title: 'only-w', url: 'https://s/x', - Network accessline 101
title: 'only-w', url: 'https://s/x', properties: { url: 'https://i/x.jpg' }, - Network accessline 102
url: 'https://s/x', - Network accessline 103
properties: { url: 'https://i/x.jpg' }, - Network accessline 106
{ title: 'both', url: 'https://s/z', - Network accessline 107
title: 'both', url: 'https://s/z', properties: { url: 'https://i/z.jpg' }, - Network accessline 108
url: 'https://s/z', - Network accessline 109
properties: { url: 'https://i/z.jpg' },
tests/unit/search/engines/brave.test.ts
- Executable scriptline 1
Executable file - Network accessline 13
web: { results: [ { title: 'Next.js', url: 'https://nextjs.org/', description: 'React framework', page_age: '2026-04-12T00:00:00Z' }, - Network accessline 14
results: [ { title: 'Next.js', url: 'https://nextjs.org/', description: 'React framework', page_age: '2026-04-12T00:00:00Z' }, { title: 'React docs', url: 'https://react.dev/', description: 'Library' }, - Network accessline 15
{ title: 'Next.js', url: 'https://nextjs.org/', description: 'React framework', page_age: '2026-04-12T00:00:00Z' }, - Network accessline 16
{ title: 'React docs', url: 'https://react.dev/', description: 'Library' }, - Network accessline 22
expect(results[0]).toMatchObject({ title: 'Next.js', url: 'https://nextjs.org/', - Network accessline 23
title: 'Next.js', url: 'https://nextjs.org/', engine: 'brave', - Network accessline 24
url: 'https://nextjs.org/', - Network accessline 39
web: { results: [ { title: 'A', url: 'https://a' }, - Network accessline 40
results: [ { title: 'A', url: 'https://a' }, { title: 'B', url: 'https://b' }, - Network accessline 41
{ title: 'A', url: 'https://a' }, - Network accessline 42
{ title: 'B', url: 'https://b' }, - Network accessline 43
{ title: 'C', url: 'https://c' }, - Network accessline 52
web: { results: [ { title: 'A', url: 'https://a' }, - Network accessline 53
results: [ { title: 'A', url: 'https://a' }, { title: '', url: 'https://b' }, - Network accessline 54
{ title: 'A', url: 'https://a' }, - Network accessline 55
{ title: '', url: 'https://b' }, - Network accessline 56
{ url: 'https://c' },
tests/unit/search/engines/crates-io.test.ts
- Executable scriptline 1
Executable file - Network accessline 51
expect(results).toHaveLength(1); expect(results[0].title).toBe('serde'); expect(results[0].url).toBe('https://crates.io/crates/serde'); - Network accessline 52
expect(results[0].title).toBe('serde'); expect(results[0].url).toBe('https://crates.io/crates/serde'); expect(results[0].engine).toBe('crates-io'); - Network accessline 53
expect(results[0].url).toBe('https://crates.io/crates/serde'); - Network accessline 86
const headers = calls[0].init?.headers as Record<string, string>; expect(headers['User-Agent']).toContain('wigolo'); expect(headers['User-Agent']).toContain('https://github.com/KnockOutEZ/wigolo'); - Network accessline 87
expect(headers['User-Agent']).toContain('wigolo'); expect(headers['User-Agent']).toContain('https://github.com/KnockOutEZ/wigolo'); }); - Network accessline 88
expect(headers['User-Agent']).toContain('https://github.com/KnockOutEZ/wigolo');
tests/unit/search/engines/date-parsing.test.ts
- Executable scriptline 1
Executable file - Network accessline 11
const html = `<html><body><ol id="b_results"> <li class="b_algo"> <h2><a href="https://example.com/news">News Article</a></h2> - Network accessline 12
<li class="b_algo"> <h2><a href="https://example.com/news">News Article</a></h2> <div class="b_caption"><p class="b_lineclamp2">Jan 15, 2025 - Breaking news about tech layoffs.</p></div> - Network accessline 13
<h2><a href="https://example.com/news">News Article</a></h2> - Network accessline 23
const html = `<html><body><ol id="b_results"> <li class="b_algo"> <h2><a href="https://example.com/blog">Blog Post</a></h2> - Network accessline 24
<li class="b_algo"> <h2><a href="https://example.com/blog">Blog Post</a></h2> <div class="b_caption"><p class="b_lineclamp2">2025-03-20 · A new approach to testing.</p></div> - Network accessline 25
<h2><a href="https://example.com/blog">Blog Post</a></h2> - Network accessline 35
const html = `<html><body><ol id="b_results"> <li class="b_algo"> <h2><a href="https://example.com/recent">Recent</a></h2> - Network accessline 36
<li class="b_algo"> <h2><a href="https://example.com/recent">Recent</a></h2> <div class="b_caption"><p class="b_lineclamp2">3 days ago - Something happened recently.</p></div> - Network accessline 37
<h2><a href="https://example.com/recent">Recent</a></h2> - Network accessline 51
const html = `<html><body><ol id="b_results"> <li class="b_algo"> <h2><a href="https://example.com/page">Page</a></h2> - Network accessline 52
<li class="b_algo"> <h2><a href="https://example.com/page">Page</a></h2> <div class="b_caption"><p class="b_lineclamp2">A regular page with no date prefix.</p></div> - Network accessline 53
<h2><a href="https://example.com/page">Page</a></h2> - Network accessline 74
it('extracts date from snippet prefix', () => { const html = `<html><body> <a class="result-link" href="https://example.com/news">News</a> - Network accessline 75
const html = `<html><body> <a class="result-link" href="https://example.com/news">News</a> <td class="result-snippet">Feb 10, 2025 - Breaking news.</td> - Network accessline 76
<a class="result-link" href="https://example.com/news">News</a> - Network accessline 84
it('returns undefined for snippets without dates', () => { const html = `<html><body> <a class="result-link" href="https://example.com/page">Page</a> - Network accessline 85
const html = `<html><body> <a class="result-link" href="https://example.com/page">Page</a> <td class="result-snippet">A regular snippet without date.</td> - Network accessline 86
<a class="result-link" href="https://example.com/page">Page</a>
tests/unit/search/engines/dblp.test.ts
- Executable scriptline 1
Executable file - Network accessline 45
venue: 'NeurIPS', year: '2017', ee: 'https://doi.org/10.5555/3295222.3295349', - Network accessline 46
year: '2017', ee: 'https://doi.org/10.5555/3295222.3295349', url: 'https://dblp.org/rec/conf/nips/VaswaniSPUJGKP17', - Network accessline 47
ee: 'https://doi.org/10.5555/3295222.3295349', - Network accessline 48
url: 'https://dblp.org/rec/conf/nips/VaswaniSPUJGKP17', - Network accessline 53
venue: 'NAACL-HLT', year: '2019', ee: 'https://doi.org/10.18653/v1/n19-1423', - Network accessline 54
year: '2019', ee: 'https://doi.org/10.18653/v1/n19-1423', }, - Network accessline 55
ee: 'https://doi.org/10.18653/v1/n19-1423', - Network accessline 64
expect(results[0].url).toBe('https://doi.org/10.5555/3295222.3295349'); - Network accessline 75
it('falls back to the dblp record url when ee is absent', async () => { const body = dblpBody([ { title: 'A paper', venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/x' }, - Network accessline 76
const body = dblpBody([ { title: 'A paper', venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/x' }, ]); - Network accessline 77
{ title: 'A paper', venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/x' }, - Network accessline 79
captureFetch(body); const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/x'); - Network accessline 80
const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/x'); }); - Network accessline 81
expect(results[0].url).toBe('https://dblp.org/rec/x'); - Network accessline 90
captureFetch(body); const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/conf/x/y.html'); - Network accessline 91
const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/conf/x/y.html'); }); - Network accessline 92
expect(results[0].url).toBe('https://dblp.org/rec/conf/x/y.html'); - Network accessline 99
captureFetch(body); const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/z'); - Network accessline 100
const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/z'); }); - Network accessline 101
expect(results[0].url).toBe('https://dblp.org/rec/z'); - Network accessline 105
it('falls back to url when ee is a malformed value', async () => { const body = dblpBody([ { title: 'A paper', venue: 'ICML', year: '2020', ee: 'http://', url: 'https://dblp.org/rec/w' }, - Network accessline 106
const body = dblpBody([ { title: 'A paper', venue: 'ICML', year: '2020', ee: 'http://', url: 'https://dblp.org/rec/w' }, ]); - Network accessline 107
{ title: 'A paper', venue: 'ICML', year: '2020', ee: 'http://', url: 'https://dblp.org/rec/w' }, - Network accessline 109
captureFetch(body); const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/w'); - Network accessline 110
const results = await new DblpEngine().search('q'); expect(results[0].url).toBe('https://dblp.org/rec/w'); }); - Network accessline 111
expect(results[0].url).toBe('https://dblp.org/rec/w'); - Network accessline 115
const body = dblpBody([ { title: 'linkless', venue: 'ICML', year: '2020' }, { title: 'keeper', venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/y' }, - Network accessline 116
{ title: 'linkless', venue: 'ICML', year: '2020' }, { title: 'keeper', venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/y' }, ]); - Network accessline 117
{ title: 'keeper', venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/y' }, - Network accessline 125
it('skips a hit with no title', async () => { const body = dblpBody([ { venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/z' }, - Network accessline 126
const body = dblpBody([ { venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/z' }, { title: 'real', url: 'https://dblp.org/rec/w' }, - Network accessline 127
{ venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/z' }, - Network accessline 128
{ title: 'real', url: 'https://dblp.org/rec/w' }, - Network accessline 136
it('builds a venue-only snippet when authors and year are missing', async () => { const body = dblpBody([{ title: 't', venue: 'ICML', url: 'https://dblp.org/rec/a' }]); - Network accessline 137
const body = dblpBody([{ title: 't', venue: 'ICML', url: 'https://dblp.org/rec/a' }]); - Network accessline 150
venue: 'Comput. J.', year: '1984', url: 'https://dblp.org/rec/x', - Network accessline 151
year: '1984', url: 'https://dblp.org/rec/x', }, - Network accessline 152
url: 'https://dblp.org/rec/x', - Network accessline 172
venue: 'ICML', year: '2020', url: 'https://dblp.org/rec/y', - Network accessline 173
year: '2020', url: 'https://dblp.org/rec/y', }, - Network accessline 174
url: 'https://dblp.org/rec/y', - Network accessline 182
it('omits published_date when year is not a 4-digit value', async () => { const body = dblpBody([ { title: 't', venue: 'ICML', year: 'n/a', url: 'https://dblp.org/rec/a' }, - Network accessline 183
const body = dblpBody([ { title: 't', venue: 'ICML', year: 'n/a', url: 'https://dblp.org/rec/a' }, ]); - Network accessline 184
{ title: 't', venue: 'ICML', year: 'n/a', url: 'https://dblp.org/rec/a' },
tests/unit/search/engines/ddg-image.test.ts
- Executable scriptline 1
Executable file - Network accessline 28
{ title: 'A cat', image: 'https://cdn.example.com/cat.jpg', - Network accessline 29
title: 'A cat', image: 'https://cdn.example.com/cat.jpg', thumbnail: 'https://cdn.example.com/cat-thumb.jpg', - Network accessline 30
image: 'https://cdn.example.com/cat.jpg', - Network accessline 31
thumbnail: 'https://cdn.example.com/cat-thumb.jpg', - Network accessline 32
url: 'https://example.com/cats', - Network accessline 37
{ title: 'Another cat', image: 'https://cdn.example.com/cat2.png', - Network accessline 38
title: 'Another cat', image: 'https://cdn.example.com/cat2.png', thumbnail: 'https://cdn.example.com/cat2-thumb.png', - Network accessline 39
image: 'https://cdn.example.com/cat2.png', - Network accessline 40
thumbnail: 'https://cdn.example.com/cat2-thumb.png', - Network accessline 41
url: 'https://other.example/cat', - Network accessline 54
url: 'https://example.com/cats', - Network accessline 55
image_url: 'https://cdn.example.com/cat.jpg', - Network accessline 56
thumbnail_url: 'https://cdn.example.com/cat-thumb.jpg', - Network accessline 72
const body = { results: [ { title: 'a', image: 'https://i/a', url: 'https://s/a' }, - Network accessline 73
results: [ { title: 'a', image: 'https://i/a', url: 'https://s/a' }, { title: 'b', image: 'https://i/b', url: 'https://s/b' }, - Network accessline 74
{ title: 'a', image: 'https://i/a', url: 'https://s/a' }, - Network accessline 75
{ title: 'b', image: 'https://i/b', url: 'https://s/b' }, - Network accessline 76
{ title: 'c', image: 'https://i/c', url: 'https://s/c' }, - Network accessline 83
const body = { results: [ { title: 'A', image: 'https://i/a', url: 'https://s/a' }, - Network accessline 84
results: [ { title: 'A', image: 'https://i/a', url: 'https://s/a' }, { title: 'B', image: '', url: 'https://s/b' }, // no image - Network accessline 85
{ title: 'A', image: 'https://i/a', url: 'https://s/a' }, - Network accessline 86
{ title: 'B', image: '', url: 'https://s/b' }, // no image - Network accessline 87
{ title: 'C', url: 'https://s/c' }, // no image - Network accessline 88
{ title: 'D', image: 'https://i/d' }, // no source url - Network accessline 95
const body = { results: [ { title: 'only-w', image: 'https://i/x', url: 'https://s/x', width: 100 }, - Network accessline 96
results: [ { title: 'only-w', image: 'https://i/x', url: 'https://s/x', width: 100 }, { title: 'only-h', image: 'https://i/y', url: 'https://s/y', height: 200 }, - Network accessline 97
{ title: 'only-w', image: 'https://i/x', url: 'https://s/x', width: 100 }, - Network accessline 98
{ title: 'only-h', image: 'https://i/y', url: 'https://s/y', height: 200 }, - Network accessline 99
{ title: 'both', image: 'https://i/z', url: 'https://s/z', width: 50, height: 60 },
tests/unit/search/engines/devdocs.test.ts
- Executable scriptline 1
Executable file - Network accessline 10
const results = await new DevDocsEngine().search('react hooks'); expect(results.length).toBeGreaterThan(0); const reactHit = results.find((r) => r.url === 'https://devdocs.io/react'); - Network accessline 11
expect(results.length).toBeGreaterThan(0); const reactHit = results.find((r) => r.url === 'https://devdocs.io/react'); expect(reactHit).toBeDefined(); - Network accessline 12
const reactHit = results.find((r) => r.url === 'https://devdocs.io/react'); - Network accessline 19
const results = await new DevDocsEngine().search('typescript node'); const slugs = results.map((r) => r.url); expect(slugs).toContain('https://devdocs.io/typescript'); - Network accessline 20
const slugs = results.map((r) => r.url); expect(slugs).toContain('https://devdocs.io/typescript'); expect(slugs).toContain('https://devdocs.io/node'); - Network accessline 21
expect(slugs).toContain('https://devdocs.io/typescript'); - Network accessline 22
expect(slugs).toContain('https://devdocs.io/node');
tests/unit/search/engines/duckduckgo.test.ts
- Executable scriptline 1
Executable file - Network accessline 16
expect(results.length).toBe(3); expect(results[0].title).toBe('React – Learn'); expect(results[0].url).toBe('https://react.dev/learn'); - Network accessline 17
expect(results[0].title).toBe('React – Learn'); expect(results[0].url).toBe('https://react.dev/learn'); expect(results[0].snippet).toContain('official React'); - Network accessline 18
expect(results[0].url).toBe('https://react.dev/learn'); - Network accessline 42
'<tr><td><a class="result-link" href="//duckduckgo.com/l/?uddg=https%3A%2F%2Freact.dev%2Flearn&rut=abc">React</a></td></tr>', '<tr><td class="result-snippet">official React</td></tr>', '<tr><td><a class="result-link" href="https - Network accessline 43
'<tr><td class="result-snippet">official React</td></tr>', '<tr><td><a class="result-link" href="https://lite.duckduckgo.com/l/?uddg=https%3A%2F%2Fdocs.python.org%2F3%2F">Python docs</a></td></tr>', '<tr><td class="result-snippe - Network accessline 44
'<tr><td><a class="result-link" href="https://lite.duckduckgo.com/l/?uddg=https%3A%2F%2Fdocs.python.org%2F3%2F">Python docs</a></td></tr>', - Network accessline 48
const results = engine.parseResults(wrapped, 10); expect(results).toHaveLength(2); expect(results[0].url).toBe('https://react.dev/learn'); - Network accessline 49
expect(results).toHaveLength(2); expect(results[0].url).toBe('https://react.dev/learn'); expect(results[1].url).toBe('https://docs.python.org/3/'); - Network accessline 50
expect(results[0].url).toBe('https://react.dev/learn'); - Network accessline 51
expect(results[1].url).toBe('https://docs.python.org/3/'); - Network accessline 55
const html = [ '<html><body><table>', '<tr><td><a class="result-link" href="https://example.com/page">Example</a></td></tr>', - Network accessline 56
'<html><body><table>', '<tr><td><a class="result-link" href="https://example.com/page">Example</a></td></tr>', '<tr><td class="result-snippet">Plain link</td></tr>', - Network accessline 57
'<tr><td><a class="result-link" href="https://example.com/page">Example</a></td></tr>', - Network accessline 61
const results = engine.parseResults(html, 10); expect(results).toHaveLength(1); expect(results[0].url).toBe('https://example.com/page'); - Network accessline 62
expect(results).toHaveLength(1); expect(results[0].url).toBe('https://example.com/page'); }); - Network accessline 63
expect(results[0].url).toBe('https://example.com/page');
tests/unit/search/engines/github-code.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Network accessline 47
name: 'foo.ts', path: 'src/foo.ts', html_url: 'https://github.com/user/repo/blob/sha/src/foo.ts', - Network accessline 48
path: 'src/foo.ts', html_url: 'https://github.com/user/repo/blob/sha/src/foo.ts', repository: { full_name: 'user/repo', description: 'an example repo' }, - Network accessline 49
html_url: 'https://github.com/user/repo/blob/sha/src/foo.ts', - Network accessline 53
name: 'bar.ts', path: 'src/bar.ts', html_url: 'https://github.com/user/repo/blob/sha/src/bar.ts', - Network accessline 54
path: 'src/bar.ts', html_url: 'https://github.com/user/repo/blob/sha/src/bar.ts', repository: { full_name: 'user/repo', description: null }, - Network accessline 55
html_url: 'https://github.com/user/repo/blob/sha/src/bar.ts', - Network accessline 63
expect(results).toHaveLength(2); expect(results[0].title).toBe('user/repo — src/foo.ts'); expect(results[0].url).toBe('https://github.com/user/repo/blob/sha/src/foo.ts'); - Network accessline 65
expect(results[0].url).toBe('https://github.com/user/repo/blob/sha/src/foo.ts'); - Access to secretsline 124
[Credential-related source omitted] - Network accessline 150
name: 'config.ts', path: 'packages/server/src/config.ts', html_url: 'https://github.com/acme/x/blob/sha/packages/server/src/config.ts', - Network accessline 151
path: 'packages/server/src/config.ts', html_url: 'https://github.com/acme/x/blob/sha/packages/server/src/config.ts', repository: { full_name: 'acme/x', description: 'tooling for config-driven apps' }, - Network accessline 152
html_url: 'https://github.com/acme/x/blob/sha/packages/server/src/config.ts',
tests/unit/search/engines/hn-algolia.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
objectID: '37245102', title: 'Why Rust', url: 'https://example.com/rust', - Network accessline 41
title: 'Why Rust', url: 'https://example.com/rust', story_text: null, - Network accessline 42
url: 'https://example.com/rust', - Network accessline 54
expect(results).toHaveLength(1); expect(results[0].title).toBe('Why Rust'); expect(results[0].url).toBe('https://example.com/rust'); - Network accessline 55
expect(results[0].title).toBe('Why Rust'); expect(results[0].url).toBe('https://example.com/rust'); expect(results[0].engine).toBe('hn-algolia'); - Network accessline 56
expect(results[0].url).toBe('https://example.com/rust'); - Network accessline 77
captureFetch(body); const results = await new HnAlgoliaEngine().search('q'); expect(results[0].url).toBe('https://news.ycombinator.com/item?id=42'); - Network accessline 78
const results = await new HnAlgoliaEngine().search('q'); expect(results[0].url).toBe('https://news.ycombinator.com/item?id=42'); }); - Network accessline 79
expect(results[0].url).toBe('https://news.ycombinator.com/item?id=42'); - Network accessline 87
objectID: '1', title: 't', url: 'https://x.test/', - Network accessline 88
title: 't', url: 'https://x.test/', story_text: longText, - Network accessline 89
url: 'https://x.test/',
tests/unit/search/engines/lobsters.test.ts
- Executable scriptline 1
Executable file - Network accessline 41
short_id: 'abc', title: 'Foo', url: 'https://example.com/foo', - Network accessline 42
title: 'Foo', url: 'https://example.com/foo', score: 42, - Network accessline 43
url: 'https://example.com/foo', - Network accessline 46
comment_count: 7, created_at: '2025-05-01T12:34:56.000-07:00', short_id_url: 'https://lobste.rs/s/abc', - Network accessline 47
created_at: '2025-05-01T12:34:56.000-07:00', short_id_url: 'https://lobste.rs/s/abc', }, - Network accessline 48
short_id_url: 'https://lobste.rs/s/abc', - Network accessline 53
expect(results).toHaveLength(1); expect(results[0].title).toBe('Foo'); expect(results[0].url).toBe('https://example.com/foo'); - Network accessline 54
expect(results[0].title).toBe('Foo'); expect(results[0].url).toBe('https://example.com/foo'); expect(results[0].engine).toBe('lobsters'); - Network accessline 55
expect(results[0].url).toBe('https://example.com/foo'); - Network accessline 65
short_id: 'xyz', title: 'Bar', url: 'https://example.com/bar', - Network accessline 66
title: 'Bar', url: 'https://example.com/bar', score: 1, - Network accessline 67
url: 'https://example.com/bar', - Network accessline 70
comment_count: 0, created_at: '2025-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/xyz', - Network accessline 71
created_at: '2025-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/xyz', }, - Network accessline 72
short_id_url: 'https://lobste.rs/s/xyz', - Network accessline 90
comment_count: 2, created_at: '2025-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/self', - Network accessline 91
created_at: '2025-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/self', }, - Network accessline 92
short_id_url: 'https://lobste.rs/s/self', - Network accessline 95
captureFetch(body); const results = await new LobstersEngine().search('q'); expect(results[0].url).toBe('https://lobste.rs/s/self'); - Network accessline 96
const results = await new LobstersEngine().search('q'); expect(results[0].url).toBe('https://lobste.rs/s/self'); }); - Network accessline 97
expect(results[0].url).toBe('https://lobste.rs/s/self'); - Network accessline 103
short_id: 'a', title: 't', url: 'https://x.test/', - Network accessline 104
title: 't', url: 'https://x.test/', score: 99, - Network accessline 105
url: 'https://x.test/', - Network accessline 108
comment_count: 12, created_at: '2025-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/a', - Network accessline 109
created_at: '2025-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/a', }, - Network accessline 110
short_id_url: 'https://lobste.rs/s/a', - Network accessline 121
short_id: 'old', title: 'old', url: 'https://x.test/old', - Network accessline 122
title: 'old', url: 'https://x.test/old', score: 1, - Network accessline 123
url: 'https://x.test/old', - Network accessline 126
comment_count: 0, created_at: '2020-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/old', - Network accessline 127
created_at: '2020-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/old', }, - Network accessline 128
short_id_url: 'https://lobste.rs/s/old', - Network accessline 131
short_id: 'new', title: 'new', url: 'https://x.test/new', - Network accessline 132
title: 'new', url: 'https://x.test/new', score: 1, - Network accessline 133
url: 'https://x.test/new', - Network accessline 136
comment_count: 0, created_at: '2025-06-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/new', - Network accessline 137
created_at: '2025-06-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/new', }, - Network accessline 138
short_id_url: 'https://lobste.rs/s/new', - Network accessline 149
short_id: 'old', title: 'old', url: 'https://x.test/old', - Network accessline 150
title: 'old', url: 'https://x.test/old', score: 1, - Network accessline 151
url: 'https://x.test/old', - Network accessline 154
comment_count: 0, created_at: '2020-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/old', - Network accessline 155
created_at: '2020-01-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/old', }, - Network accessline 156
short_id_url: 'https://lobste.rs/s/old', - Network accessline 159
short_id: 'new', title: 'new', url: 'https://x.test/new', - Network accessline 160
title: 'new', url: 'https://x.test/new', score: 1, - Network accessline 161
url: 'https://x.test/new', - Network accessline 164
comment_count: 0, created_at: '2025-06-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/new', - Network accessline 165
created_at: '2025-06-01T00:00:00Z', short_id_url: 'https://lobste.rs/s/new', }, - Network accessline 166
short_id_url: 'https://lobste.rs/s/new', - Network accessline 207
short_id: `s${i}`, title: `t${i}`, url: `https://x.test/${i}`, - Network accessline 208
title: `t${i}`, url: `https://x.test/${i}`, score: 1, - Network accessline 209
url: `https://x.test/${i}`, - Network accessline 212
comment_count: 0, created_at: '2025-01-01T00:00:00Z', short_id_url: `https://lobste.rs/s/s${i}`, - Network accessline 213
created_at: '2025-01-01T00:00:00Z', short_id_url: `https://lobste.rs/s/s${i}`, })); - Network accessline 214
short_id_url: `https://lobste.rs/s/s${i}`,
tests/unit/search/engines/marginalia.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
results: [ { url: 'https://example.com/a', - Network accessline 43
{ url: 'https://example.com/a', title: 'A small-web page', - Network accessline 44
url: 'https://example.com/a', - Network accessline 49
}, { url: 'https://example.org/b', - Network accessline 50
{ url: 'https://example.org/b', title: 'Another long-tail result', - Network accessline 51
url: 'https://example.org/b', - Network accessline 59
expect(results[0]).toMatchObject({ title: 'A small-web page', url: 'https://example.com/a', - Network accessline 60
title: 'A small-web page', url: 'https://example.com/a', engine: 'marginalia', - Network accessline 61
url: 'https://example.com/a', - Network accessline 75
const body = { results: [ { url: 'https://a', title: 'a', description: '' }, - Network accessline 76
results: [ { url: 'https://a', title: 'a', description: '' }, { url: 'https://b', title: 'b', description: '' }, - Network accessline 77
{ url: 'https://a', title: 'a', description: '' }, - Network accessline 78
{ url: 'https://b', title: 'b', description: '' }, - Network accessline 79
{ url: 'https://c', title: 'c', description: '' }, - Network accessline 86
const body = { results: [ { url: 'https://a', title: 'a', description: 's' }, - Network accessline 87
results: [ { url: 'https://a', title: 'a', description: 's' }, { title: 'b', description: 's' }, // no url - Network accessline 88
{ url: 'https://a', title: 'a', description: 's' }, - Network accessline 89
{ title: 'b', description: 's' }, // no url { url: 'https://c', description: 's' }, // no title { url: '', title: 'd', description: 's' }, // empty url - Network accessline 90
{ url: 'https://c', description: 's' }, // no title
tests/unit/search/engines/mdn.test.ts
- Executable scriptline 1
Executable file - Network accessline 36
{ mdn_url: '/en-US/docs/Web/API/fetch', title: 'fetch()', - Network accessline 37
mdn_url: '/en-US/docs/Web/API/fetch', title: 'fetch()', summary: 'The fetch() method starts a request.', - Network accessline 38
title: 'fetch()', - Network accessline 39
summary: 'The fetch() method starts a request.', - Network accessline 53
expect(results).toHaveLength(2); expect(results[0].title).toBe('fetch()'); - Network accessline 54
expect(results[0].title).toBe('fetch()'); - Network accessline 55
expect(results[0].url).toBe('https://developer.mozilla.org/en-US/docs/Web/API/fetch'); - Network accessline 56
expect(results[0].snippet).toBe('The fetch() method starts a request.');
tests/unit/search/engines/mojeek.test.ts
- Executable scriptline 1
Executable file - Network accessline 13
<ul class="results-standard"> <li> <h2><a class="title" href="https://example.com/a">First result</a></h2> - Network accessline 14
<li> <h2><a class="title" href="https://example.com/a">First result</a></h2> <p class="s">First snippet text here.</p> - Network accessline 15
<h2><a class="title" href="https://example.com/a">First result</a></h2> - Network accessline 16
<p class="s">First snippet text here.</p> <a class="url" href="https://example.com/a">example.com/a</a> </li> - Network accessline 17
<a class="url" href="https://example.com/a">example.com/a</a> - Network accessline 18
</li> <li> <h2><a class="title" href="https://example.org/b">Second result</a></h2> - Network accessline 19
<li> <h2><a class="title" href="https://example.org/b">Second result</a></h2> <p class="s">Second snippet.</p> - Network accessline 20
<h2><a class="title" href="https://example.org/b">Second result</a></h2> - Network accessline 21
<p class="s">Second snippet.</p> <a class="url" href="https://example.org/b">example.org/b</a> </li> - Network accessline 22
<a class="url" href="https://example.org/b">example.org/b</a> - Network accessline 41
expect(results[0]).toMatchObject({ title: 'First result', url: 'https://example.com/a', - Network accessline 42
title: 'First result', url: 'https://example.com/a', engine: 'mojeek', - Network accessline 43
url: 'https://example.com/a',
tests/unit/search/engines/openalex.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
const body = oaBody([ { id: 'https://openalex.org/W1', - Network accessline 41
{ id: 'https://openalex.org/W1', title: 'Attention Is All You Need', - Network accessline 42
id: 'https://openalex.org/W1', - Network accessline 44
publication_date: '2017-06-12', publication_year: 2017, primary_location: { landing_page_url: 'https://doi.org/10.5555/x' }, - Network accessline 46
primary_location: { landing_page_url: 'https://doi.org/10.5555/x' }, - Network accessline 57
expect(results[0].url).toBe('https://doi.org/10.5555/x'); - Network accessline 69
const body = oaBody([ { id: 'https://openalex.org/W2', - Network accessline 70
{ id: 'https://openalex.org/W2', title: 'Repeats', - Network accessline 71
id: 'https://openalex.org/W2', - Network accessline 85
for (let i = 0; i < 60; i++) index[`word${String(i).padStart(2, '0')}`] = [i]; const body = oaBody([{ id: 'https://openalex.org/W3', title: 'Long', abstract_inverted_index: index }]); - Network accessline 86
const body = oaBody([{ id: 'https://openalex.org/W3', title: 'Long', abstract_inverted_index: index }]); - Network accessline 95
const body = oaBody([ { id: 'https://openalex.org/W3b', - Network accessline 96
{ id: 'https://openalex.org/W3b', title: 'Capped', - Network accessline 97
id: 'https://openalex.org/W3b', - Network accessline 107
it('yields an empty snippet when the abstract index is absent', async () => { const body = oaBody([{ id: 'https://openalex.org/W4', title: 'No abstract' }]); - Network accessline 108
const body = oaBody([{ id: 'https://openalex.org/W4', title: 'No abstract' }]); - Network accessline 116
it('falls back to the work id url when landing_page_url is absent', async () => { const body = oaBody([ { id: 'https://openalex.org/W5', title: 'Fallback', primary_location: {} }, - Network accessline 117
const body = oaBody([ { id: 'https://openalex.org/W5', title: 'Fallback', primary_location: {} }, ]); - Network accessline 118
{ id: 'https://openalex.org/W5', title: 'Fallback', primary_location: {} }, - Network accessline 120
captureFetch(body); const results = await new OpenAlexEngine().search('q'); expect(results[0].url).toBe('https://openalex.org/W5'); - Network accessline 121
const results = await new OpenAlexEngine().search('q'); expect(results[0].url).toBe('https://openalex.org/W5'); }); - Network accessline 122
expect(results[0].url).toBe('https://openalex.org/W5'); - Network accessline 125
it('derives published_date from the year when publication_date is absent', async () => { const body = oaBody([ { id: 'https://openalex.org/W6', title: 'Year only', publication_year: 2020 }, - Network accessline 126
const body = oaBody([ { id: 'https://openalex.org/W6', title: 'Year only', publication_year: 2020 }, ]); - Network accessline 127
{ id: 'https://openalex.org/W6', title: 'Year only', publication_year: 2020 }, - Network accessline 134
it('skips a work with no title', async () => { const body = oaBody([ { id: 'https://openalex.org/W7' }, - Network accessline 135
const body = oaBody([ { id: 'https://openalex.org/W7' }, { id: 'https://openalex.org/W8', title: 'real' }, - Network accessline 136
{ id: 'https://openalex.org/W7' }, - Network accessline 137
{ id: 'https://openalex.org/W8', title: 'real' }, - Network accessline 146
const body = oaBody([ { title: 'linkless' }, { id: 'https://openalex.org/W9', title: 'keeper' }, - Network accessline 147
{ title: 'linkless' }, { id: 'https://openalex.org/W9', title: 'keeper' }, ]); - Network accessline 148
{ id: 'https://openalex.org/W9', title: 'keeper' },
tests/unit/search/engines/openreview.test.ts
tests/unit/search/engines/semantic-scholar.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
abstract: 'We propose a new architecture.', year: 2017, url: 'https://www.semanticscholar.org/paper/abc', - Network accessline 40
year: 2017, url: 'https://www.semanticscholar.org/paper/abc', openAccessPdf: { url: 'https://arxiv.org/pdf/1706.03762.pdf' }, - Network accessline 41
url: 'https://www.semanticscholar.org/paper/abc', - Network accessline 42
openAccessPdf: { url: 'https://arxiv.org/pdf/1706.03762.pdf' }, - Network accessline 47
abstract: 'Some abstract.', year: 2020, url: 'https://www.semanticscholar.org/paper/def', - Network accessline 48
year: 2020, url: 'https://www.semanticscholar.org/paper/def', }, - Network accessline 49
url: 'https://www.semanticscholar.org/paper/def', - Network accessline 56
expect(results).toHaveLength(2); expect(results[0].title).toBe('Attention Is All You Need'); expect(results[0].url).toBe('https://arxiv.org/pdf/1706.03762.pdf'); - Network accessline 57
expect(results[0].title).toBe('Attention Is All You Need'); expect(results[0].url).toBe('https://arxiv.org/pdf/1706.03762.pdf'); expect(results[0].snippet).toBe('We propose a new architecture.'); - Network accessline 58
expect(results[0].url).toBe('https://arxiv.org/pdf/1706.03762.pdf'); - Network accessline 61
expect(results[0].relevance_score).toBe(1); expect(results[0].published_date).toBe('2017-01-01T00:00:00.000Z'); expect(results[1].url).toBe('https://www.semanticscholar.org/paper/def'); - Network accessline 62
expect(results[0].published_date).toBe('2017-01-01T00:00:00.000Z'); expect(results[1].url).toBe('https://www.semanticscholar.org/paper/def'); }); - Network accessline 63
expect(results[1].url).toBe('https://www.semanticscholar.org/paper/def'); - Network accessline 103
abstract: 'x'.repeat(500), year: 2024, url: 'https://www.semanticscholar.org/paper/long', - Network accessline 104
year: 2024, url: 'https://www.semanticscholar.org/paper/long', }, - Network accessline 105
url: 'https://www.semanticscholar.org/paper/long', - Network accessline 119
title: 'no year', abstract: '', url: 'https://www.semanticscholar.org/paper/noyr', - Network accessline 120
abstract: '', url: 'https://www.semanticscholar.org/paper/noyr', }, - Network accessline 121
url: 'https://www.semanticscholar.org/paper/noyr',
tests/unit/search/engines/stackoverflow.test.ts
- Executable scriptline 1
Executable file - Network accessline 36
{ title: 'How to use TypeScript generics?', link: 'https://stackoverflow.com/questions/1/typescript-generics', - Network accessline 37
title: 'How to use TypeScript generics?', link: 'https://stackoverflow.com/questions/1/typescript-generics', body: '<p>Use <code>T</code> like so:</p><pre>function f<T>(x: T){}</pre>', - Network accessline 38
link: 'https://stackoverflow.com/questions/1/typescript-generics', - Network accessline 50
expect(results).toHaveLength(1); expect(results[0].title).toBe('How to use TypeScript generics?'); expect(results[0].url).toBe('https://stackoverflow.com/questions/1/typescript-generics'); - Network accessline 51
expect(results[0].title).toBe('How to use TypeScript generics?'); expect(results[0].url).toBe('https://stackoverflow.com/questions/1/typescript-generics'); expect(results[0].engine).toBe('stackoverflow'); - Network accessline 52
expect(results[0].url).toBe('https://stackoverflow.com/questions/1/typescript-generics'); - Network accessline 87
{ title: 't', link: 'https://stackoverflow.com/questions/1/t', - Network accessline 88
title: 't', link: 'https://stackoverflow.com/questions/1/t', body: longBody, - Network accessline 89
link: 'https://stackoverflow.com/questions/1/t',
tests/unit/search/engines/wikipedia.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
['Next.js', 'Next', 'Next (TV series)'], ['Next.js is an open-source React framework.', 'Next may refer to:', 'Next is an American drama.'], ['https://en.wikipedia.org/wiki/Next.js', 'https://en.wikipedia.org/wiki/Next', 'https: - Network accessline 15
['Next.js is an open-source React framework.', 'Next may refer to:', 'Next is an American drama.'], ['https://en.wikipedia.org/wiki/Next.js', 'https://en.wikipedia.org/wiki/Next', 'https://en.wikipedia.org/wiki/Next_(TV_series)'], - Network accessline 16
['https://en.wikipedia.org/wiki/Next.js', 'https://en.wikipedia.org/wiki/Next', 'https://en.wikipedia.org/wiki/Next_(TV_series)'], - Network accessline 20
expect(results[0]).toMatchObject({ title: 'Next.js', url: 'https://en.wikipedia.org/wiki/Next.js', - Network accessline 21
title: 'Next.js', url: 'https://en.wikipedia.org/wiki/Next.js', engine: 'wikipedia', - Network accessline 22
url: 'https://en.wikipedia.org/wiki/Next.js', - Network accessline 32
['A', 'B', 'C', 'D'], ['', '', '', ''], ['https://w/A', 'https://w/B', 'https://w/C', 'https://w/D'], - Network accessline 33
['', '', '', ''], ['https://w/A', 'https://w/B', 'https://w/C', 'https://w/D'], ]; - Network accessline 34
['https://w/A', 'https://w/B', 'https://w/C', 'https://w/D'], - Network accessline 48
['A', '', 'C'], ['s1', 's2', 's3'], ['https://w/A', 'https://w/B', ''], - Network accessline 49
['s1', 's2', 's3'], ['https://w/A', 'https://w/B', ''], ]; - Network accessline 50
['https://w/A', 'https://w/B', ''],
tests/unit/search/evidence-default.test.ts
- Executable scriptline 1
Executable file - Network accessline 24
return { title: 'T', url: 'https://example.com/a', - Network accessline 25
title: 'T', url: 'https://example.com/a', snippet: 'snippet text', - Network accessline 26
url: 'https://example.com/a', - Network accessline 46
source_index: 1, relevance_score: 0.7, source_url: 'https://example.com/a', - Network accessline 47
relevance_score: 0.7, source_url: 'https://example.com/a', source_title: 'T', - Network accessline 48
source_url: 'https://example.com/a', - Network accessline 97
highlights: [makeHighlight()], citations: [ { index: 1, url: 'https://example.com/a', title: 'T', snippet: 'snippet text' }, - Network accessline 98
citations: [ { index: 1, url: 'https://example.com/a', title: 'T', snippet: 'snippet text' }, ], - Network accessline 99
{ index: 1, url: 'https://example.com/a', title: 'T', snippet: 'snippet text' }, - Network accessline 138
it('source with surviving evidence → citation has matching citation_id', () => { const results: SearchResultItem[] = [ { title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, - Network accessline 139
const results: SearchResultItem[] = [ { title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, ]; - Network accessline 140
{ title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, - Network accessline 141
]; const citationId = stableCitationId('https://example.com/a', 0); const evidence = [ - Network accessline 142
const citationId = stableCitationId('https://example.com/a', 0); - Network accessline 144
{ title: 'T1', url: 'https://example.com/a', - Network accessline 145
title: 'T1', url: 'https://example.com/a', section_heading: null, - Network accessline 146
url: 'https://example.com/a', - Network accessline 153
]; const baseCitations: Citation[] = [ { index: 1, url: 'https://example.com/a', title: 'T1', snippet: 's1' }, - Network accessline 154
const baseCitations: Citation[] = [ { index: 1, url: 'https://example.com/a', title: 'T1', snippet: 's1' }, ]; - Network accessline 155
{ index: 1, url: 'https://example.com/a', title: 'T1', snippet: 's1' }, - Network accessline 162
it('source whose evidence was budget-cut → citation has no citation_id', () => { const results: SearchResultItem[] = [ { title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, - Network accessline 163
const results: SearchResultItem[] = [ { title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, { title: 'T2', url: 'https://example.com/b', snippet: 's2', relevance_score: 0.8 }, - Network accessline 164
{ title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, - Network accessline 165
{ title: 'T2', url: 'https://example.com/b', snippet: 's2', relevance_score: 0.8 }, - Network accessline 168
{ title: 'T1', url: 'https://example.com/a', - Network accessline 169
title: 'T1', url: 'https://example.com/a', section_heading: null, - Network accessline 170
url: 'https://example.com/a', - Network accessline 172
excerpt: 'ex', score: 0.7, citation_id: stableCitationId('https://example.com/a', 0), - Network accessline 173
score: 0.7, citation_id: stableCitationId('https://example.com/a', 0), source_span: { start: 0, end: 10 }, - Network accessline 174
citation_id: stableCitationId('https://example.com/a', 0), - Network accessline 177
]; const baseCitations: Citation[] = [ { index: 1, url: 'https://example.com/a', title: 'T1', snippet: 's1' }, - Network accessline 178
const baseCitations: Citation[] = [ { index: 1, url: 'https://example.com/a', title: 'T1', snippet: 's1' }, { index: 2, url: 'https://example.com/b', title: 'T2', snippet: 's2' }, - Network accessline 179
{ index: 1, url: 'https://example.com/a', title: 'T1', snippet: 's1' }, - Network accessline 180
{ index: 2, url: 'https://example.com/b', title: 'T2', snippet: 's2' }, - Network accessline 189
it('does not mutate the base citation objects (shallow-clone)', () => { const results: SearchResultItem[] = [ { title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, - Network accessline 190
const results: SearchResultItem[] = [ { title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, ]; - Network accessline 191
{ title: 'T1', url: 'https://example.com/a', snippet: 's1', relevance_score: 0.9 }, - Network accessline 193
const baseCitation: Citation = { index: 1, url: 'https://example.com/a', - Network accessline 194
index: 1, url: 'https://example.com/a', title: 'T1', - Network accessline 195
url: 'https://example.com/a', - Network accessline 200
{ title: 'T1', url: 'https://example.com/a', - Network accessline 201
title: 'T1', url: 'https://example.com/a', section_heading: null, - Network accessline 202
url: 'https://example.com/a', - Network accessline 204
excerpt: 'ex', score: 0.7, citation_id: stableCitationId('https://example.com/a', 0), - Network accessline 205
score: 0.7, citation_id: stableCitationId('https://example.com/a', 0), source_span: { start: 0, end: 10 }, - Network accessline 206
citation_id: stableCitationId('https://example.com/a', 0),
tests/unit/search/evidence-score.test.ts
- Executable scriptline 1
Executable file - Network accessline 78
it('orchestrator emits evidence_score with all components on every result', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs', 'Next.js docs', 'docs about server actions')]), - Network accessline 79
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs', 'Next.js docs', 'docs about server actions')]), ]; - Network accessline 80
makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs', 'Next.js docs', 'docs about server actions')]), - Network accessline 99
it('engine_consensus increases with multiple engines surfacing the same URL', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs')]), - Network accessline 100
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs')]), makeEntry('ddg', [makeResult('ddg', 'https://nextjs.org/docs')]), - Network accessline 101
makeEntry('bing', [makeResult('bing', 'https://nextjs.org/docs')]), - Network accessline 102
makeEntry('ddg', [makeResult('ddg', 'https://nextjs.org/docs')]), - Network accessline 103
makeEntry('brave', [makeResult('brave', 'https://other.com')]), - Network accessline 104
]; const out = await runV1Search({ query: 'next.js docs' }); const next = out.results.find((r) => r.url === 'https://nextjs.org/docs'); - Network accessline 105
const out = await runV1Search({ query: 'next.js docs' }); const next = out.results.find((r) => r.url === 'https://nextjs.org/docs'); const other = out.results.find((r) => r.url === 'https://other.com'); - Network accessline 106
const next = out.results.find((r) => r.url === 'https://nextjs.org/docs'); - Network accessline 107
const other = out.results.find((r) => r.url === 'https://other.com'); - Network accessline 112
it('SearchResultItem on core-provider output carries evidence_score', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/x', 'example', 'an example page')]), - Network accessline 113
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/x', 'example', 'an example page')]), ]; - Network accessline 114
makeEntry('bing', [makeResult('bing', 'https://example.com/x', 'example', 'an example page')]),
tests/unit/search/evidence-token-discipline.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
return { title: 'T', url: 'https://example.com/a', - Network accessline 20
title: 'T', url: 'https://example.com/a', snippet: 'snippet text', - Network accessline 21
url: 'https://example.com/a', - Network accessline 41
source_index: 1, relevance_score: 0.7, source_url: 'https://example.com/a', - Network accessline 42
relevance_score: 0.7, source_url: 'https://example.com/a', source_title: 'T', - Network accessline 43
source_url: 'https://example.com/a', - Network accessline 59
makeHighlight({ text: `Passage ${i} long enough to survive truncation with enough words to count as a real excerpt.`, source_url: `https://example.com/${i}`, - Network accessline 60
text: `Passage ${i} long enough to survive truncation with enough words to count as a real excerpt.`, source_url: `https://example.com/${i}`, source_title: `T${i}`, - Network accessline 61
source_url: `https://example.com/${i}`, - Network accessline 72
const results = Array.from({ length: 10 }, (_, i) => makeResult({ url: `https://example.com/${i}`, - Network accessline 73
makeResult({ url: `https://example.com/${i}`, title: `T${i}`, - Network accessline 74
url: `https://example.com/${i}`, - Network accessline 87
makeHighlight({ text: `Passage ${i} long enough to survive truncation with enough words to count as a real excerpt.`, source_url: `https://example.com/${i}`, - Network accessline 88
text: `Passage ${i} long enough to survive truncation with enough words to count as a real excerpt.`, source_url: `https://example.com/${i}`, relevance_score: 0.9 - i * 0.05, - Network accessline 89
source_url: `https://example.com/${i}`, - Network accessline 97
reranker_used: false, }); const results = Array.from({ length: 4 }, (_, i) => makeResult({ url: `https://example.com/${i}` })); - Network accessline 98
}); const results = Array.from({ length: 4 }, (_, i) => makeResult({ url: `https://example.com/${i}` })); const output = makeOutput(results); - Network accessline 99
const results = Array.from({ length: 4 }, (_, i) => makeResult({ url: `https://example.com/${i}` })); - Network accessline 117
makeHighlight({ text: 'too short', source_url: 'https://example.com/1', - Network accessline 118
text: 'too short', source_url: 'https://example.com/1', source_span: { start: 0, end: 9 }, - Network accessline 119
source_url: 'https://example.com/1', - Network accessline 122
makeHighlight({ text: 'A passage of text long enough to survive the 40-char filter and be useful evidence content here.', source_url: 'https://example.com/2', - Network accessline 123
text: 'A passage of text long enough to survive the 40-char filter and be useful evidence content here.', source_url: 'https://example.com/2', source_span: { start: 0, end: 80 }, - Network accessline 124
source_url: 'https://example.com/2', - Network accessline 132
}); const results = [ makeResult({ url: 'https://example.com/1' }), - Network accessline 133
const results = [ makeResult({ url: 'https://example.com/1' }), makeResult({ url: 'https://example.com/2' }), - Network accessline 134
makeResult({ url: 'https://example.com/1' }), - Network accessline 135
makeResult({ url: 'https://example.com/2' }), - Network accessline 143
expect(ev.excerpt.length).toBeGreaterThanOrEqual(40); } expect(output.evidence!.find((e) => e.url === 'https://example.com/1')).toBeUndefined(); - Network accessline 144
} expect(output.evidence!.find((e) => e.url === 'https://example.com/1')).toBeUndefined(); expect(output.evidence!.find((e) => e.url === 'https://example.com/2')).toBeDefined(); - Network accessline 145
expect(output.evidence!.find((e) => e.url === 'https://example.com/1')).toBeUndefined(); - Network accessline 146
expect(output.evidence!.find((e) => e.url === 'https://example.com/2')).toBeDefined(); - Network accessline 151
const linkHeavy = '[link1](https://a.com/1) [link2](https://b.com/2) [link3](https://c.com/3) hi'; - Network accessline 152
'[link1](https://a.com/1) [link2](https://b.com/2) [link3](https://c.com/3) hi'; - Network accessline 156
makeHighlight({ text: linkHeavy, source_url: 'https://example.com/link', - Network accessline 157
text: linkHeavy, source_url: 'https://example.com/link', source_span: { start: 0, end: linkHeavy.length }, - Network accessline 158
source_url: 'https://example.com/link', - Network accessline 161
makeHighlight({ text: cleanText, source_url: 'https://example.com/clean', - Network accessline 162
text: cleanText, source_url: 'https://example.com/clean', source_span: { start: 0, end: cleanText.length }, - Network accessline 163
source_url: 'https://example.com/clean', - Network accessline 171
}); const results = [ makeResult({ url: 'https://example.com/link' }), - Network accessline 172
const results = [ makeResult({ url: 'https://example.com/link' }), makeResult({ url: 'https://example.com/clean' }), - Network accessline 173
makeResult({ url: 'https://example.com/link' }), - Network accessline 174
makeResult({ url: 'https://example.com/clean' }), - Network accessline 178
await applyEvidenceDefault(input, output, results, 'q'); expect(output.evidence).toBeDefined(); expect(output.evidence!.find((e) => e.url === 'https://example.com/link')).toBeUndefined(); - Network accessline 179
expect(output.evidence).toBeDefined(); expect(output.evidence!.find((e) => e.url === 'https://example.com/link')).toBeUndefined(); expect(output.evidence!.find((e) => e.url === 'https://example.com/clean')).toBeDefined(); - Network accessline 180
expect(output.evidence!.find((e) => e.url === 'https://example.com/link')).toBeUndefined(); - Network accessline 181
expect(output.evidence!.find((e) => e.url === 'https://example.com/clean')).toBeDefined(); - Network accessline 187
const highlights: Highlight[] = [ makeHighlight({ text: 'short', source_url: 'https://example.com/short', source_span: { start: 0, end: 5 } }), - Network accessline 188
makeHighlight({ text: 'short', source_url: 'https://example.com/short', source_span: { start: 0, end: 5 } }), - Network accessline 189
makeHighlight({ text: '[a](u)', source_url: 'https://example.com/link', source_span: { start: 0, end: 6 } }), - Network accessline 190
makeHighlight({ text: 'A long passage of valid prose for source 1 with enough characters to pass the M18 filter.', source_url: 'https://example.com/1', - Network accessline 191
text: 'A long passage of valid prose for source 1 with enough characters to pass the M18 filter.', source_url: 'https://example.com/1', source_span: { start: 0, end: 80 }, - Network accessline 192
source_url: 'https://example.com/1', - Network accessline 195
makeHighlight({ text: 'A long passage of valid prose for source 2 with enough characters to pass the M18 filter.', source_url: 'https://example.com/2', - Network accessline 196
text: 'A long passage of valid prose for source 2 with enough characters to pass the M18 filter.', source_url: 'https://example.com/2', source_span: { start: 0, end: 80 }, - Network accessline 197
source_url: 'https://example.com/2', - Network accessline 200
makeHighlight({ text: 'A long passage of valid prose for source 3 with enough characters to pass the M18 filter.', source_url: 'https://example.com/3', - Network accessline 201
text: 'A long passage of valid prose for source 3 with enough characters to pass the M18 filter.', source_url: 'https://example.com/3', source_span: { start: 0, end: 80 }, - Network accessline 202
source_url: 'https://example.com/3', - Network accessline 210
}); const results = [ makeResult({ url: 'https://example.com/short' }), - Network accessline 211
const results = [ makeResult({ url: 'https://example.com/short' }), makeResult({ url: 'https://example.com/link' }), - Network accessline 212
makeResult({ url: 'https://example.com/short' }), - Network accessline 213
makeResult({ url: 'https://example.com/link' }), - Network accessline 214
makeResult({ url: 'https://example.com/1' }), - Network accessline 215
makeResult({ url: 'https://example.com/2' }), - Network accessline 216
makeResult({ url: 'https://example.com/3' }),
tests/unit/search/evidence.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
describe('stableCitationId', () => { it('is identical for the same url + start across calls', () => { expect(stableCitationId('https://x.com/a', 100)).toBe(stableCitationId('https://x.com/a', 100)); - Network accessline 10
it('is identical for the same url + start across calls', () => { expect(stableCitationId('https://x.com/a', 100)).toBe(stableCitationId('https://x.com/a', 100)); }); - Network accessline 11
expect(stableCitationId('https://x.com/a', 100)).toBe(stableCitationId('https://x.com/a', 100)); - Network accessline 12
}); it('differs by url', () => { expect(stableCitationId('https://x.com/a', 100)).not.toBe(stableCitationId('https://x.com/b', 100)); - Network accessline 13
it('differs by url', () => { expect(stableCitationId('https://x.com/a', 100)).not.toBe(stableCitationId('https://x.com/b', 100)); }); - Network accessline 14
expect(stableCitationId('https://x.com/a', 100)).not.toBe(stableCitationId('https://x.com/b', 100)); - Network accessline 15
}); it('differs by start offset', () => { expect(stableCitationId('https://x.com/a', 100)).not.toBe(stableCitationId('https://x.com/a', 200)); - Network accessline 16
it('differs by start offset', () => { expect(stableCitationId('https://x.com/a', 100)).not.toBe(stableCitationId('https://x.com/a', 200)); }); - Network accessline 17
expect(stableCitationId('https://x.com/a', 100)).not.toBe(stableCitationId('https://x.com/a', 200)); - Network accessline 18
}); it('returns a 12-char lowercase hex string', () => { expect(stableCitationId('https://x.com/a', 0)).toMatch(/^[a-f0-9]{12}$/); - Network accessline 19
it('returns a 12-char lowercase hex string', () => { expect(stableCitationId('https://x.com/a', 0)).toMatch(/^[a-f0-9]{12}$/); }); - Network accessline 20
expect(stableCitationId('https://x.com/a', 0)).toMatch(/^[a-f0-9]{12}$/); - Network accessline 26
const ev = buildEvidenceItem({ title: 'T', url: 'https://x.com/a', - Network accessline 27
title: 'T', url: 'https://x.com/a', sectionHeading: 'Intro', - Network accessline 28
url: 'https://x.com/a', - Network accessline 33
}); expect(ev.title).toBe('T'); expect(ev.url).toBe('https://x.com/a'); - Network accessline 34
expect(ev.title).toBe('T'); expect(ev.url).toBe('https://x.com/a'); expect(ev.section_heading).toBe('Intro'); - Network accessline 35
expect(ev.url).toBe('https://x.com/a'); - Network accessline 38
expect(ev.score).toBe(0.8); expect(ev.source_span).toEqual({ start: 100, end: 130 }); expect(ev.citation_id).toBe(stableCitationId('https://x.com/a', 100)); - Network accessline 39
expect(ev.source_span).toEqual({ start: 100, end: 130 }); expect(ev.citation_id).toBe(stableCitationId('https://x.com/a', 100)); }); - Network accessline 40
expect(ev.citation_id).toBe(stableCitationId('https://x.com/a', 100)); - Network accessline 42
it('passes null section_heading when none', () => { const ev = buildEvidenceItem({ title: 'T', url: 'https://x.com/a', sectionHeading: null, - Network accessline 43
const ev = buildEvidenceItem({ title: 'T', url: 'https://x.com/a', sectionHeading: null, excerpt: 'x', score: 0, sourceSpan: { start: 0, end: 1 }, - Network accessline 44
title: 'T', url: 'https://x.com/a', sectionHeading: null, - Network accessline 99
'TypeScript', 'Title', 'https://example.com/a', - Network accessline 100
'Title', 'https://example.com/a', markdown, - Network accessline 101
'https://example.com/a',
tests/unit/search/exact-match-pre-dedup.test.ts
- Executable scriptline 1
Executable file - Network accessline 89
makeResult( 'engine-a', 'https://react.dev/reference/react/useState', - Network accessline 90
'engine-a', 'https://react.dev/reference/react/useState', 'React Reference', - Network accessline 91
'https://react.dev/reference/react/useState', - Network accessline 97
makeResult( 'engine-b', 'https://react.dev/reference/react/useState', - Network accessline 98
'engine-b', 'https://react.dev/reference/react/useState', 'useState hook reference', - Network accessline 99
'https://react.dev/reference/react/useState', - Network accessline 112
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://react.dev/reference/react/useState'); - Network accessline 113
expect(urls).toContain('https://react.dev/reference/react/useState'); - Network accessline 119
makeResult( 'engine-a', 'https://example.com/useState', - Network accessline 120
'engine-a', 'https://example.com/useState', 'useState hook tutorial', - Network accessline 121
'https://example.com/useState', - Network accessline 125
makeResult( 'engine-a', 'https://example.com/other', - Network accessline 126
'engine-a', 'https://example.com/other', 'Different topic', - Network accessline 127
'https://example.com/other', - Network accessline 140
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://example.com/useState'); - Network accessline 141
expect(urls).toContain('https://example.com/useState'); - Network accessline 142
expect(urls).not.toContain('https://example.com/other'); - Network accessline 153
makeResult( 'noisy', 'https://stackoverflow.com/q/123', - Network accessline 154
'noisy', 'https://stackoverflow.com/q/123', 'Question about React', - Network accessline 155
'https://stackoverflow.com/q/123', - Network accessline 161
makeResult( 'authoritative', 'https://stackoverflow.com/q/123', - Network accessline 162
'authoritative', 'https://stackoverflow.com/q/123', 'Q: useState hook crashes?', - Network accessline 163
'https://stackoverflow.com/q/123',
tests/unit/search/exact-match.test.ts
- Executable scriptline 1
Executable file - Network accessline 81
captured.push(q); return [ makeResult('bing', 'https://example.com/a', 'foo bar baz', 'sentence with foo bar in it'), - Network accessline 82
return [ makeResult('bing', 'https://example.com/a', 'foo bar baz', 'sentence with foo bar in it'), ]; - Network accessline 83
makeResult('bing', 'https://example.com/a', 'foo bar baz', 'sentence with foo bar in it'), - Network accessline 100
captured.push(q); return [ makeResult('bing', 'https://example.com/a', 'foo bar', 'snippet foo bar'), - Network accessline 101
return [ makeResult('bing', 'https://example.com/a', 'foo bar', 'snippet foo bar'), ]; - Network accessline 102
makeResult('bing', 'https://example.com/a', 'foo bar', 'snippet foo bar'), - Network accessline 117
it('drops results whose title and snippet do not contain the unquoted query (case-insensitive)', async () => { const engine = makeEntry('bing', [ makeResult('bing', 'https://example.com/match', 'Foo Bar Tutorial', 'Has foo bar in - Network accessline 118
const engine = makeEntry('bing', [ makeResult('bing', 'https://example.com/match', 'Foo Bar Tutorial', 'Has foo bar in body'), makeResult('bing', 'https://example.com/title', 'About FOO BAR', 'Unrelated text'), - Network accessline 119
makeResult('bing', 'https://example.com/match', 'Foo Bar Tutorial', 'Has foo bar in body'), - Network accessline 120
makeResult('bing', 'https://example.com/title', 'About FOO BAR', 'Unrelated text'), - Network accessline 121
makeResult('bing', 'https://example.com/snippet', 'Unrelated title', 'Talks about foo bar later'), - Network accessline 122
makeResult('bing', 'https://example.com/miss', 'Something else', 'No phrase here'), - Network accessline 123
makeResult('bing', 'https://example.com/partial', 'Foo only', 'Bar only'), - Network accessline 127
const out = await runV1Search({ query: 'foo bar', exactMatch: true, maxResults: 10 }); const urls = out.results.map((r) => r.url); expect(urls).toContain('https://example.com/match'); - Network accessline 128
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://example.com/match'); expect(urls).toContain('https://example.com/title'); - Network accessline 129
expect(urls).toContain('https://example.com/match'); - Network accessline 130
expect(urls).toContain('https://example.com/title'); - Network accessline 131
expect(urls).toContain('https://example.com/snippet'); - Network accessline 132
expect(urls).not.toContain('https://example.com/miss'); - Network accessline 133
expect(urls).not.toContain('https://example.com/partial'); - Network accessline 136
it('does not filter results when exact_match is false', async () => { const engine = makeEntry('bing', [ makeResult('bing', 'https://example.com/a', 'Foo Bar', 'has foo bar'), - Network accessline 137
const engine = makeEntry('bing', [ makeResult('bing', 'https://example.com/a', 'Foo Bar', 'has foo bar'), makeResult('bing', 'https://example.com/b', 'Different', 'no match'), - Network accessline 138
makeResult('bing', 'https://example.com/a', 'Foo Bar', 'has foo bar'), - Network accessline 139
makeResult('bing', 'https://example.com/b', 'Different', 'no match'),
tests/unit/search/exclude-domains.test.ts
- Executable scriptline 1
Executable file - Network accessline 72
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), - Network accessline 73
makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), makeResult('bing', 'https://keep.com/a'), - Network accessline 74
makeResult('bing', 'https://example.com/a'), - Network accessline 75
makeResult('bing', 'https://keep.com/a'), - Network accessline 88
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://www.example.com/a'), - Network accessline 89
makeEntry('bing', [ makeResult('bing', 'https://www.example.com/a'), makeResult('bing', 'https://blog.example.com/a'), - Network accessline 90
makeResult('bing', 'https://www.example.com/a'), - Network accessline 91
makeResult('bing', 'https://blog.example.com/a'), - Network accessline 92
makeResult('bing', 'https://deep.nested.example.com/a'), - Network accessline 93
makeResult('bing', 'https://keep.com/a'), - Network accessline 105
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://Example.COM/a'), - Network accessline 106
makeEntry('bing', [ makeResult('bing', 'https://Example.COM/a'), makeResult('bing', 'https://keep.com/a'), - Network accessline 107
makeResult('bing', 'https://Example.COM/a'), - Network accessline 108
makeResult('bing', 'https://keep.com/a'), - Network accessline 120
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://blog.example.com/a'), - Network accessline 121
makeEntry('bing', [ makeResult('bing', 'https://blog.example.com/a'), makeResult('bing', 'https://keep.com/a'), - Network accessline 122
makeResult('bing', 'https://blog.example.com/a'), - Network accessline 123
makeResult('bing', 'https://keep.com/a'), - Network accessline 136
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://notexample.com/a'), - Network accessline 137
makeEntry('bing', [ makeResult('bing', 'https://notexample.com/a'), makeResult('bing', 'https://example.com/a'), - Network accessline 138
makeResult('bing', 'https://notexample.com/a'), - Network accessline 139
makeResult('bing', 'https://example.com/a'), - Network accessline 152
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://a.com/x'), - Network accessline 153
makeEntry('bing', [ makeResult('bing', 'https://a.com/x'), makeResult('bing', 'https://b.com/x'), - Network accessline 154
makeResult('bing', 'https://a.com/x'), - Network accessline 155
makeResult('bing', 'https://b.com/x'), - Network accessline 156
makeResult('bing', 'https://c.com/x'), - Network accessline 157
makeResult('bing', 'https://blog.b.com/x'),
tests/unit/search/expand-query.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/favicon.test.ts
- Executable scriptline 1
Executable file - Network accessline 71
describe('faviconUrlFor (sub-ticket 3.6)', () => { it('returns s2/favicons URL keyed by hostname', () => { expect(faviconUrlFor('https://example.com/path?q=1')).toContain('example.com'); - Network accessline 72
it('returns s2/favicons URL keyed by hostname', () => { expect(faviconUrlFor('https://example.com/path?q=1')).toContain('example.com'); expect(faviconUrlFor('https://example.com/')).toContain('example.com'); - Network accessline 73
expect(faviconUrlFor('https://example.com/path?q=1')).toContain('example.com'); - Network accessline 74
expect(faviconUrlFor('https://example.com/')).toContain('example.com'); - Network accessline 81
it('same host returns identical URL (caller-side caching by host)', () => { const a = faviconUrlFor('https://example.com/a'); - Network accessline 82
const a = faviconUrlFor('https://example.com/a'); - Network accessline 83
const b = faviconUrlFor('https://example.com/b'); - Network accessline 90
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), - Network accessline 91
makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), makeResult('bing', 'https://other.com/b'), - Network accessline 92
makeResult('bing', 'https://example.com/a'), - Network accessline 93
makeResult('bing', 'https://other.com/b'), - Network accessline 111
it('omits favicon when include_favicon is not set', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 112
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 113
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]),
tests/unit/search/filters.test.ts
- Executable scriptline 1
Executable file - Network accessline 17
describe('filterByDomains', () => { const results = [ makeResult('https://docs.react.dev/learn'), - Network accessline 18
const results = [ makeResult('https://docs.react.dev/learn'), makeResult('https://stackoverflow.com/q/123'), - Network accessline 19
makeResult('https://docs.react.dev/learn'), - Network accessline 20
makeResult('https://stackoverflow.com/q/123'), - Network accessline 21
makeResult('https://medium.com/react-article'), - Network accessline 22
makeResult('https://github.com/facebook/react'), - Network accessline 23
makeResult('https://www.npmjs.com/package/react'), - Network accessline 24
makeResult('https://blog.github.com/post/123'), - Network accessline 47
expect(filtered).toHaveLength(3); const urls = filtered.map(r => r.url); expect(urls).toContain('https://docs.react.dev/learn'); - Network accessline 48
const urls = filtered.map(r => r.url); expect(urls).toContain('https://docs.react.dev/learn'); expect(urls).toContain('https://github.com/facebook/react'); - Network accessline 49
expect(urls).toContain('https://docs.react.dev/learn'); - Network accessline 50
expect(urls).toContain('https://github.com/facebook/react'); - Network accessline 51
expect(urls).toContain('https://blog.github.com/post/123'); - Network accessline 114
describe('filterByDateRange', () => { const results = [ makeResult('https://a.com', { snippet: 'Published April 10, 2026 - Some content' }), - Network accessline 115
const results = [ makeResult('https://a.com', { snippet: 'Published April 10, 2026 - Some content' }), makeResult('https://b.com', { snippet: 'March 1, 2026 - Older content' }), - Network accessline 116
makeResult('https://a.com', { snippet: 'Published April 10, 2026 - Some content' }), - Network accessline 117
makeResult('https://b.com', { snippet: 'March 1, 2026 - Older content' }), - Network accessline 118
makeResult('https://c.com', { snippet: 'no date info whatsoever' }), - Network accessline 119
makeResult('https://d.com', { snippet: 'January 15, 2026 - Very old content' }), - Network accessline 126
it('keeps results without parseable dates (conservative approach)', () => { const filtered = filterByDateRange(results, '2026-04-01'); expect(filtered.some(r => r.url === 'https://c.com')).toBe(true); - Network accessline 127
const filtered = filterByDateRange(results, '2026-04-01'); expect(filtered.some(r => r.url === 'https://c.com')).toBe(true); }); - Network accessline 128
expect(filtered.some(r => r.url === 'https://c.com')).toBe(true); - Network accessline 160
it('drops results with published_date older than from_date', () => { const dated = [ makeResult('https://new.com', { published_date: '2026-04-15T00:00:00Z' }), - Network accessline 161
const dated = [ makeResult('https://new.com', { published_date: '2026-04-15T00:00:00Z' }), makeResult('https://old.com', { published_date: '2024-02-01T00:00:00Z' }), - Network accessline 162
makeResult('https://new.com', { published_date: '2026-04-15T00:00:00Z' }), - Network accessline 163
makeResult('https://old.com', { published_date: '2024-02-01T00:00:00Z' }), - Network accessline 164
makeResult('https://nodate.com'), - Network accessline 165
]; const filtered = filterByDateRange(dated, '2026-01-01'); expect(filtered.map(r => r.url)).toEqual(['https://new.com', 'https://nodate.com']); - Network accessline 166
const filtered = filterByDateRange(dated, '2026-01-01'); expect(filtered.map(r => r.url)).toEqual(['https://new.com', 'https://nodate.com']); }); - Network accessline 167
expect(filtered.map(r => r.url)).toEqual(['https://new.com', 'https://nodate.com']); - Network accessline 170
it('drops results with published_date newer than to_date', () => { const dated = [ makeResult('https://new.com', { published_date: '2026-12-31T00:00:00Z' }), - Network accessline 171
const dated = [ makeResult('https://new.com', { published_date: '2026-12-31T00:00:00Z' }), makeResult('https://ok.com', { published_date: '2026-01-15T00:00:00Z' }), - Network accessline 172
makeResult('https://new.com', { published_date: '2026-12-31T00:00:00Z' }), - Network accessline 173
makeResult('https://ok.com', { published_date: '2026-01-15T00:00:00Z' }), - Network accessline 174
]; const filtered = filterByDateRange(dated, undefined, '2026-06-30'); expect(filtered.map(r => r.url)).toEqual(['https://ok.com']); - Network accessline 175
const filtered = filterByDateRange(dated, undefined, '2026-06-30'); expect(filtered.map(r => r.url)).toEqual(['https://ok.com']); }); - Network accessline 176
expect(filtered.map(r => r.url)).toEqual(['https://ok.com']); - Network accessline 179
it('keeps results when published_date is unparseable', () => { const dated = [ makeResult('https://garbled.com', { published_date: 'not-a-real-date' }), - Network accessline 180
const dated = [ makeResult('https://garbled.com', { published_date: 'not-a-real-date' }), ]; - Network accessline 181
makeResult('https://garbled.com', { published_date: 'not-a-real-date' }), - Network accessline 190
it('returns all results unchanged (category handled by SearXNG, not post-filter)', () => { const results = [ makeResult('https://a.com'), - Network accessline 191
const results = [ makeResult('https://a.com'), makeResult('https://b.com'), - Network accessline 192
makeResult('https://a.com'), - Network accessline 193
makeResult('https://b.com'), - Network accessline 198
it('returns all results when category is undefined', () => { const results = [makeResult('https://a.com')]; - Network accessline 199
const results = [makeResult('https://a.com')]; - Network accessline 206
describe('applyAllFilters', () => { const results = [ makeResult('https://docs.react.dev/learn'), - Network accessline 207
const results = [ makeResult('https://docs.react.dev/learn'), makeResult('https://stackoverflow.com/q/123'), - Network accessline 208
makeResult('https://docs.react.dev/learn'), - Network accessline 209
makeResult('https://stackoverflow.com/q/123'), - Network accessline 210
makeResult('https://medium.com/react-article'), - Network accessline 211
makeResult('https://github.com/facebook/react'),
tests/unit/search/find-similar-embedding.test.ts
- Executable scriptline 1
Executable file - Network accessline 106
{ title: 'Web Result', url: 'https://web.example.com/1', - Network accessline 107
title: 'Web Result', url: 'https://web.example.com/1', snippet: 'A web search result', - Network accessline 108
url: 'https://web.example.com/1', - Network accessline 116
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/page', - Network accessline 117
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 118
url: 'https://example.com/page', - Network accessline 119
finalUrl: 'https://example.com/page', - Network accessline 178
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://example.com/', 1); - Network accessline 179
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://example.com/', 1); mockEmbeddingState.findSimilarImpl = async () => []; - Network accessline 180
mockEmbeddingState.vectors.set('https://example.com/', 1); - Network accessline 192
it('uses embedding path when available and produces hybrid method', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 193
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 194
'https://react.dev/hooks', - Network accessline 199
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://react.dev/hooks', 1); - Network accessline 200
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://react.dev/hooks', 1); mockEmbeddingState.findSimilarImpl = async () => [ - Network accessline 201
mockEmbeddingState.vectors.set('https://react.dev/hooks', 1); - Network accessline 202
mockEmbeddingState.findSimilarImpl = async () => [ { url: 'https://react.dev/hooks', score: 0.95 }, ]; - Network accessline 203
{ url: 'https://react.dev/hooks', score: 0.95 }, - Network accessline 220
seedCache( 'https://semantic-match.example.com/page', - Network accessline 221
'https://semantic-match.example.com/page', - Network accessline 226
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://semantic-match.example.com/page', 1); - Network accessline 228
mockEmbeddingState.vectors.set('https://semantic-match.example.com/page', 1); - Network accessline 230
mockEmbeddingState.findSimilarImpl = async () => [ { url: 'https://semantic-match.example.com/page', score: 0.88 }, - Network accessline 231
{ url: 'https://semantic-match.example.com/page', score: 0.88 }, - Network accessline 240
const urls = result.results.map(r => r.url); expect(urls).toContain('https://semantic-match.example.com/page'); - Network accessline 241
expect(urls).toContain('https://semantic-match.example.com/page'); - Network accessline 244
const embeddingHit = result.results.find(r => r.url === 'https://semantic-match.example.com/page'); - Network accessline 248
it('method=embedding when only embedding path produces results', async () => { seedCache( 'https://semantic-only.example.com/page', - Network accessline 249
seedCache( 'https://semantic-only.example.com/page', 'Functional Programming', - Network accessline 250
'https://semantic-only.example.com/page', - Network accessline 255
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://semantic-only.example.com/page', 1); - Network accessline 256
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://semantic-only.example.com/page', 1); mockEmbeddingState.findSimilarImpl = async () => [ - Network accessline 257
mockEmbeddingState.vectors.set('https://semantic-only.example.com/page', 1); - Network accessline 258
mockEmbeddingState.findSimilarImpl = async () => [ { url: 'https://semantic-only.example.com/page', score: 0.88 }, ]; - Network accessline 259
{ url: 'https://semantic-only.example.com/page', score: 0.88 }, - Network accessline 277
seedCache( 'https://a.com/react-hooks', - Network accessline 278
'https://a.com/react-hooks', - Network accessline 281
); seedCache( 'https://b.com/react-hooks', - Network accessline 282
seedCache( 'https://b.com/react-hooks', 'React Hooks Tutorial', - Network accessline 283
'https://b.com/react-hooks', - Network accessline 288
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://a.com/react-hooks', 1); - Network accessline 289
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://a.com/react-hooks', 1); mockEmbeddingState.findSimilarImpl = async () => [ - Network accessline 290
mockEmbeddingState.vectors.set('https://a.com/react-hooks', 1); - Network accessline 291
mockEmbeddingState.findSimilarImpl = async () => [ { url: 'https://a.com/react-hooks', score: 0.99 }, ]; - Network accessline 292
{ url: 'https://a.com/react-hooks', score: 0.99 }, - Network accessline 302
expect(result.results[0].url).toBe('https://a.com/react-hooks'); - Network accessline 306
it('embedding path excludes input url', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 307
seedCache( 'https://react.dev/hooks', 'Input Page', - Network accessline 308
'https://react.dev/hooks', - Network accessline 311
); seedCache( 'https://other.dev/hooks', - Network accessline 312
seedCache( 'https://other.dev/hooks', 'Related Page', - Network accessline 313
'https://other.dev/hooks', - Network accessline 318
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://react.dev/hooks', 1); - Network accessline 319
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://react.dev/hooks', 1); mockEmbeddingState.vectors.set('https://other.dev/hooks', 1); - Network accessline 320
mockEmbeddingState.vectors.set('https://react.dev/hooks', 1); - Network accessline 321
mockEmbeddingState.vectors.set('https://other.dev/hooks', 1); - Network accessline 323
mockEmbeddingState.findSimilarImpl = async (_q, _k, excludeUrls) => { const results = [ { url: 'https://react.dev/hooks', score: 0.99 }, - Network accessline 324
const results = [ { url: 'https://react.dev/hooks', score: 0.99 }, { url: 'https://other.dev/hooks', score: 0.9 }, - Network accessline 325
{ url: 'https://react.dev/hooks', score: 0.99 }, - Network accessline 326
{ url: 'https://other.dev/hooks', score: 0.9 }, - Network accessline 331
const result = await findSimilar( { url: 'https://react.dev/hooks', include_web: false }, - Network accessline 332
{ url: 'https://react.dev/hooks', include_web: false }, - Network accessline 337
const urls = result.results.map(r => r.url); expect(urls).not.toContain('https://react.dev/hooks'); - Network accessline 338
expect(urls).not.toContain('https://react.dev/hooks'); - Network accessline 341
it('embedding respects exclude_domains filter', async () => { seedCache( 'https://good.com/page', - Network accessline 342
seedCache( 'https://good.com/page', 'Good Page', - Network accessline 343
'https://good.com/page', - Network accessline 346
); seedCache( 'https://spam.com/page', - Network accessline 347
seedCache( 'https://spam.com/page', 'Spam Page', - Network accessline 348
'https://spam.com/page', - Network accessline 353
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://good.com/page', 1); - Network accessline 354
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://good.com/page', 1); mockEmbeddingState.vectors.set('https://spam.com/page', 1); - Network accessline 355
mockEmbeddingState.vectors.set('https://good.com/page', 1); - Network accessline 356
mockEmbeddingState.vectors.set('https://spam.com/page', 1); - Network accessline 357
mockEmbeddingState.findSimilarImpl = async () => [ { url: 'https://spam.com/page', score: 0.99 }, { url: 'https://good.com/page', score: 0.9 }, - Network accessline 358
{ url: 'https://spam.com/page', score: 0.99 }, - Network accessline 359
{ url: 'https://good.com/page', score: 0.9 }, - Network accessline 378
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://foo.com/', 1); - Network accessline 379
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://foo.com/', 1); mockEmbeddingState.findSimilarImpl = async () => [ - Network accessline 380
mockEmbeddingState.vectors.set('https://foo.com/', 1); - Network accessline 381
mockEmbeddingState.findSimilarImpl = async () => [ { url: 'https://foo.com/', score: 0.9 }, ]; - Network accessline 382
{ url: 'https://foo.com/', score: 0.9 }, - Network accessline 394
it('embedding failure does not break find_similar', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 395
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 396
'https://react.dev/hooks', - Network accessline 401
mockEmbeddingState.available = true; mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://something', 1); - Network accessline 402
mockEmbeddingState.subprocessReady = true; mockEmbeddingState.vectors.set('https://something', 1); mockEmbeddingState.findSimilarImpl = async () => { - Network accessline 403
mockEmbeddingState.vectors.set('https://something', 1);
tests/unit/search/find-similar-threshold.test.ts
- Executable scriptline 1
Executable file - Network accessline 65
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 66
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 67
url: 'https://example.com', - Network accessline 68
finalUrl: 'https://example.com', - Network accessline 102
for (let i = 0; i < 5; i++) { seedCache( `https://noise-${i}.example`, - Network accessline 103
seedCache( `https://noise-${i}.example`, `Framework Note ${i}`, - Network accessline 104
`https://noise-${i}.example`, - Network accessline 132
it('keeps results whose fused_score meets or exceeds the threshold', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 133
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 134
'https://react.dev/hooks', - Network accessline 156
seedCache( 'https://a.com/x', - Network accessline 157
'https://a.com/x', - Network accessline 160
); seedCache( 'https://b.com/x', - Network accessline 161
seedCache( 'https://b.com/x', 'B', - Network accessline 162
'https://b.com/x', - Network accessline 179
it('threshold:0 (or omitted) preserves existing behavior', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 180
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 181
'https://react.dev/hooks',
tests/unit/search/find-similar.test.ts
- Executable scriptline 1
Executable file - Network accessline 57
{ title: 'Web Result 1', url: 'https://web.example.com/1', - Network accessline 58
title: 'Web Result 1', url: 'https://web.example.com/1', snippet: 'A web search result', - Network accessline 59
url: 'https://web.example.com/1', - Network accessline 64
{ title: 'Web Result 2', url: 'https://web.example.com/2', - Network accessline 65
title: 'Web Result 2', url: 'https://web.example.com/2', snippet: 'Another web result', - Network accessline 66
url: 'https://web.example.com/2', - Network accessline 74
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/page', - Network accessline 75
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 76
url: 'https://example.com/page', - Network accessline 77
finalUrl: 'https://example.com/page', - Network accessline 110
it('finds similar pages from cache using concept', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks let you use **state** and lifecycle features in function components.'); - Network accessline 111
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks let you use **state** and lifecycle features in function components.'); - Network accessline 112
seedCache('https://vuejs.org/guide', 'Vue Guide', '# Vue.js Guide\n\nVue provides **reactive** state management for building UIs.'); - Network accessline 113
seedCache('https://example.com/unrelated', 'Cooking Recipes', '# Best Pasta Recipes\n\nHow to make **pasta** from scratch.'); - Network accessline 128
for (let i = 0; i < 15; i++) { seedCache( `https://example.com/page${i}`, - Network accessline 129
seedCache( `https://example.com/page${i}`, `React Page ${i}`, - Network accessline 130
`https://example.com/page${i}`, - Network accessline 156
it('includes cache_hits and search_hits counts', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state** management.'); - Network accessline 157
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state** management.'); - Network accessline 170
it('excludes the input URL from results when url is provided', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state** and lifecycle.'); - Network accessline 171
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state** and lifecycle.'); - Network accessline 172
seedCache('https://react.dev/components', 'React Components', '# React Components\n\nBuild UIs with **components** and hooks.'); - Network accessline 174
const result = await findSimilar( { url: 'https://react.dev/hooks', include_web: false }, - Network accessline 175
{ url: 'https://react.dev/hooks', include_web: false }, - Network accessline 180
const urls = result.results.map(r => r.url); expect(urls).not.toContain('https://react.dev/hooks'); - Network accessline 181
expect(urls).not.toContain('https://react.dev/hooks'); - Network accessline 184
it('applies include_domains filter', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 185
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 186
seedCache('https://vuejs.org/guide', 'Vue Guide', '# Vue Guide\n\nReactive **state** management.'); - Network accessline 187
seedCache('https://angular.dev/guide', 'Angular Guide', '# Angular Guide\n\nAngular **state** management.'); - Network accessline 204
it('applies exclude_domains filter', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 205
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 206
seedCache('https://spam.com/hooks', 'Spam Hooks', '# Spam\n\nHooks for **state** on spam.'); - Network accessline 223
it('returns match_signals with fts5_rank and fused_score', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 224
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 240
it('each result has source field set correctly', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 241
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 266
it('respects include_cache=false', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 267
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 309
it('url takes priority when both url and concept provided', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state** management.'); - Network accessline 310
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state** management.'); - Network accessline 311
seedCache('https://react.dev/components', 'React Components', '# Components\n\nBuild UIs with **components**.'); - Network accessline 313
const result = await findSimilar( { url: 'https://react.dev/hooks', - Network accessline 314
{ url: 'https://react.dev/hooks', concept: 'completely different topic', - Network accessline 315
url: 'https://react.dev/hooks', - Network accessline 328
const result = await findSimilar( { url: 'https://new-site.com/page', - Network accessline 329
{ url: 'https://new-site.com/page', include_web: false, - Network accessline 330
url: 'https://new-site.com/page', - Network accessline 338
expect(mockRouter.fetch).toHaveBeenCalledWith( 'https://new-site.com/page', - Network accessline 339
'https://new-site.com/page', - Network accessline 344
it('defaults include_cache to true', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 345
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 369
for (let i = 0; i < 15; i++) { seedCache( `https://example.com/react${i}`, - Network accessline 370
seedCache( `https://example.com/react${i}`, `React Page ${i}`, - Network accessline 371
`https://example.com/react${i}`, - Network accessline 386
it('results are sorted by fused_score descending', async () => { seedCache('https://a.com', 'React Hooks', '# React Hooks\n\n**State** management with hooks.'); - Network accessline 387
seedCache('https://a.com', 'React Hooks', '# React Hooks\n\n**State** management with hooks.'); - Network accessline 388
seedCache('https://b.com', 'Vue State', '# Vue\n\n**State** management in Vue.'); - Network accessline 389
seedCache('https://c.com', 'Angular', '# Angular\n\nAngular **state** patterns.'); - Network accessline 414
it('sets cold_start note when embeddings unavailable despite populated cache', async () => { seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 415
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 428
seedCache('https://react.dev/hooks', 'React Hooks', '# React Hooks\n\nHooks for **state**.'); - Network accessline 455
for (let i = 0; i < 5; i++) { seedCache( `https://noise-${i}.example`, - Network accessline 456
seedCache( `https://noise-${i}.example`, `Framework Note ${i}`, - Network accessline 457
`https://noise-${i}.example`, - Network accessline 491
for (let i = 0; i < 5; i++) { seedCache( `https://noise-${i}.example`, - Network accessline 492
seedCache( `https://noise-${i}.example`, `Framework Note ${i}`, - Network accessline 493
`https://noise-${i}.example`, - Network accessline 527
seedCache( 'https://example.com/deployment', - Network accessline 528
'https://example.com/deployment', - Network accessline 536
for (let i = 0; i < 4; i++) { seedCache( `https://unrelated-${i}.example`, - Network accessline 537
seedCache( `https://unrelated-${i}.example`, `Unrelated ${i}`, - Network accessline 538
`https://unrelated-${i}.example`, - Network accessline 568
for (let i = 0; i < 10; i++) { seedCache( `https://example.com/rag-${i}`, - Network accessline 569
seedCache( `https://example.com/rag-${i}`, `RAG explainer ${i}`, - Network accessline 570
`https://example.com/rag-${i}`, - Network accessline 597
for (let i = 0; i < 25; i++) { seedCache( `https://unrelated-${i}.example`, - Network accessline 598
seedCache( `https://unrelated-${i}.example`, `Unrelated ${i}`, - Network accessline 599
`https://unrelated-${i}.example`, - Network accessline 620
it('omits ranking_debug by default (no shape regression)', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 621
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 622
'https://react.dev/hooks', - Network accessline 639
it('emits ranking_debug with fts5_rank + rrf_score when include_ranking_debug=true on cache-only results', async () => { seedCache( 'https://react.dev/hooks', - Network accessline 640
seedCache( 'https://react.dev/hooks', 'React Hooks', - Network accessline 641
'https://react.dev/hooks', - Network accessline 644
); seedCache( 'https://vuejs.org/guide', - Network accessline 645
seedCache( 'https://vuejs.org/guide', 'Vue Guide', - Network accessline 646
'https://vuejs.org/guide',
tests/unit/search/find-similar/crawl-rank.test.ts
- Executable scriptline 1
Executable file - Network accessline 75
describe('crawlRank', () => { it('happy path: seed + 3 linked pages, ranked by cosine similarity', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 76
it('happy path: seed + 3 linked pages, ranked by cosine similarity', async () => { const seedUrl = 'https://example.com/seed'; const links = [ - Network accessline 77
const seedUrl = 'https://example.com/seed'; - Network accessline 78
const links = [ 'https://example.com/a', 'https://example.com/b', - Network accessline 79
'https://example.com/a', - Network accessline 80
'https://example.com/b', - Network accessline 81
'https://example.com/c', - Network accessline 127
it('seed fetch failure returns error', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 128
const seedUrl = 'https://example.com/seed'; - Network accessline 138
it('non-2xx seed status returns error', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 139
const seedUrl = 'https://example.com/seed'; - Network accessline 149
it('no same-host links returns empty with error', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 150
const seedUrl = 'https://example.com/seed'; - Network accessline 155
mockExtract.mockResolvedValueOnce(makeExtraction('Seed', 'body', [ 'https://other-host.com/x', - Network accessline 156
'https://other-host.com/x', - Network accessline 157
'https://another.org/y', - Network accessline 167
it('include_domains widens crawl to other hosts', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 168
const seedUrl = 'https://example.com/seed'; - Network accessline 169
const externalLink = 'https://docs.other.com/page'; - Network accessline 196
it('non-matching exclude_domains does not drop anything', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 197
const seedUrl = 'https://example.com/seed'; - Network accessline 198
const keep = 'https://example.com/keep'; - Network accessline 199
const drop = 'https://example.com/drop'; - Network accessline 229
it('exclude_domains actually drops a matched host', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 230
const seedUrl = 'https://example.com/seed'; - Network accessline 231
const externalGood = 'https://docs.example.org/x'; - Network accessline 232
const externalBad = 'https://blocked.example.org/y'; - Network accessline 260
it('embedding unavailable returns degraded link-order results with error message', async () => { embedProviderShouldFail = true; const seedUrl = 'https://example.com/seed'; - Network accessline 261
embedProviderShouldFail = true; const seedUrl = 'https://example.com/seed'; const links = [ - Network accessline 262
const seedUrl = 'https://example.com/seed'; - Network accessline 263
const links = [ 'https://example.com/a', 'https://example.com/b', - Network accessline 264
'https://example.com/a', - Network accessline 265
'https://example.com/b', - Network accessline 266
'https://example.com/c', - Network accessline 285
it('max_pages caps the crawl', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 286
const seedUrl = 'https://example.com/seed'; - Network accessline 287
const links = Array.from({ length: 25 }, (_, i) => `https://example.com/p${i}`); - Network accessline 318
it('one linked page fetch failure: others still ranked', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 319
const seedUrl = 'https://example.com/seed'; - Network accessline 320
const links = [ 'https://example.com/a', 'https://example.com/b', - Network accessline 321
'https://example.com/a', - Network accessline 322
'https://example.com/b', - Network accessline 323
'https://example.com/c', - Network accessline 354
it('max_results caps output below crawl count', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 355
const seedUrl = 'https://example.com/seed'; - Network accessline 356
const links = [ 'https://example.com/a', 'https://example.com/b', - Network accessline 357
'https://example.com/a', - Network accessline 358
'https://example.com/b', - Network accessline 359
'https://example.com/c', - Network accessline 360
'https://example.com/d', - Network accessline 388
it('dedupes duplicate links from extraction output', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 389
const seedUrl = 'https://example.com/seed'; - Network accessline 390
const link = 'https://example.com/a'; - Network accessline 416
const seedUrl = 'http://169.254.169.254/latest/meta-data/'; - Network accessline 426
it('skips a discovered 1-hop link that fails the SSRF guard (others still ranked)', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 427
const seedUrl = 'https://example.com/seed'; - Network accessline 428
const good = 'https://example.com/a'; - Network accessline 430
const bad = 'http://169.254.169.254/internal'; - Network accessline 458
it('drops invalid URLs from extracted links', async () => { const seedUrl = 'https://example.com/seed'; - Network accessline 459
const seedUrl = 'https://example.com/seed'; - Network accessline 460
const valid = 'https://example.com/ok';
tests/unit/search/find-similar/generate-search-queries.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/find-similar/mode.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
describe('selectMode', () => { it('returns cache when no mode given (default)', () => { const input: FindSimilarInput = { url: 'https://example.com' }; - Network accessline 6
it('returns cache when no mode given (default)', () => { const input: FindSimilarInput = { url: 'https://example.com' }; expect(selectMode(input)).toBe('cache'); - Network accessline 7
const input: FindSimilarInput = { url: 'https://example.com' }; - Network accessline 11
it('returns cache when mode=auto (auto falls through to legacy flow)', () => { const input: FindSimilarInput = { url: 'https://example.com', mode: 'auto' }; - Network accessline 12
const input: FindSimilarInput = { url: 'https://example.com', mode: 'auto' }; - Network accessline 16
it('returns cache when mode=cache is explicit', () => { const input: FindSimilarInput = { url: 'https://example.com', mode: 'cache' }; - Network accessline 17
const input: FindSimilarInput = { url: 'https://example.com', mode: 'cache' }; - Network accessline 26
it('returns crawl-rank when mode=crawl-rank with a url', () => { const input: FindSimilarInput = { url: 'https://example.com', mode: 'crawl-rank' }; - Network accessline 27
const input: FindSimilarInput = { url: 'https://example.com', mode: 'crawl-rank' }; - Network accessline 51
it('respects explicit mode even when both url and concept are present', () => { const input: FindSimilarInput = { url: 'https://example.com', - Network accessline 52
const input: FindSimilarInput = { url: 'https://example.com', concept: 'react', - Network accessline 53
url: 'https://example.com',
tests/unit/search/format-rename.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/freshness.test.ts
- Executable scriptline 1
Executable file - Network accessline 82
describe('computeFreshnessSignal (sub-ticket 3.11)', () => { it('extracted when engine supplied published_date', () => { const fs = computeFreshnessSignal('https://example.com/x', '2024-03-15T00:00:00Z'); - Network accessline 83
it('extracted when engine supplied published_date', () => { const fs = computeFreshnessSignal('https://example.com/x', '2024-03-15T00:00:00Z'); expect(fs.confidence).toBe('extracted'); - Network accessline 84
const fs = computeFreshnessSignal('https://example.com/x', '2024-03-15T00:00:00Z'); - Network accessline 90
it('inferred-url when URL contains /YYYY/MM/', () => { const fs = computeFreshnessSignal('https://blog.example.com/2024/03/post-slug', undefined); - Network accessline 91
const fs = computeFreshnessSignal('https://blog.example.com/2024/03/post-slug', undefined); - Network accessline 97
it('inferred-url with day in URL', () => { const fs = computeFreshnessSignal('https://news.example.com/2024/03/15/headline', undefined); - Network accessline 98
const fs = computeFreshnessSignal('https://news.example.com/2024/03/15/headline', undefined); - Network accessline 107
it('returns undefined when no signal can be extracted or inferred', () => { const fs = computeFreshnessSignal('https://example.com/page', undefined); - Network accessline 108
const fs = computeFreshnessSignal('https://example.com/page', undefined); - Network accessline 115
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/a', '2024-01-01T00:00:00Z'), - Network accessline 116
makeEntry('bing', [ makeResult('bing', 'https://example.com/a', '2024-01-01T00:00:00Z'), ]), - Network accessline 117
makeResult('bing', 'https://example.com/a', '2024-01-01T00:00:00Z'), - Network accessline 130
it('attaches inferred-url when URL embeds a date', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://blog.example.com/2024/05/post')]), - Network accessline 131
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://blog.example.com/2024/05/post')]), ]; - Network accessline 132
makeEntry('bing', [makeResult('bing', 'https://blog.example.com/2024/05/post')]), - Network accessline 152
makeEntry('bing', [makeResult('bing', 'https://example.com/no-date-page')]),
tests/unit/search/highlights-evidence.test.ts
tests/unit/search/highlights.test.ts
- Executable scriptline 1
Executable file - Network accessline 26
{ title: 'React Server Components', url: 'https://react.dev/rsc', - Network accessline 27
title: 'React Server Components', url: 'https://react.dev/rsc', snippet: 'RSC renders on the server.', - Network accessline 28
url: 'https://react.dev/rsc', - Network accessline 43
{ title: 'Next.js Docs', url: 'https://nextjs.org/docs', - Network accessline 44
title: 'Next.js Docs', url: 'https://nextjs.org/docs', snippet: 'Next.js uses RSC.', - Network accessline 45
url: 'https://nextjs.org/docs', - Network accessline 139
expect(out.citations).toHaveLength(2); expect(out.citations[0].index).toBe(1); expect(out.citations[0].url).toBe('https://react.dev/rsc'); - Network accessline 140
expect(out.citations[0].index).toBe(1); expect(out.citations[0].url).toBe('https://react.dev/rsc'); }); - Network accessline 141
expect(out.citations[0].url).toBe('https://react.dev/rsc');
tests/unit/search/hybrid/merge.test.ts
- Executable scriptline 1
Executable file - Network accessline 26
const core = makeOutput({ results: [ makeResult('a', 'https://a.com/'), - Network accessline 27
results: [ makeResult('a', 'https://a.com/'), makeResult('b', 'https://b.com/'), - Network accessline 28
makeResult('a', 'https://a.com/'), - Network accessline 29
makeResult('b', 'https://b.com/'), - Network accessline 32
const searxng = makeOutput({ results: [ makeResult('c', 'https://c.com/'), - Network accessline 33
results: [ makeResult('c', 'https://c.com/'), makeResult('d', 'https://d.com/'), - Network accessline 34
makeResult('c', 'https://c.com/'), - Network accessline 35
makeResult('d', 'https://d.com/'), - Network accessline 38
const merged = mergeResults(core, searxng); expect(merged.results.map((r) => r.url)).toEqual([ 'https://a.com/', - Network accessline 39
expect(merged.results.map((r) => r.url)).toEqual([ 'https://a.com/', 'https://c.com/', - Network accessline 40
'https://a.com/', - Network accessline 41
'https://c.com/', - Network accessline 42
'https://b.com/', - Network accessline 43
'https://d.com/', - Network accessline 48
const core = makeOutput({ results: [ makeResult('A', 'https://www.example.com/page'), - Network accessline 49
results: [ makeResult('A', 'https://www.example.com/page'), makeResult('B', 'https://b.com/'), - Network accessline 50
makeResult('A', 'https://www.example.com/page'), - Network accessline 51
makeResult('B', 'https://b.com/'), - Network accessline 54
const searxng = makeOutput({ results: [ makeResult('A-from-searxng', 'https://example.com/page/'), - Network accessline 55
results: [ makeResult('A-from-searxng', 'https://example.com/page/'), makeResult('C', 'https://c.com/'), - Network accessline 56
makeResult('A-from-searxng', 'https://example.com/page/'), - Network accessline 57
makeResult('C', 'https://c.com/'), - Network accessline 69
const core = makeOutput({ results: [ makeResult('a', 'https://a.com/'), - Network accessline 70
results: [ makeResult('a', 'https://a.com/'), makeResult('b', 'https://b.com/'), - Network accessline 71
makeResult('a', 'https://a.com/'), - Network accessline 72
makeResult('b', 'https://b.com/'), - Network accessline 73
makeResult('c', 'https://c.com/'), - Network accessline 75
}); const searxng = makeOutput({ results: [makeResult('d', 'https://d.com/')], - Network accessline 76
const searxng = makeOutput({ results: [makeResult('d', 'https://d.com/')], }); - Network accessline 77
results: [makeResult('d', 'https://d.com/')], - Network accessline 83
it('unions engines_used', () => { const core = makeOutput({ results: [makeResult('a', 'https://a.com/')], - Network accessline 84
const core = makeOutput({ results: [makeResult('a', 'https://a.com/')], engines_used: ['bing', 'ddg'], - Network accessline 85
results: [makeResult('a', 'https://a.com/')], - Network accessline 87
}); const searxng = makeOutput({ results: [makeResult('b', 'https://b.com/')], - Network accessline 88
const searxng = makeOutput({ results: [makeResult('b', 'https://b.com/')], engines_used: ['ddg', 'wikipedia'], - Network accessline 89
results: [makeResult('b', 'https://b.com/')], - Network accessline 96
it('concatenates engine_outcomes when either side has them', () => { const core = makeOutput({ results: [makeResult('a', 'https://a.com/')], - Network accessline 97
const core = makeOutput({ results: [makeResult('a', 'https://a.com/')], engine_outcomes: [ - Network accessline 98
results: [makeResult('a', 'https://a.com/')], - Network accessline 102
}); const searxng = makeOutput({ results: [makeResult('b', 'https://b.com/')], - Network accessline 103
const searxng = makeOutput({ results: [makeResult('b', 'https://b.com/')], engine_outcomes: [ - Network accessline 104
results: [makeResult('b', 'https://b.com/')], - Network accessline 117
it('omits engine_outcomes when neither side has them', () => { const core = makeOutput({ results: [makeResult('a', 'https://a.com/')] }); - Network accessline 118
const core = makeOutput({ results: [makeResult('a', 'https://a.com/')] }); - Network accessline 119
const searxng = makeOutput({ results: [makeResult('b', 'https://b.com/')] }); - Network accessline 126
const searxng = makeOutput({ results: [ makeResult('a', 'https://a.com/'), - Network accessline 127
results: [ makeResult('a', 'https://a.com/'), makeResult('b', 'https://b.com/'), - Network accessline 128
makeResult('a', 'https://a.com/'), - Network accessline 129
makeResult('b', 'https://b.com/'), - Network accessline 132
const merged = mergeResults(core, searxng); expect(merged.results.map((r) => r.url)).toEqual([ 'https://a.com/', - Network accessline 133
expect(merged.results.map((r) => r.url)).toEqual([ 'https://a.com/', 'https://b.com/', - Network accessline 134
'https://a.com/', - Network accessline 135
'https://b.com/', - Network accessline 140
const core = makeOutput({ results: [ makeResult('a', 'https://a.com/'), - Network accessline 141
results: [ makeResult('a', 'https://a.com/'), makeResult('b', 'https://b.com/'), - Network accessline 142
makeResult('a', 'https://a.com/'), - Network accessline 143
makeResult('b', 'https://b.com/'), - Network accessline 147
const merged = mergeResults(core, searxng); expect(merged.results.map((r) => r.url)).toEqual([ 'https://a.com/', - Network accessline 148
expect(merged.results.map((r) => r.url)).toEqual([ 'https://a.com/', 'https://b.com/', - Network accessline 149
'https://a.com/', - Network accessline 150
'https://b.com/', - Network accessline 154
it('prefers the result with markdown content when both providers return the same URL', () => { const core = makeOutput({ results: [makeResult('A', 'https://a.com/', 0.6)], - Network accessline 155
const core = makeOutput({ results: [makeResult('A', 'https://a.com/', 0.6)], }); - Network accessline 156
results: [makeResult('A', 'https://a.com/', 0.6)], - Network accessline 158
const searxng = makeOutput({ results: [ makeResult('A-rich', 'https://a.com/', 0.5, { - Network accessline 159
results: [ makeResult('A-rich', 'https://a.com/', 0.5, { markdown_content: '# Hello', - Network accessline 160
makeResult('A-rich', 'https://a.com/', 0.5, {
tests/unit/search/hybrid/router.test.ts
- Executable scriptline 1
Executable file - Network accessline 80
const coreOut: SearchOutput = { results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 81
results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 82
makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 83
makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 84
makeResult('OpenShift Operators', 'https://openshift.com/operators', 0.6), - Network accessline 89
}; const core = mockProvider('core', () => ({ ok: true, data: coreOut })); const sx = mockProvider('searxng', () => ok({ results: [makeResult('x', 'https://x.com/')] })); - Network accessline 90
const core = mockProvider('core', () => ({ ok: true, data: coreOut })); const sx = mockProvider('searxng', () => ok({ results: [makeResult('x', 'https://x.com/')] })); const hybrid = new HybridSearchProvider(core, sx); - Network accessline 91
const sx = mockProvider('searxng', () => ok({ results: [makeResult('x', 'https://x.com/')] })); - Network accessline 108
const core = mockProvider('core', () => ok({ results: [makeResult('only-one', 'https://example.com/a', 0.8)], - Network accessline 109
ok({ results: [makeResult('only-one', 'https://example.com/a', 0.8)], engines_used: ['bing'], - Network accessline 110
results: [makeResult('only-one', 'https://example.com/a', 0.8)], - Network accessline 115
ok({ results: [ makeResult('two', 'https://example.com/b', 0.7), - Network accessline 116
results: [ makeResult('two', 'https://example.com/b', 0.7), makeResult('three', 'https://example.com/c', 0.6), - Network accessline 117
makeResult('two', 'https://example.com/b', 0.7), - Network accessline 118
makeResult('three', 'https://example.com/c', 0.6), - Network accessline 143
makeResult( 'Next | Online Shopping Clothes Shoes Bags', 'https://next.co.uk/', - Network accessline 144
'Next | Online Shopping Clothes Shoes Bags', 'https://next.co.uk/', 1.0, - Network accessline 145
'https://next.co.uk/', - Network accessline 152
const sx = mockProvider('searxng', () => ok({ results: [makeResult('Next.js', 'https://nextjs.org/', 0.9)], - Network accessline 153
ok({ results: [makeResult('Next.js', 'https://nextjs.org/', 0.9)], engines_used: ['searxng:google'], - Network accessline 154
results: [makeResult('Next.js', 'https://nextjs.org/', 0.9)], - Network accessline 184
it('returns core result when signal fires but searxng fails', async () => { const coreOut: SearchOutput = { results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 185
const coreOut: SearchOutput = { results: [makeResult('only', 'https://example.com/a', 0.8)], query: 'q', - Network accessline 186
results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 200
expect(out.ok).toBe(true); if (!out.ok) return; expect(out.data.results.map((r) => r.url)).toEqual(['https://example.com/a']); - Network accessline 201
if (!out.ok) return; expect(out.data.results.map((r) => r.url)).toEqual(['https://example.com/a']); expect(sx.search).toHaveBeenCalledTimes(1); - Network accessline 202
expect(out.data.results.map((r) => r.url)).toEqual(['https://example.com/a']); - Network accessline 206
it('returns core result when signal fires and searxng throws synchronously', async () => { const coreOut: SearchOutput = { results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 207
const coreOut: SearchOutput = { results: [makeResult('only', 'https://example.com/a', 0.8)], query: 'q', - Network accessline 208
results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 230
const core = mockProvider('core', () => ok({ results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 231
ok({ results: [makeResult('only', 'https://example.com/a', 0.8)], engines_used: ['bing'], - Network accessline 232
results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 235
); const sx = mockProvider('searxng', () => ok({ results: [makeResult('two', 'https://other.com/b', 0.6)] }), - Network accessline 236
const sx = mockProvider('searxng', () => ok({ results: [makeResult('two', 'https://other.com/b', 0.6)] }), ); - Network accessline 237
ok({ results: [makeResult('two', 'https://other.com/b', 0.6)] }), - Network accessline 254
ok({ results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 255
results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 256
makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 257
makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 279
const coreOut: SearchOutput = { results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 280
results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 284
}; const core = mockProvider('core', () => ({ ok: true, data: coreOut })); const sx = mockProvider('searxng', () => ok({ results: [makeResult('b', 'https://b.com/')] })); - Network accessline 286
const sx = mockProvider('searxng', () => ok({ results: [makeResult('b', 'https://b.com/')] })); - Network accessline 296
if (!out.ok) return; expect(sx.search).not.toHaveBeenCalled(); expect(out.data.results.map((r) => r.url)).toEqual(['https://example.com/a']); - Network accessline 297
expect(sx.search).not.toHaveBeenCalled(); expect(out.data.results.map((r) => r.url)).toEqual(['https://example.com/a']); expect(out.data.warning).toBeTruthy(); - Network accessline 298
expect(out.data.results.map((r) => r.url)).toEqual(['https://example.com/a']); - Network accessline 310
ok({ results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 311
results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 312
makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.8), - Network accessline 313
makeResult('Operator Framework', 'https://operatorframework.io/', 0.7), - Network accessline 331
const core = mockProvider('core', () => ok({ results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 332
ok({ results: [makeResult('only', 'https://example.com/a', 0.8)], }), - Network accessline 333
results: [makeResult('only', 'https://example.com/a', 0.8)], - Network accessline 335
); const sx = mockProvider('searxng', () => ok({ results: [makeResult('b', 'https://b.com/')] }), - Network accessline 336
const sx = mockProvider('searxng', () => ok({ results: [makeResult('b', 'https://b.com/')] }), ); - Network accessline 337
ok({ results: [makeResult('b', 'https://b.com/')] }),
tests/unit/search/hybrid/signals.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
makeResult( 'Next | Online Shopping Clothes Shoes Bags Homeware', 'https://www.next.co.uk/', - Network accessline 32
'Next | Online Shopping Clothes Shoes Bags Homeware', 'https://www.next.co.uk/', ), - Network accessline 33
'https://www.next.co.uk/', - Network accessline 41
const input: SearchInput = { query: 'next js framework' }; const output = makeOutput({ results: [makeResult('Next | Online', 'https://next.co.uk/')], - Network accessline 42
const output = makeOutput({ results: [makeResult('Next | Online', 'https://next.co.uk/')], }); - Network accessline 43
results: [makeResult('Next | Online', 'https://next.co.uk/')], - Network accessline 49
const input: SearchInput = { query: 'kubernetes' }; const output = makeOutput({ results: [makeResult('Kubernetes', 'https://kubernetes.io/')], - Network accessline 50
const output = makeOutput({ results: [makeResult('Kubernetes', 'https://kubernetes.io/')], }); - Network accessline 51
results: [makeResult('Kubernetes', 'https://kubernetes.io/')], - Network accessline 57
const input: SearchInput = { query: 'next' }; const output = makeOutput({ results: [makeResult('Next.js by Vercel', 'https://nextjs.org/')], - Network accessline 58
const output = makeOutput({ results: [makeResult('Next.js by Vercel', 'https://nextjs.org/')], }); - Network accessline 59
results: [makeResult('Next.js by Vercel', 'https://nextjs.org/')], - Network accessline 65
const input: SearchInput = { query: 'next' }; const output = makeOutput({ results: [makeResult('Next docs', 'https://next.co.uk/')], - Network accessline 66
const output = makeOutput({ results: [makeResult('Next docs', 'https://next.co.uk/')], }); - Network accessline 67
results: [makeResult('Next docs', 'https://next.co.uk/')], - Network accessline 82
makeResult( 'Apple Online Store Shopping Products Today Offers', 'https://apple.com/', - Network accessline 83
'Apple Online Store Shopping Products Today Offers', 'https://apple.com/', ), - Network accessline 84
'https://apple.com/', - Network accessline 94
const input: SearchInput = { query: 'q', include_domains: ['example.com'] }; const output = makeOutput({ results: [makeResult('a', 'https://example.com/a')], - Network accessline 95
const output = makeOutput({ results: [makeResult('a', 'https://example.com/a')], }); - Network accessline 96
results: [makeResult('a', 'https://example.com/a')], - Network accessline 121
const output = makeOutput({ results: [ makeResult('a', 'https://example.com/a'), - Network accessline 122
results: [ makeResult('a', 'https://example.com/a'), makeResult('b', 'https://example.com/b'), - Network accessline 123
makeResult('a', 'https://example.com/a'), - Network accessline 124
makeResult('b', 'https://example.com/b'), - Network accessline 145
const input: SearchInput = { query: 'q' }; const output = makeOutput({ results: [makeResult('a', 'https://a.com/')], - Network accessline 146
const output = makeOutput({ results: [makeResult('a', 'https://a.com/')], engine_outcomes: [ - Network accessline 147
results: [makeResult('a', 'https://a.com/')], - Network accessline 179
makeResult( 'Apple Online Store Shopping Products Today Offers', 'https://apple.com/', - Network accessline 180
'Apple Online Store Shopping Products Today Offers', 'https://apple.com/', 1.0, - Network accessline 181
'https://apple.com/', - Network accessline 190
const input: SearchInput = { query: 'apple' }; const output = makeOutput({ results: [makeResult('Apple Online Store', 'https://apple.com/', 0.8)], - Network accessline 191
const output = makeOutput({ results: [makeResult('Apple Online Store', 'https://apple.com/', 0.8)], }); - Network accessline 192
results: [makeResult('Apple Online Store', 'https://apple.com/', 0.8)], - Network accessline 199
const output = makeOutput({ results: [ makeResult('apple ios sdk reference', 'https://developer.apple.com/ios', 0.99), - Network accessline 200
results: [ makeResult('apple ios sdk reference', 'https://developer.apple.com/ios', 0.99), ], - Network accessline 201
makeResult('apple ios sdk reference', 'https://developer.apple.com/ios', 0.99), - Network accessline 219
makeResult( 'Next | Online Shopping Bags Clothes Homeware', 'https://next.co.uk/', - Network accessline 220
'Next | Online Shopping Bags Clothes Homeware', 'https://next.co.uk/', 1.0, - Network accessline 221
'https://next.co.uk/', - Network accessline 234
const output = makeOutput({ results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.7), - Network accessline 235
results: [ makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.7), makeResult('Operator Framework', 'https://operatorframework.io/', 0.6), - Network accessline 236
makeResult('Kubernetes Operators', 'https://kubernetes.io/operators', 0.7), - Network accessline 237
makeResult('Operator Framework', 'https://operatorframework.io/', 0.6),
tests/unit/search/include-domains-hard-filter.test.ts
- Executable scriptline 1
Executable file - Network accessline 78
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://react.dev/learn'), - Network accessline 79
makeEntry('bing', [ makeResult('bing', 'https://react.dev/learn'), makeResult('bing', 'https://medium.com/a'), - Network accessline 80
makeResult('bing', 'https://react.dev/learn'), - Network accessline 81
makeResult('bing', 'https://medium.com/a'), - Network accessline 82
makeResult('bing', 'https://blog.example.com/x'), - Network accessline 83
makeResult('bing', 'https://stackoverflow.com/q/1'), - Network accessline 84
makeResult('bing', 'https://reddit.com/r/react'), - Network accessline 85
makeResult('bing', 'https://news.ycombinator.com/x'), - Network accessline 103
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://medium.com/a'), - Network accessline 104
makeEntry('bing', [ makeResult('bing', 'https://medium.com/a'), makeResult('bing', 'https://blog.example.com/x'), - Network accessline 105
makeResult('bing', 'https://medium.com/a'), - Network accessline 106
makeResult('bing', 'https://blog.example.com/x'), - Network accessline 120
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://docs.react.dev/x'), - Network accessline 121
makeEntry('bing', [ makeResult('bing', 'https://docs.react.dev/x'), makeResult('bing', 'https://blog.react.dev/y'), - Network accessline 122
makeResult('bing', 'https://docs.react.dev/x'), - Network accessline 123
makeResult('bing', 'https://blog.react.dev/y'), - Network accessline 124
makeResult('bing', 'https://medium.com/x'), - Network accessline 142
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://notreact.dev/x'), - Network accessline 143
makeEntry('bing', [ makeResult('bing', 'https://notreact.dev/x'), makeResult('bing', 'https://react.dev/y'), - Network accessline 144
makeResult('bing', 'https://notreact.dev/x'), - Network accessline 145
makeResult('bing', 'https://react.dev/y'), - Network accessline 162
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), - Network accessline 163
makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), makeResult('bing', 'https://spam.com/x'), - Network accessline 164
makeResult('bing', 'https://example.com/a'), - Network accessline 165
makeResult('bing', 'https://spam.com/x'), - Network accessline 166
makeResult('bing', 'https://spam.com/y'), - Network accessline 194
if (q.includes('site:')) { return [ makeResult('bing', 'https://gnu.org/software/make/manual/one'), - Network accessline 195
return [ makeResult('bing', 'https://gnu.org/software/make/manual/one'), makeResult('bing', 'https://medium.com/off'), - Network accessline 196
makeResult('bing', 'https://gnu.org/software/make/manual/one'), - Network accessline 197
makeResult('bing', 'https://medium.com/off'), - Network accessline 199
} return [ makeResult('bing', 'https://gnu.org/software/make/manual/one'), - Network accessline 200
return [ makeResult('bing', 'https://gnu.org/software/make/manual/one'), makeResult('bing', 'https://gnu.org/software/make/manual/two'), - Network accessline 201
makeResult('bing', 'https://gnu.org/software/make/manual/one'), - Network accessline 202
makeResult('bing', 'https://gnu.org/software/make/manual/two'), - Network accessline 203
makeResult('bing', 'https://gnu.org/software/make/manual/three'), - Network accessline 204
makeResult('bing', 'https://reddit.com/off'), - Network accessline 205
makeResult('bing', 'https://stackoverflow.com/off'), - Network accessline 228
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://react.dev/a'), - Network accessline 229
makeEntry('bing', [ makeResult('bing', 'https://react.dev/a'), makeResult('bing', 'https://nextjs.org/b'), - Network accessline 230
makeResult('bing', 'https://react.dev/a'), - Network accessline 231
makeResult('bing', 'https://nextjs.org/b'), - Network accessline 232
makeResult('bing', 'https://vuejs.org/c'), - Network accessline 233
makeResult('bing', 'https://medium.com/d'),
tests/unit/search/include-images.test.ts
- Executable scriptline 1
Executable file - Network accessline 86
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/a', 'https://cdn.example.com/a.jpg', 'alt-a'), - Network accessline 87
makeEntry('bing', [ makeResult('bing', 'https://example.com/a', 'https://cdn.example.com/a.jpg', 'alt-a'), makeResult('bing', 'https://example.com/b', 'https://cdn.example.com/b.png'), - Network accessline 88
makeResult('bing', 'https://example.com/a', 'https://cdn.example.com/a.jpg', 'alt-a'), - Network accessline 89
makeResult('bing', 'https://example.com/b', 'https://cdn.example.com/b.png'), - Network accessline 90
makeResult('bing', 'https://example.com/c'), - Network accessline 102
const aImg = out.data.images?.find((i) => i.url.endsWith('a.jpg')); expect(aImg?.alt).toBe('alt-a'); expect(aImg?.source_url).toBe('https://example.com/a'); - Network accessline 103
expect(aImg?.alt).toBe('alt-a'); expect(aImg?.source_url).toBe('https://example.com/a'); const bImg = out.data.images?.find((i) => i.url.endsWith('b.png')); - Network accessline 104
expect(aImg?.source_url).toBe('https://example.com/a'); - Network accessline 109
it('omits images array when include_images is not set', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a', 'https://cdn.example.com/a.jpg')]), - Network accessline 110
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a', 'https://cdn.example.com/a.jpg')]), ]; - Network accessline 111
makeEntry('bing', [makeResult('bing', 'https://example.com/a', 'https://cdn.example.com/a.jpg')]), - Network accessline 124
verticalState.general = [ makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), - Network accessline 125
makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), makeResult('bing', 'https://example.com/b'), - Network accessline 126
makeResult('bing', 'https://example.com/a'), - Network accessline 127
makeResult('bing', 'https://example.com/b'), - Network accessline 147
{ title: 'T', url: 'https://example.com/a', - Network accessline 148
title: 'T', url: 'https://example.com/a', description: 'D', - Network accessline 149
url: 'https://example.com/a', - Network accessline 150
description: 'D', thumbnail: { src: 'https://cdn.example.com/a.jpg' }, } as unknown, - Network accessline 151
thumbnail: { src: 'https://cdn.example.com/a.jpg' }, - Network accessline 155
} as Parameters<typeof engine.parseResults>[0]; const out = engine.parseResults(body, 10); expect(out[0].image_url).toBe('https://cdn.example.com/a.jpg'); - Network accessline 156
const out = engine.parseResults(body, 10); expect(out[0].image_url).toBe('https://cdn.example.com/a.jpg'); }); - Network accessline 157
expect(out[0].image_url).toBe('https://cdn.example.com/a.jpg');
tests/unit/search/language-filter.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
const en = (i: number): RawSearchResult => ({ url: `https://example.com/${i}`, - Network accessline 9
url: `https://example.com/${i}`, - Network accessline 13
}); const zh = (i: number): RawSearchResult => ({ url: `https://baidu.com/${i}`, - Network accessline 14
const zh = (i: number): RawSearchResult => ({ url: `https://baidu.com/${i}`, title: '人工智能教程', - Network accessline 15
url: `https://baidu.com/${i}`,
tests/unit/search/mojeek-probe-only.test.ts
tests/unit/search/multi-query.decompose.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/multi-query.test.ts
- Executable scriptline 1
Executable file - Network accessline 108
it('fans out all queries to all engines', async () => { const engine1 = makeMockEngine('engine1', [ { title: 'R1', url: 'https://a.com', snippet: 's1', relevance_score: 0.9, engine: 'engine1' }, - Network accessline 109
const engine1 = makeMockEngine('engine1', [ { title: 'R1', url: 'https://a.com', snippet: 's1', relevance_score: 0.9, engine: 'engine1' }, ]); - Network accessline 110
{ title: 'R1', url: 'https://a.com', snippet: 's1', relevance_score: 0.9, engine: 'engine1' }, - Network accessline 111
]); const engine2 = makeMockEngine('engine2', [ { title: 'R2', url: 'https://b.com', snippet: 's2', relevance_score: 0.8, engine: 'engine2' }, - Network accessline 112
const engine2 = makeMockEngine('engine2', [ { title: 'R2', url: 'https://b.com', snippet: 's2', relevance_score: 0.8, engine: 'engine2' }, ]); - Network accessline 113
{ title: 'R2', url: 'https://b.com', snippet: 's2', relevance_score: 0.8, engine: 'engine2' }, - Network accessline 130
it('collects errors from failing engines without crashing', async () => { const goodEngine = makeMockEngine('good', [ { title: 'OK', url: 'https://ok.com', snippet: 'ok', relevance_score: 0.9, engine: 'good' }, - Network accessline 131
const goodEngine = makeMockEngine('good', [ { title: 'OK', url: 'https://ok.com', snippet: 'ok', relevance_score: 0.9, engine: 'good' }, ]); - Network accessline 132
{ title: 'OK', url: 'https://ok.com', snippet: 'ok', relevance_score: 0.9, engine: 'good' }, - Network accessline 233
it('merges two ranked lists using RRF formula', () => { const list1 = makeRankedList([ { url: 'https://a.com', title: 'A' }, - Network accessline 234
const list1 = makeRankedList([ { url: 'https://a.com', title: 'A' }, { url: 'https://b.com', title: 'B' }, - Network accessline 235
{ url: 'https://a.com', title: 'A' }, - Network accessline 236
{ url: 'https://b.com', title: 'B' }, - Network accessline 237
{ url: 'https://c.com', title: 'C' }, - Network accessline 238
]); const list2 = makeRankedList([ { url: 'https://b.com', title: 'B' }, - Network accessline 239
const list2 = makeRankedList([ { url: 'https://b.com', title: 'B' }, { url: 'https://c.com', title: 'C' }, - Network accessline 240
{ url: 'https://b.com', title: 'B' }, - Network accessline 241
{ url: 'https://c.com', title: 'C' }, - Network accessline 242
{ url: 'https://d.com', title: 'D' }, - Network accessline 247
expect(merged[0].url).toBe('https://b.com'); - Network accessline 248
const urls = merged.map(r => r.url); expect(urls).toContain('https://a.com'); expect(urls).toContain('https://b.com'); - Network accessline 249
expect(urls).toContain('https://a.com'); - Network accessline 250
expect(urls).toContain('https://b.com'); - Network accessline 251
expect(urls).toContain('https://c.com'); - Network accessline 252
expect(urls).toContain('https://d.com'); - Network accessline 255
it('handles single ranked list (passthrough)', () => { const list = makeRankedList([ { url: 'https://a.com', title: 'A' }, - Network accessline 256
const list = makeRankedList([ { url: 'https://a.com', title: 'A' }, { url: 'https://b.com', title: 'B' }, - Network accessline 257
{ url: 'https://a.com', title: 'A' }, - Network accessline 258
{ url: 'https://b.com', title: 'B' }, - Network accessline 263
expect(merged).toHaveLength(2); expect(merged[0].url).toBe('https://a.com'); - Network accessline 264
expect(merged[0].url).toBe('https://a.com'); - Network accessline 265
expect(merged[1].url).toBe('https://b.com'); - Network accessline 276
it('assigns scores between 0 and 1', () => { const list1 = makeRankedList([ { url: 'https://a.com', title: 'A' }, - Network accessline 277
const list1 = makeRankedList([ { url: 'https://a.com', title: 'A' }, ]); - Network accessline 278
{ url: 'https://a.com', title: 'A' }, - Network accessline 279
]); const list2 = makeRankedList([ { url: 'https://a.com', title: 'A' }, - Network accessline 280
const list2 = makeRankedList([ { url: 'https://a.com', title: 'A' }, ]); - Network accessline 281
{ url: 'https://a.com', title: 'A' }, - Network accessline 292
it('item appearing in all lists scores higher than item in one list', () => { const list1 = makeRankedList([ { url: 'https://common.com', title: 'Common' }, - Network accessline 293
const list1 = makeRankedList([ { url: 'https://common.com', title: 'Common' }, { url: 'https://only1.com', title: 'Only1' }, - Network accessline 294
{ url: 'https://common.com', title: 'Common' }, - Network accessline 295
{ url: 'https://only1.com', title: 'Only1' }, - Network accessline 296
]); const list2 = makeRankedList([ { url: 'https://common.com', title: 'Common' }, - Network accessline 297
const list2 = makeRankedList([ { url: 'https://common.com', title: 'Common' }, { url: 'https://only2.com', title: 'Only2' }, - Network accessline 298
{ url: 'https://common.com', title: 'Common' }, - Network accessline 299
{ url: 'https://only2.com', title: 'Only2' }, - Network accessline 300
]); const list3 = makeRankedList([ { url: 'https://common.com', title: 'Common' }, - Network accessline 301
const list3 = makeRankedList([ { url: 'https://common.com', title: 'Common' }, { url: 'https://only3.com', title: 'Only3' }, - Network accessline 302
{ url: 'https://common.com', title: 'Common' }, - Network accessline 303
{ url: 'https://only3.com', title: 'Only3' }, - Network accessline 308
expect(merged[0].url).toBe('https://common.com'); - Network accessline 309
const commonScore = merged[0].relevance_score; const othersMax = Math.max( ...merged.filter(r => r.url !== 'https://common.com').map(r => r.relevance_score), - Network accessline 310
const othersMax = Math.max( ...merged.filter(r => r.url !== 'https://common.com').map(r => r.relevance_score), ); - Network accessline 311
...merged.filter(r => r.url !== 'https://common.com').map(r => r.relevance_score), - Network accessline 317
const list1: MergedSearchResult[] = [{ title: 'Best Title', url: 'https://a.com', - Network accessline 318
title: 'Best Title', url: 'https://a.com', snippet: 'Best snippet', - Network accessline 319
url: 'https://a.com', - Network accessline 324
const list2: MergedSearchResult[] = [{ title: 'Other Title', url: 'https://a.com', - Network accessline 325
title: 'Other Title', url: 'https://a.com', snippet: 'Other snippet', - Network accessline 326
url: 'https://a.com', - Network accessline 340
const list: MergedSearchResult[] = [{ title: 'Solo', url: 'https://solo.com', - Network accessline 341
title: 'Solo', url: 'https://solo.com', snippet: 'Solo result', - Network accessline 342
url: 'https://solo.com',
tests/unit/search/passage-spans.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/query-understanding.test.ts
- Executable scriptline 1
Executable file - Network accessline 158
it('emits query_understanding on SearchOutput', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 159
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 160
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 180
it('extracts proper-noun + acronym entities from a properly-cased query', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 181
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 182
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 199
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 200
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 218
it('rewrites is empty when caller is the rewriter', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), - Network accessline 219
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://example.com/a')]), ]; - Network accessline 220
makeEntry('bing', [makeResult('bing', 'https://example.com/a')]),
tests/unit/search/query.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/remote-rerank-provider.test.ts
- Executable scriptline 1
Executable file - Network accessline 8
]; const config = (over: Partial<Config> = {}) => ({ rerankApiBase: 'http://127.0.0.1:8082/v1///', - Network accessline 9
const config = (over: Partial<Config> = {}) => ({ rerankApiBase: 'http://127.0.0.1:8082/v1///', rerankApiKey: null, - Network accessline 10
rerankApiBase: 'http://127.0.0.1:8082/v1///', - Network accessline 30
expect(fetchMock).toHaveBeenCalledOnce(); const [url, options] = fetchMock.mock.calls[0]; expect(url).toBe('http://127.0.0.1:8082/v1/rerank'); - Network accessline 31
const [url, options] = fetchMock.mock.calls[0]; expect(url).toBe('http://127.0.0.1:8082/v1/rerank'); expect(options.method).toBe('POST'); - Network accessline 32
expect(url).toBe('http://127.0.0.1:8082/v1/rerank'); - Network accessline 45
const fetchMock = vi.fn().mockResolvedValue(reply([{ index: 1, relevance_score: 0.8 }])); vi.stubGlobal('fetch', fetchMock); expect(await new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 's - Network accessline 46
vi.stubGlobal('fetch', fetchMock); expect(await new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 'secret' })).rerank('q', candidates, 1)) .toEqual([{ id: 'second', score: 0.8 }]); - Network accessline 47
expect(await new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 'secret' })).rerank('q', candidates, 1)) - Network accessline 66
it('requires HTTPS for credentials off loopback while allowing keyless HTTP', () => { const remote = { rerankApiBase: 'http://192.168.1.20:8082/v1' }; - Network accessline 67
const remote = { rerankApiBase: 'http://192.168.1.20:8082/v1' }; - Network accessline 68
expect(() => new RemoteRerankProvider(config({ ...remote, rerankApiKey: 'secret' }))).toThrow('requires HTTPS'); expect(() => new RemoteRerankProvider(config(remote))).not.toThrow(); expect(() => new RemoteRerankProvider(config({ re - Network accessline 69
expect(() => new RemoteRerankProvider(config(remote))).not.toThrow(); expect(() => new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 'secret' }))).not.toThrow(); }); - Network accessline 70
expect(() => new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 'secret' }))).not.toThrow(); - Network accessline 73
it('allows credentials over plain HTTP to a loopback endpoint', () => { for (const base of ['http://127.0.0.1:8082/v1', 'http://localhost:8082/v1', 'http://[::1]:8082/v1']) { - Network accessline 74
for (const base of ['http://127.0.0.1:8082/v1', 'http://localhost:8082/v1', 'http://[::1]:8082/v1']) { - Network accessline 89
const cancel = vi.fn().mockResolvedValue(undefined); vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: false, status: 502, text, body: { cancel } })); const error = await new RemoteRerankProvider(config({ rerankApiBase: 'https: - Network accessline 90
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: false, status: 502, text, body: { cancel } })); const error = await new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 'secret' })).rerank(' - Network accessline 91
const error = await new RemoteRerankProvider(config({ rerankApiBase: 'https://rerank.example/v1', rerankApiKey: 'secret' })).rerank('q', candidates)
tests/unit/search/rerank-recency.test.ts
- Executable scriptline 1
Executable file - Network accessline 27
return { title, url: `https://${title.toLowerCase().replace(/\s+/g, '-')}.com`, - Network accessline 28
title, url: `https://${title.toLowerCase().replace(/\s+/g, '-')}.com`, snippet: `Snippet about ${title}`, - Network accessline 29
url: `https://${title.toLowerCase().replace(/\s+/g, '-')}.com`, - Network accessline 67
it('does NOT boost when published_date invalid', async () => { const r: MergedSearchResult = { title: 'Bad', url: 'https://bad.com', snippet: '', relevance_score: 0.5, - Network accessline 68
const r: MergedSearchResult = { title: 'Bad', url: 'https://bad.com', snippet: '', relevance_score: 0.5, engines: ['a'], published_date: 'not-a-date', - Network accessline 69
title: 'Bad', url: 'https://bad.com', snippet: '', relevance_score: 0.5,
tests/unit/search/rerank.test.ts
- Executable scriptline 1
Executable file - Network accessline 21
const makeResult = (title: string, score: number): MergedSearchResult => ({ title, url: `https://${title.toLowerCase().replace(/\s+/g, '-')}.com`, - Network accessline 22
title, url: `https://${title.toLowerCase().replace(/\s+/g, '-')}.com`, snippet: `Snippet about ${title}`, - Network accessline 23
url: `https://${title.toLowerCase().replace(/\s+/g, '-')}.com`, - Network accessline 95
const r: MergedSearchResult = { title: 'X', url: 'https://x.com', - Network accessline 96
title: 'X', url: 'https://x.com', snippet: 'snip', - Network accessline 97
url: 'https://x.com', - Network accessline 102
const out = await rerankResults('q', [r]); expect(out[0].engines).toEqual(['searxng']); expect(out[0].url).toBe('https://x.com'); - Network accessline 103
expect(out[0].engines).toEqual(['searxng']); expect(out[0].url).toBe('https://x.com'); expect(out[0].snippet).toBe('snip'); - Network accessline 104
expect(out[0].url).toBe('https://x.com'); - Network accessline 143
rerankMock.mockResolvedValue(scored([[2, 0.99], [0, 0.80], [1, 0.60]])); const results: MergedSearchResult[] = [ { title: 'Doc A', url: 'https://a.com', snippet: 's', relevance_score: 0.9, engines: ['t'] }, - Network accessline 144
const results: MergedSearchResult[] = [ { title: 'Doc A', url: 'https://a.com', snippet: 's', relevance_score: 0.9, engines: ['t'] }, { title: 'Doc B', url: 'https://b.com', snippet: 's', relevance_score: 0.7, engines: ['t'] }, - Network accessline 145
{ title: 'Doc A', url: 'https://a.com', snippet: 's', relevance_score: 0.9, engines: ['t'] }, - Network accessline 146
{ title: 'Doc B', url: 'https://b.com', snippet: 's', relevance_score: 0.7, engines: ['t'] }, - Network accessline 147
{ title: 'Doc C', url: 'https://c.com', snippet: 's', relevance_score: 0.5, engines: ['t'] },
tests/unit/search/reranker/consensus-boost.test.ts
- Executable scriptline 1
Executable file - Network accessline 9
describe('applyConsensusBoost', () => { it('returns input unchanged when all results have a single engine', () => { const out = applyConsensusBoost([mk('https://a.test', ['bing'])]); - Network accessline 10
it('returns input unchanged when all results have a single engine', () => { const out = applyConsensusBoost([mk('https://a.test', ['bing'])]); expect(out[0].relevance_score).toBeCloseTo(0.5); - Network accessline 11
const out = applyConsensusBoost([mk('https://a.test', ['bing'])]); - Network accessline 15
it('applies progressive boost as engine-count rises', () => { const out = applyConsensusBoost([ mk('https://one.test', ['bing']), - Network accessline 16
const out = applyConsensusBoost([ mk('https://one.test', ['bing']), mk('https://two.test', ['bing', 'ddg']), - Network accessline 17
mk('https://one.test', ['bing']), - Network accessline 18
mk('https://two.test', ['bing', 'ddg']), - Network accessline 19
mk('https://three.test', ['bing', 'ddg', 'wikipedia']), - Network accessline 20
mk('https://four.test', ['bing', 'ddg', 'wikipedia', 'searxng']), - Network accessline 28
it('caps boost at 4+ engines', () => { const four = applyConsensusBoost([mk('https://x.test', ['a', 'b', 'c', 'd'])]); - Network accessline 29
const four = applyConsensusBoost([mk('https://x.test', ['a', 'b', 'c', 'd'])]); - Network accessline 30
const five = applyConsensusBoost([mk('https://x.test', ['a', 'b', 'c', 'd', 'e'])]); - Network accessline 34
it('deduplicates engine names case-insensitively before counting', () => { const out = applyConsensusBoost([mk('https://x.test', ['Bing', 'bing', 'BING'])]); - Network accessline 35
const out = applyConsensusBoost([mk('https://x.test', ['Bing', 'bing', 'BING'])]); - Network accessline 39
it('clamps relevance_score at 1.0', () => { const out = applyConsensusBoost([mk('https://x.test', ['a', 'b', 'c', 'd'], 0.95)]); - Network accessline 40
const out = applyConsensusBoost([mk('https://x.test', ['a', 'b', 'c', 'd'], 0.95)]); - Network accessline 48
it('does not depend on query content — pure consensus signal', () => { const r = mk('https://x.test', ['a', 'b', 'c']); - Network accessline 49
const r = mk('https://x.test', ['a', 'b', 'c']);
tests/unit/search/reranker/recency.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/reranker/transformers-rerank-provider-errors.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/rrf.test.ts
- Executable scriptline 1
Executable file - Network accessline 15
it('scores a single list correctly with default k=60', () => { const list = new Map<string, number>([ ['https://a.com', 1], - Network accessline 16
const list = new Map<string, number>([ ['https://a.com', 1], ['https://b.com', 2], - Network accessline 17
['https://a.com', 1], - Network accessline 18
['https://b.com', 2], - Network accessline 19
['https://c.com', 3], - Network accessline 23
expect(result.get('https://a.com')).toBeCloseTo(1 / 61, 5); - Network accessline 24
expect(result.get('https://b.com')).toBeCloseTo(1 / 62, 5); - Network accessline 25
expect(result.get('https://c.com')).toBeCloseTo(1 / 63, 5); - Network accessline 28
it('fuses two lists by summing reciprocal ranks', () => { const list1 = new Map<string, number>([ ['https://a.com', 1], - Network accessline 29
const list1 = new Map<string, number>([ ['https://a.com', 1], ['https://b.com', 2], - Network accessline 30
['https://a.com', 1], - Network accessline 31
['https://b.com', 2], - Network accessline 32
]); const list2 = new Map<string, number>([ ['https://b.com', 1], - Network accessline 33
const list2 = new Map<string, number>([ ['https://b.com', 1], ['https://c.com', 2], - Network accessline 34
['https://b.com', 1], - Network accessline 35
['https://c.com', 2], - Network accessline 39
expect(result.get('https://a.com')).toBeCloseTo(1 / 61, 5); - Network accessline 40
expect(result.get('https://b.com')).toBeCloseTo(1 / 62 + 1 / 61, 5); - Network accessline 41
expect(result.get('https://c.com')).toBeCloseTo(1 / 62, 5); - Network accessline 44
it('items appearing in both lists score higher than single-list items', () => { const list1 = new Map<string, number>([ ['https://a.com', 1], - Network accessline 45
const list1 = new Map<string, number>([ ['https://a.com', 1], ['https://shared.com', 2], - Network accessline 46
['https://a.com', 1], - Network accessline 47
['https://shared.com', 2], - Network accessline 48
]); const list2 = new Map<string, number>([ ['https://shared.com', 1], - Network accessline 49
const list2 = new Map<string, number>([ ['https://shared.com', 1], ['https://b.com', 2], - Network accessline 50
['https://shared.com', 1], - Network accessline 51
['https://b.com', 2], - Network accessline 55
const sharedScore = result.get('https://shared.com')!; - Network accessline 56
const aScore = result.get('https://a.com')!; - Network accessline 57
const bScore = result.get('https://b.com')!; - Network accessline 63
it('respects custom k parameter', () => { const list = new Map<string, number>([ ['https://a.com', 1], - Network accessline 64
const list = new Map<string, number>([ ['https://a.com', 1], ]); - Network accessline 65
['https://a.com', 1], - Network accessline 66
]); const result = reciprocalRankFusion([list], 10); expect(result.get('https://a.com')).toBeCloseTo(1 / 11, 5); - Network accessline 67
const result = reciprocalRankFusion([list], 10); expect(result.get('https://a.com')).toBeCloseTo(1 / 11, 5); }); - Network accessline 68
expect(result.get('https://a.com')).toBeCloseTo(1 / 11, 5); - Network accessline 71
it('handles k=0 without division by zero (rank starts at 1)', () => { const list = new Map<string, number>([ ['https://a.com', 1], - Network accessline 72
const list = new Map<string, number>([ ['https://a.com', 1], ['https://b.com', 2], - Network accessline 73
['https://a.com', 1], - Network accessline 74
['https://b.com', 2], - Network accessline 75
]); const result = reciprocalRankFusion([list], 0); expect(result.get('https://a.com')).toBeCloseTo(1.0, 5); - Network accessline 76
const result = reciprocalRankFusion([list], 0); expect(result.get('https://a.com')).toBeCloseTo(1.0, 5); expect(result.get('https://b.com')).toBeCloseTo(0.5, 5); - Network accessline 77
expect(result.get('https://a.com')).toBeCloseTo(1.0, 5); - Network accessline 78
expect(result.get('https://b.com')).toBeCloseTo(0.5, 5); - Network accessline 81
it('fuses three lists correctly', () => { const list1 = new Map<string, number>([['https://x.com', 1]]); - Network accessline 82
const list1 = new Map<string, number>([['https://x.com', 1]]); - Network accessline 83
const list2 = new Map<string, number>([['https://x.com', 1]]); - Network accessline 84
const list3 = new Map<string, number>([['https://x.com', 1]]); - Network accessline 85
const result = reciprocalRankFusion([list1, list2, list3]); expect(result.get('https://x.com')).toBeCloseTo(3 / 61, 5); }); - Network accessline 86
expect(result.get('https://x.com')).toBeCloseTo(3 / 61, 5); - Network accessline 89
it('handles large rank values', () => { const list = new Map<string, number>([ ['https://a.com', 100], - Network accessline 90
const list = new Map<string, number>([ ['https://a.com', 100], ]); - Network accessline 91
['https://a.com', 100], - Network accessline 92
]); const result = reciprocalRankFusion([list]); expect(result.get('https://a.com')).toBeCloseTo(1 / 160, 5); - Network accessline 93
const result = reciprocalRankFusion([list]); expect(result.get('https://a.com')).toBeCloseTo(1 / 160, 5); }); - Network accessline 94
expect(result.get('https://a.com')).toBeCloseTo(1 / 160, 5); - Network accessline 97
it('preserves all unique URLs across all lists', () => { const list1 = new Map<string, number>([ ['https://a.com', 1], - Network accessline 98
const list1 = new Map<string, number>([ ['https://a.com', 1], ['https://b.com', 2], - Network accessline 99
['https://a.com', 1], - Network accessline 100
['https://b.com', 2], - Network accessline 101
]); const list2 = new Map<string, number>([ ['https://c.com', 1], - Network accessline 102
const list2 = new Map<string, number>([ ['https://c.com', 1], ['https://d.com', 2], - Network accessline 103
['https://c.com', 1], - Network accessline 104
['https://d.com', 2], - Network accessline 106
const result = reciprocalRankFusion([list1, list2]); expect(result.size).toBe(4); expect(result.has('https://a.com')).toBe(true); - Network accessline 107
expect(result.size).toBe(4); expect(result.has('https://a.com')).toBe(true); expect(result.has('https://b.com')).toBe(true); - Network accessline 108
expect(result.has('https://a.com')).toBe(true); - Network accessline 109
expect(result.has('https://b.com')).toBe(true); - Network accessline 110
expect(result.has('https://c.com')).toBe(true); - Network accessline 111
expect(result.has('https://d.com')).toBe(true); - Network accessline 114
it('returns sorted results via sortByScore helper', () => { const list1 = new Map<string, number>([ ['https://low.com', 5], - Network accessline 115
const list1 = new Map<string, number>([ ['https://low.com', 5], ['https://high.com', 1], - Network accessline 116
['https://low.com', 5], - Network accessline 117
['https://high.com', 1], - Network accessline 118
]); const list2 = new Map<string, number>([ ['https://high.com', 1], - Network accessline 119
const list2 = new Map<string, number>([ ['https://high.com', 1], ['https://mid.com', 2], - Network accessline 120
['https://high.com', 1], - Network accessline 121
['https://mid.com', 2], - Network accessline 125
const sorted = [...scores.entries()].sort((a, b) => b[1] - a[1]); expect(sorted[0][0]).toBe('https://high.com'); - Network accessline 126
expect(sorted[0][0]).toBe('https://high.com'); - Network accessline 129
it('handles duplicate URLs within the same list (last entry wins for rank)', () => { const list = new Map<string, number>([ ['https://a.com', 3], - Network accessline 130
const list = new Map<string, number>([ ['https://a.com', 3], ['https://a.com', 1], - Network accessline 131
['https://a.com', 3], - Network accessline 132
['https://a.com', 1], - Network accessline 133
]); const result = reciprocalRankFusion([list]); expect(result.get('https://a.com')).toBeCloseTo(1 / 61, 5); - Network accessline 134
const result = reciprocalRankFusion([list]); expect(result.get('https://a.com')).toBeCloseTo(1 / 61, 5); }); - Network accessline 135
expect(result.get('https://a.com')).toBeCloseTo(1 / 61, 5); - Network accessline 138
it('negative k values are handled without error', () => { const list = new Map<string, number>([ ['https://a.com', 1], - Network accessline 139
const list = new Map<string, number>([ ['https://a.com', 1], ]); - Network accessline 140
['https://a.com', 1], - Network accessline 141
]); const result = reciprocalRankFusion([list], -10); expect(result.has('https://a.com')).toBe(true); - Network accessline 142
const result = reciprocalRankFusion([list], -10); expect(result.has('https://a.com')).toBe(true); }); - Network accessline 143
expect(result.has('https://a.com')).toBe(true); - Network accessline 147
const lists: Map<string, number>[] = []; for (let i = 0; i < 10; i++) { lists.push(new Map([['https://popular.com', 1]])); - Network accessline 148
for (let i = 0; i < 10; i++) { lists.push(new Map([['https://popular.com', 1]])); } - Network accessline 149
lists.push(new Map([['https://popular.com', 1]])); - Network accessline 150
} const result = reciprocalRankFusion(lists); expect(result.get('https://popular.com')).toBeCloseTo(10 / 61, 5); - Network accessline 151
const result = reciprocalRankFusion(lists); expect(result.get('https://popular.com')).toBeCloseTo(10 / 61, 5); }); - Network accessline 152
expect(result.get('https://popular.com')).toBeCloseTo(10 / 61, 5); - Network accessline 155
it('sortByRRFScore produces descending order', () => { const list1 = new Map<string, number>([ ['https://z.com', 10], - Network accessline 156
const list1 = new Map<string, number>([ ['https://z.com', 10], ['https://a.com', 1], - Network accessline 157
['https://z.com', 10], - Network accessline 158
['https://a.com', 1], - Network accessline 159
]); const list2 = new Map<string, number>([ ['https://a.com', 1], - Network accessline 160
const list2 = new Map<string, number>([ ['https://a.com', 1], ['https://m.com', 3], - Network accessline 161
['https://a.com', 1], - Network accessline 162
['https://m.com', 3], - Network accessline 172
it('returns Map type that supports standard Map operations', () => { const list = new Map<string, number>([['https://a.com', 1]]); - Network accessline 173
const list = new Map<string, number>([['https://a.com', 1]]); - Network accessline 174
const result = reciprocalRankFusion([list]); expect(result).toBeInstanceOf(Map); expect(typeof result.get('https://a.com')).toBe('number'); - Network accessline 175
expect(result).toBeInstanceOf(Map); expect(typeof result.get('https://a.com')).toBe('number'); expect([...result.keys()]).toContain('https://a.com'); - Network accessline 176
expect(typeof result.get('https://a.com')).toBe('number'); - Network accessline 177
expect([...result.keys()]).toContain('https://a.com');
tests/unit/search/sampling.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/searxng-filtering.test.ts
- Executable scriptline 1
Executable file - Network accessline 43
const client = new SearxngClient('http://localhost:8888'); - Network accessline 55
const client = new SearxngClient('http://localhost:8888'); - Network accessline 67
const client = new SearxngClient('http://localhost:8888'); - Network accessline 81
const client = new SearxngClient('http://localhost:8888'); - Network accessline 94
const client = new SearxngClient('http://localhost:8888'); - Network accessline 107
const client = new SearxngClient('http://localhost:8888'); - Network accessline 119
const client = new SearxngClient('http://localhost:8888'); - Network accessline 134
const client = new SearxngClient('http://localhost:8888'); - Network accessline 152
const client = new SearxngClient('http://localhost:8888'); - Network accessline 168
const client = new SearxngClient('http://localhost:8888'); - Network accessline 184
const client = new SearxngClient('http://localhost:8888'); - Network accessline 196
const client = new SearxngClient('http://localhost:8888'); - Network accessline 208
const client = new SearxngClient('http://localhost:8888');
tests/unit/search/searxng-orchestrator-strip.test.ts
- Executable scriptline 1
Executable file - Network accessline 16
return { title: 'r', url: 'https://example.com/r', - Network accessline 17
title: 'r', url: 'https://example.com/r', snippet: 's', - Network accessline 18
url: 'https://example.com/r', - Network accessline 27
it("format='answer' + include_full_markdown unset → drops markdown_content, leaves citations + title intact", () => { const results: SearchResultItem[] = [ makeResult({ title: 'a', url: 'https://example.com/a' }), - Network accessline 28
const results: SearchResultItem[] = [ makeResult({ title: 'a', url: 'https://example.com/a' }), makeResult({ title: 'b', url: 'https://example.com/b' }), - Network accessline 29
makeResult({ title: 'a', url: 'https://example.com/a' }), - Network accessline 30
makeResult({ title: 'b', url: 'https://example.com/b' }), - Network accessline 39
expect(results[0].title).toBe('a'); expect(results[0].url).toBe('https://example.com/a'); - Network accessline 40
expect(results[0].url).toBe('https://example.com/a');
tests/unit/search/searxng.test.ts
- Executable scriptline 1
Executable file - Network accessline 16
beforeAll(async () => { server = createServer((req, res) => { const url = new URL(req.url!, `http://localhost`); - Network accessline 17
server = createServer((req, res) => { const url = new URL(req.url!, `http://localhost`); if (url.pathname === '/search' && url.searchParams.get('format') === 'json') { - Network accessline 18
const url = new URL(req.url!, `http://localhost`); - Network accessline 42
it('returns normalized results from SearXNG JSON API', async () => { const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 43
const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 51
it('assigns position-based scores when SearXNG score is null', async () => { const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 52
const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 58
it('respects maxResults option', async () => { const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 59
const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 64
it('throws on non-200 response', async () => { const client = new SearxngClient(`http://127.0.0.1:${port}/error`); - Network accessline 65
const client = new SearxngClient(`http://127.0.0.1:${port}/error`); - Network accessline 69
it('has name property set to searxng', () => { const client = new SearxngClient('http://localhost:8888'); - Network accessline 70
const client = new SearxngClient('http://localhost:8888'); - Network accessline 74
it('propagates publishedDate when SearXNG response includes it', async () => { const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 75
const client = new SearxngClient(`http://127.0.0.1:${port}`); - Network accessline 76
const results = await client.search('typescript tutorial'); const dated = results.find(r => r.url === 'https://www.learn-ts.org/'); expect(dated?.published_date).toBe('2026-04-01T00:00:00Z'); - Network accessline 77
const dated = results.find(r => r.url === 'https://www.learn-ts.org/');
tests/unit/search/time-range.test.ts
- Executable scriptline 1
Executable file - Network accessline 123
const engine = makeEntry( 'bing', [makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], - Network accessline 124
'bing', [makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], (opts) => { - Network accessline 125
[makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], - Network accessline 140
const engine = makeEntry( 'bing', [makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], - Network accessline 141
'bing', [makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], (opts) => { - Network accessline 142
[makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], - Network accessline 162
const engine = makeEntry('bing', [ makeResult('bing', 'https://example.com/fresh', 'Fresh', 'Snippet', dayAgo), - Network accessline 163
makeResult('bing', 'https://example.com/fresh', 'Fresh', 'Snippet', dayAgo), - Network accessline 164
makeResult('bing', 'https://example.com/stale', 'Stale', 'Snippet', old), - Network accessline 165
makeResult('bing', 'https://example.com/nodate', 'No Date', 'Snippet'), - Network accessline 169
const out = await runV1Search({ query: 'news', timeRange: 'week', maxResults: 10 }); const urls = out.results.map((r) => r.url); expect(urls).toContain('https://example.com/fresh'); - Network accessline 170
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://example.com/fresh'); expect(urls).not.toContain('https://example.com/stale'); - Network accessline 171
expect(urls).toContain('https://example.com/fresh'); - Network accessline 172
expect(urls).not.toContain('https://example.com/stale'); - Network accessline 174
expect(urls).toContain('https://example.com/nodate'); - Network accessline 179
const engine = makeEntry( 'bing', [makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], - Network accessline 180
'bing', [makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')], (opts) => { - Network accessline 181
[makeResult('bing', 'https://example.com/a', 'Title', 'Snippet')],
tests/unit/search/tokens.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/transformers-rerank-provider.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/truncate.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/url-unwrap.test.ts
- Executable scriptline 1
Executable file - Network accessline 5
it('unwraps duckduckgo redirect', () => { const wrapped = '//duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com%2Fpage&rut=abc'; expect(unwrapRedirect(wrapped)).toBe('https://example.com/page'); - Network accessline 6
const wrapped = '//duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com%2Fpage&rut=abc'; expect(unwrapRedirect(wrapped)).toBe('https://example.com/page'); }); - Network accessline 7
expect(unwrapRedirect(wrapped)).toBe('https://example.com/page'); - Network accessline 10
it('unwraps duckduckgo redirect with https prefix', () => { const wrapped = 'https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com%2Fpage'; - Network accessline 11
const wrapped = 'https://duckduckgo.com/l/?uddg=https%3A%2F%2Fexample.com%2Fpage'; - Network accessline 12
expect(unwrapRedirect(wrapped)).toBe('https://example.com/page'); - Network accessline 15
it('returns null when not a redirect', () => { expect(unwrapRedirect('https://example.com/page')).toBeNull(); - Network accessline 16
expect(unwrapRedirect('https://example.com/page')).toBeNull(); - Network accessline 27
it('handles google redirect /url?q=', () => { expect(unwrapRedirect('https://www.google.com/url?q=https%3A%2F%2Fexample.com%2F&sa=U')).toBe('https://example.com/'); - Network accessline 28
expect(unwrapRedirect('https://www.google.com/url?q=https%3A%2F%2Fexample.com%2F&sa=U')).toBe('https://example.com/');
tests/unit/search/v1/context-rank.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/v1/engine-base.test.ts
tests/unit/search/v1/intent-router.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/v1/orchestrator.test.ts
- Executable scriptline 1
Executable file - Network accessline 130
const { entry, spy } = makeEntry({ name: 'github-code', results: [makeResult('github-code', 'https://gh.test/x')], - Network accessline 131
name: 'github-code', results: [makeResult('github-code', 'https://gh.test/x')], }); - Network accessline 132
results: [makeResult('github-code', 'https://gh.test/x')], - Network accessline 142
const { entry } = makeEntry({ name: 'arxiv', results: [makeResult('arxiv', 'https://arxiv.org/abs/123')], - Network accessline 143
name: 'arxiv', results: [makeResult('arxiv', 'https://arxiv.org/abs/123')], }); - Network accessline 144
results: [makeResult('arxiv', 'https://arxiv.org/abs/123')], - Network accessline 153
const { entry } = makeEntry({ name: 'hn', results: [makeResult('hn', 'https://news.test/1')], - Network accessline 154
name: 'hn', results: [makeResult('hn', 'https://news.test/1')], }); - Network accessline 155
results: [makeResult('hn', 'https://news.test/1')], - Network accessline 164
const { entry } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/x')], - Network accessline 165
name: 'bing', results: [makeResult('bing', 'https://example.com/x')], }); - Network accessline 166
results: [makeResult('bing', 'https://example.com/x')], - Network accessline 175
const { entry } = makeEntry({ name: 'hn', results: [makeResult('hn', 'https://news.test/x')], - Network accessline 176
name: 'hn', results: [makeResult('hn', 'https://news.test/x')], }); - Network accessline 177
results: [makeResult('hn', 'https://news.test/x')], - Network accessline 192
name: 'hn', supportsDateFilter: true, results: [makeResult('hn', 'https://news.test/a')], - Network accessline 193
supportsDateFilter: true, results: [makeResult('hn', 'https://news.test/a')], }); - Network accessline 194
results: [makeResult('hn', 'https://news.test/a')], - Network accessline 213
name: 'hn-algolia', supportsDateFilter: true, results: [makeResult('hn-algolia', 'https://news.test/hn')], - Network accessline 214
supportsDateFilter: true, results: [makeResult('hn-algolia', 'https://news.test/hn')], }); - Network accessline 215
results: [makeResult('hn-algolia', 'https://news.test/hn')], - Network accessline 218
name: 'duckduckgo', supportsDateFilter: false, results: [makeResult('duckduckgo', 'https://news.test/ddg')], - Network accessline 219
supportsDateFilter: false, results: [makeResult('duckduckgo', 'https://news.test/ddg')], }); - Network accessline 220
results: [makeResult('duckduckgo', 'https://news.test/ddg')], - Network accessline 223
name: 'mojeek', supportsDateFilter: false, results: [makeResult('mojeek', 'https://news.test/mojeek')], - Network accessline 224
supportsDateFilter: false, results: [makeResult('mojeek', 'https://news.test/mojeek')], }); - Network accessline 225
results: [makeResult('mojeek', 'https://news.test/mojeek')], - Network accessline 244
name: 'mdn', supportsDateFilter: false, results: [makeResult('mdn', 'https://mdn.test/a')], - Network accessline 245
supportsDateFilter: false, results: [makeResult('mdn', 'https://mdn.test/a')], }); - Network accessline 246
results: [makeResult('mdn', 'https://mdn.test/a')], - Network accessline 249
name: 'devdocs', supportsDateFilter: false, results: [makeResult('devdocs', 'https://devdocs.test/a')], - Network accessline 250
supportsDateFilter: false, results: [makeResult('devdocs', 'https://devdocs.test/a')], }); - Network accessline 251
results: [makeResult('devdocs', 'https://devdocs.test/a')], - Network accessline 277
const fresh = makeResult('duckduckgo', 'https://news.test/fresh'); - Network accessline 278
fresh.published_date = inWindow; const stale = makeResult('duckduckgo', 'https://news.test/stale'); stale.published_date = older; - Network accessline 279
const stale = makeResult('duckduckgo', 'https://news.test/stale'); - Network accessline 281
const undated = makeResult('duckduckgo', 'https://news.test/undated'); - Network accessline 297
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://news.test/fresh'); - Network accessline 298
expect(urls).toContain('https://news.test/fresh'); - Network accessline 299
expect(urls).toContain('https://news.test/undated'); - Network accessline 300
expect(urls).not.toContain('https://news.test/stale'); - Network accessline 314
const fresh = makeResult('duckduckgo', 'https://news.test/fresh'); - Network accessline 315
fresh.published_date = dayAgo; const oldHuman = makeResult('duckduckgo', 'https://news.test/old-human'); oldHuman.published_date = 'Jan 15, 2026'; // ~5-6 months before "now" - Network accessline 316
const oldHuman = makeResult('duckduckgo', 'https://news.test/old-human'); - Network accessline 317
oldHuman.published_date = 'Jan 15, 2026'; // ~5-6 months before "now" const oldSlash = makeResult('duckduckgo', 'https://news.test/old-slash'); oldSlash.published_date = '2026/01/15'; - Network accessline 318
const oldSlash = makeResult('duckduckgo', 'https://news.test/old-slash'); - Network accessline 335
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://news.test/fresh'); - Network accessline 336
expect(urls).toContain('https://news.test/fresh'); - Network accessline 337
expect(urls).not.toContain('https://news.test/old-human'); - Network accessline 338
expect(urls).not.toContain('https://news.test/old-slash'); - Network accessline 344
it('never empties the set — keeps out-of-window dated results when nothing is in-window', async () => { const old1 = makeResult('duckduckgo', 'https://news.test/old-1'); - Network accessline 345
const old1 = makeResult('duckduckgo', 'https://news.test/old-1'); - Network accessline 346
old1.published_date = '2020-01-01T00:00:00.000Z'; const old2 = makeResult('duckduckgo', 'https://news.test/old-2'); old2.published_date = '2021-06-15T00:00:00.000Z'; - Network accessline 347
const old2 = makeResult('duckduckgo', 'https://news.test/old-2'); - Network accessline 369
it('does NOT window out old dated results when no time_range/from_date is set', async () => { const old = makeResult('duckduckgo', 'https://gen.test/old'); - Network accessline 370
const old = makeResult('duckduckgo', 'https://gen.test/old'); - Network accessline 371
old.published_date = '2020-01-01T00:00:00.000Z'; const oldHuman = makeResult('duckduckgo', 'https://gen.test/old-human'); oldHuman.published_date = 'Jan 15, 2020'; - Network accessline 372
const oldHuman = makeResult('duckduckgo', 'https://gen.test/old-human'); - Network accessline 385
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://gen.test/old'); - Network accessline 386
expect(urls).toContain('https://gen.test/old'); - Network accessline 387
expect(urls).toContain('https://gen.test/old-human'); - Network accessline 393
it('keeps a result with an unparseable published_date under an explicit window', async () => { const dayAgo = new Date(Date.now() - 2 * DAY).toISOString().slice(0, 10); const fresh = makeResult('duckduckgo', 'https://news.test/fresh - Network accessline 394
const dayAgo = new Date(Date.now() - 2 * DAY).toISOString().slice(0, 10); const fresh = makeResult('duckduckgo', 'https://news.test/fresh'); fresh.published_date = dayAgo; - Network accessline 395
const fresh = makeResult('duckduckgo', 'https://news.test/fresh'); - Network accessline 396
fresh.published_date = dayAgo; const bogus = makeResult('duckduckgo', 'https://news.test/bogus-date'); bogus.published_date = 'sometime last spring'; - Network accessline 397
const bogus = makeResult('duckduckgo', 'https://news.test/bogus-date'); - Network accessline 414
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://news.test/fresh'); - Network accessline 415
expect(urls).toContain('https://news.test/fresh'); - Network accessline 416
expect(urls).toContain('https://news.test/bogus-date'); - Network accessline 422
it('honours from_date/to_date boundaries on full-ISO timestamps', async () => { const onToDate = makeResult('duckduckgo', 'https://news.test/on-to-date'); - Network accessline 423
const onToDate = makeResult('duckduckgo', 'https://news.test/on-to-date'); - Network accessline 424
onToDate.published_date = '2026-07-01T15:44:13.000Z'; const afterWindow = makeResult('duckduckgo', 'https://news.test/after'); afterWindow.published_date = '2026-07-05T00:00:00.000Z'; - Network accessline 425
const afterWindow = makeResult('duckduckgo', 'https://news.test/after'); - Network accessline 426
afterWindow.published_date = '2026-07-05T00:00:00.000Z'; const beforeWindow = makeResult('duckduckgo', 'https://news.test/before'); beforeWindow.published_date = '2026-06-20T00:00:00.000Z'; - Network accessline 427
const beforeWindow = makeResult('duckduckgo', 'https://news.test/before'); - Network accessline 445
const urls = out.results.map((r) => r.url); expect(urls).toContain('https://news.test/on-to-date'); - Network accessline 446
expect(urls).toContain('https://news.test/on-to-date'); - Network accessline 447
expect(urls).not.toContain('https://news.test/after'); - Network accessline 448
expect(urls).not.toContain('https://news.test/before'); - Network accessline 452
describe('runV1Search — RRF fusion', () => { it('fuses overlapping URLs across two equal-weight engines', async () => { const sharedUrl = 'https://shared.test/1'; - Network accessline 453
it('fuses overlapping URLs across two equal-weight engines', async () => { const sharedUrl = 'https://shared.test/1'; const a = makeEntry({ - Network accessline 454
const sharedUrl = 'https://shared.test/1'; - Network accessline 458
results: [ makeResult('a', sharedUrl), makeResult('a', 'https://a.test/only'), - Network accessline 459
makeResult('a', sharedUrl), makeResult('a', 'https://a.test/only'), ], - Network accessline 460
makeResult('a', 'https://a.test/only'), - Network accessline 466
results: [ makeResult('b', sharedUrl), makeResult('b', 'https://b.test/only'), - Network accessline 467
makeResult('b', sharedUrl), makeResult('b', 'https://b.test/only'), ], - Network accessline 468
makeResult('b', 'https://b.test/only'), - Network accessline 476
const tail = out.results.slice(1).map((r) => r.url).sort(); expect(tail).toEqual(['https://a.test/only', 'https://b.test/only']); - Network accessline 477
expect(tail).toEqual(['https://a.test/only', 'https://b.test/only']); - Network accessline 486
name: 'a', weight: 1.0, results: [makeResult('a', 'https://a.test/top')], - Network accessline 487
weight: 1.0, results: [makeResult('a', 'https://a.test/top')], }); - Network accessline 488
results: [makeResult('a', 'https://a.test/top')], - Network accessline 491
name: 'b', weight: 2.0, results: [makeResult('b', 'https://b.test/top')], - Network accessline 492
weight: 2.0, results: [makeResult('b', 'https://b.test/top')], }); - Network accessline 493
results: [makeResult('b', 'https://b.test/top')], - Network accessline 499
expect(out.results[0].url).toBe('https://b.test/top'); - Network accessline 500
expect(out.results[1].url).toBe('https://a.test/top'); - Network accessline 503
it('weighted fusion: shared overlap with heavier engine outranks unique', async () => { const sharedUrl = 'https://overlap.test/x'; - Network accessline 504
const sharedUrl = 'https://overlap.test/x'; - Network accessline 507
weight: 2.0, results: [ makeResult('heavy', 'https://heavy.test/unique'), - Network accessline 508
results: [ makeResult('heavy', 'https://heavy.test/unique'), makeResult('heavy', sharedUrl), - Network accessline 509
makeResult('heavy', 'https://heavy.test/unique'), - Network accessline 515
weight: 1.0, results: [ makeResult('light', 'https://light.test/unique'), - Network accessline 516
results: [ makeResult('light', 'https://light.test/unique'), makeResult('light', sharedUrl), - Network accessline 517
makeResult('light', 'https://light.test/unique'), - Network accessline 527
expect(out.results.map((r) => r.url)).toEqual([ sharedUrl, 'https://heavy.test/unique', - Network accessline 528
sharedUrl, 'https://heavy.test/unique', 'https://light.test/unique', - Network accessline 529
'https://heavy.test/unique', - Network accessline 530
'https://light.test/unique', - Network accessline 541
name: 'bing', results: [ makeResult('bing', 'https://next.co.uk/fashion'), - Network accessline 542
results: [ makeResult('bing', 'https://next.co.uk/fashion'), makeResult('bing', 'https://example.dev/post-about-next'), - Network accessline 543
makeResult('bing', 'https://next.co.uk/fashion'), - Network accessline 544
makeResult('bing', 'https://example.dev/post-about-next'), - Network accessline 549
const out = await runV1Search({ query: 'next' }); expect(out.results[0].url).toBe('https://example.dev/post-about-next'); - Network accessline 550
expect(out.results[0].url).toBe('https://example.dev/post-about-next'); - Network accessline 551
expect(out.results[1].url).toBe('https://next.co.uk/fashion'); - Network accessline 558
name: 'bing', results: [ makeResult('bing', 'https://shop.example.shop/abc'), - Network accessline 559
results: [ makeResult('bing', 'https://shop.example.shop/abc'), makeResult('bing', 'https://other.example/page'), - Network accessline 560
makeResult('bing', 'https://shop.example.shop/abc'), - Network accessline 561
makeResult('bing', 'https://other.example/page'), - Network accessline 567
query: 'shop example abc detailed product listing review', }); expect(out.results[0].url).toBe('https://shop.example.shop/abc'); - Network accessline 568
}); expect(out.results[0].url).toBe('https://shop.example.shop/abc'); }); - Network accessline 569
expect(out.results[0].url).toBe('https://shop.example.shop/abc'); - Network accessline 576
name: 'bing', results: [ makeResult('bing', 'https://alpha.example/a'), - Network accessline 577
results: [ makeResult('bing', 'https://alpha.example/a'), makeResult('bing', 'https://beta.example/b'), - Network accessline 578
makeResult('bing', 'https://alpha.example/a'), - Network accessline 579
makeResult('bing', 'https://beta.example/b'), - Network accessline 584
const out = await runV1Search({ query: 'foo' }); expect(out.results.map((r) => r.url)).toEqual([ 'https://alpha.example/a', - Network accessline 585
expect(out.results.map((r) => r.url)).toEqual([ 'https://alpha.example/a', 'https://beta.example/b', - Network accessline 586
'https://alpha.example/a', - Network accessline 587
'https://beta.example/b', - Network accessline 600
name: 'bing', results: [ makeResult('bing', 'https://allowed.com/a'), - Network accessline 601
results: [ makeResult('bing', 'https://allowed.com/a'), makeResult('bing', 'https://denied.com/a'), - Network accessline 602
makeResult('bing', 'https://allowed.com/a'), - Network accessline 603
makeResult('bing', 'https://denied.com/a'), - Network accessline 604
makeResult('bing', 'https://sub.allowed.com/b'), - Network accessline 620
name: 'bing', results: [ makeResult('bing', 'https://allowed.com/a'), - Network accessline 621
results: [ makeResult('bing', 'https://allowed.com/a'), makeResult('bing', 'https://allowed.com/b'), - Network accessline 622
makeResult('bing', 'https://allowed.com/a'), - Network accessline 623
makeResult('bing', 'https://allowed.com/b'), - Network accessline 624
makeResult('bing', 'https://allowed.com/c'), - Network accessline 625
makeResult('bing', 'https://denied.com/a'), - Network accessline 643
name: 'bing', results: [ makeResult('bing', 'https://other.example/a'), - Network accessline 644
results: [ makeResult('bing', 'https://other.example/a'), makeResult('bing', 'https://elsewhere.example/b'), - Network accessline 645
makeResult('bing', 'https://other.example/a'), - Network accessline 646
makeResult('bing', 'https://elsewhere.example/b'), - Network accessline 660
name: 'bing', results: [ makeResult('bing', 'https://allowed.com/a'), - Network accessline 661
results: [ makeResult('bing', 'https://allowed.com/a'), makeResult('bing', 'https://block.com/a'), - Network accessline 662
makeResult('bing', 'https://allowed.com/a'), - Network accessline 663
makeResult('bing', 'https://block.com/a'), - Network accessline 680
name: 'bing', results: [ makeResult('bing', 'https://keep.com/a'), - Network accessline 681
results: [ makeResult('bing', 'https://keep.com/a'), makeResult('bing', 'https://block.com/a'), - Network accessline 682
makeResult('bing', 'https://keep.com/a'), - Network accessline 683
makeResult('bing', 'https://block.com/a'), - Network accessline 699
const { entry, spy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com')], - Network accessline 700
name: 'bing', results: [makeResult('bing', 'https://example.com')], }); - Network accessline 701
results: [makeResult('bing', 'https://example.com')], - Network accessline 727
const ok = makeEntry({ name: 'ok', results: [makeResult('ok', 'https://ok.test/a')], - Network accessline 728
name: 'ok', results: [makeResult('ok', 'https://ok.test/a')], }); - Network accessline 729
results: [makeResult('ok', 'https://ok.test/a')], - Network accessline 764
const ok = makeEntry({ name: 'ok', results: [makeResult('ok', 'https://ok.test/a')], - Network accessline 765
name: 'ok', results: [makeResult('ok', 'https://ok.test/a')], }); - Network accessline 766
results: [makeResult('ok', 'https://ok.test/a')], - Network accessline 782
it('caps results at maxResults', async () => { const results = Array.from({ length: 25 }, (_, i) => makeResult('big', `https://big.test/${i}`), - Network accessline 783
const results = Array.from({ length: 25 }, (_, i) => makeResult('big', `https://big.test/${i}`), ); - Network accessline 784
makeResult('big', `https://big.test/${i}`), - Network accessline 794
const { entry } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/a')], - Network accessline 795
name: 'bing', results: [makeResult('bing', 'https://example.com/a')], }); - Network accessline 796
results: [makeResult('bing', 'https://example.com/a')], - Network accessline 812
const { entry, spy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/a')], - Network accessline 813
name: 'bing', results: [makeResult('bing', 'https://example.com/a')], }); - Network accessline 814
results: [makeResult('bing', 'https://example.com/a')], - Network accessline 863
const a = makeEntry({ name: 'a', results: [makeResult('a', 'https://a.test/1')], - Network accessline 864
name: 'a', results: [makeResult('a', 'https://a.test/1')], }); - Network accessline 865
results: [makeResult('a', 'https://a.test/1')], - Network accessline 867
const b = makeEntry({ name: 'b', results: [makeResult('b', 'https://b.test/1')], - Network accessline 868
name: 'b', results: [makeResult('b', 'https://b.test/1')], }); - Network accessline 869
results: [makeResult('b', 'https://b.test/1')], - Network accessline 873
const out = await runV1Search({ query: 'q' }); expect(out.results.map((r) => r.url)).toEqual([ 'https://a.test/1', - Network accessline 874
expect(out.results.map((r) => r.url)).toEqual([ 'https://a.test/1', 'https://b.test/1', - Network accessline 875
'https://a.test/1', - Network accessline 876
'https://b.test/1', - Network accessline 882
name: 'dup', results: [ makeResult('dup', 'https://same.test/1', 'first'), - Network accessline 883
results: [ makeResult('dup', 'https://same.test/1', 'first'), makeResult('dup', 'https://same.test/1', 'second'), - Network accessline 884
makeResult('dup', 'https://same.test/1', 'first'), - Network accessline 885
makeResult('dup', 'https://same.test/1', 'second'), - Network accessline 886
makeResult('dup', 'https://other.test/2'), - Network accessline 891
const out = await runV1Search({ query: 'general query' }); const urls = out.results.map((r) => r.url); expect(urls).toEqual(['https://same.test/1', 'https://other.test/2']); - Network accessline 893
expect(urls).toEqual(['https://same.test/1', 'https://other.test/2']); - Network accessline 899
const { entry } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://blocked.test/a')], - Network accessline 900
name: 'bing', results: [makeResult('bing', 'https://blocked.test/a')], }); - Network accessline 901
results: [makeResult('bing', 'https://blocked.test/a')], - Network accessline 923
const generalOk = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/hnsw')], - Network accessline 924
name: 'bing', results: [makeResult('bing', 'https://example.com/hnsw')], }); - Network accessline 925
results: [makeResult('bing', 'https://example.com/hnsw')], - Network accessline 930
expect(out.degraded).toBe(false); expect(out.vertical).toBe('general'); expect(out.results.map((r) => r.url)).toEqual(['https://example.com/hnsw']); - Network accessline 931
expect(out.vertical).toBe('general'); expect(out.results.map((r) => r.url)).toEqual(['https://example.com/hnsw']); }); - Network accessline 932
expect(out.results.map((r) => r.url)).toEqual(['https://example.com/hnsw']); - Network accessline 940
name: 'github-code', results: [ makeResult('github-code', 'https://gh.test/code1'), - Network accessline 941
results: [ makeResult('github-code', 'https://gh.test/code1'), makeResult('github-code', 'https://gh.test/code2'), - Network accessline 942
makeResult('github-code', 'https://gh.test/code1'), - Network accessline 943
makeResult('github-code', 'https://gh.test/code2'), - Network accessline 944
makeResult('github-code', 'https://gh.test/code3'), - Network accessline 945
makeResult('github-code', 'https://gh.test/code4'), - Network accessline 970
const generalOk = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/hit')], - Network accessline 971
name: 'bing', results: [makeResult('bing', 'https://example.com/hit')], }); - Network accessline 972
results: [makeResult('bing', 'https://example.com/hit')], - Network accessline 988
const { entry: bingEntry, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 989
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 990
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1011
const { entry: bingEntry, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/y')], - Network accessline 1012
name: 'bing', results: [makeResult('bing', 'https://bing.test/y')], }); - Network accessline 1013
results: [makeResult('bing', 'https://bing.test/y')], - Network accessline 1035
const { entry: bingEntry, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1036
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1037
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1063
const papersThin = makeEntry({ name: 'arxiv', results: [makeResult('arxiv', 'https://arxiv.org/abs/only')], - Network accessline 1064
name: 'arxiv', results: [makeResult('arxiv', 'https://arxiv.org/abs/only')], }); - Network accessline 1065
results: [makeResult('arxiv', 'https://arxiv.org/abs/only')], - Network accessline 1070
name: 'bing', results: [ makeResult('bing', 'https://example.com/g1'), - Network accessline 1071
results: [ makeResult('bing', 'https://example.com/g1'), makeResult('bing', 'https://example.com/g2'), - Network accessline 1072
makeResult('bing', 'https://example.com/g1'), - Network accessline 1073
makeResult('bing', 'https://example.com/g2'), - Network accessline 1074
makeResult('bing', 'https://example.com/g3'), - Network accessline 1075
makeResult('bing', 'https://example.com/g4'), - Network accessline 1087
expect(generalRich.spy).toHaveBeenCalled(); const urls = out.results.map((r) => r.url); expect(urls).toContain('https://arxiv.org/abs/only'); - Network accessline 1089
expect(urls).toContain('https://arxiv.org/abs/only'); - Network accessline 1091
expect(urls.some((u) => u.startsWith('https://example.com/g'))).toBe(true); - Network accessline 1098
name: 'github-code', results: Array.from({ length: 12 }, (_, i) => makeResult('github-code', `https://gh.test/${i}`), - Network accessline 1099
results: Array.from({ length: 12 }, (_, i) => makeResult('github-code', `https://gh.test/${i}`), ), - Network accessline 1100
makeResult('github-code', `https://gh.test/${i}`), - Network accessline 1105
const generalSpy = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/g')] }); - Network accessline 1115
const thin = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://example.com/one')], - Network accessline 1116
name: 'bing', results: [makeResult('bing', 'https://example.com/one')], }); - Network accessline 1117
results: [makeResult('bing', 'https://example.com/one')], - Network accessline 1135
const sharedUrl = 'https://shared.test/doc'; - Network accessline 1144
results: [ makeResult('duckduckgo', sharedUrl), makeResult('duckduckgo', 'https://general.test/other'), - Network accessline 1145
makeResult('duckduckgo', sharedUrl), makeResult('duckduckgo', 'https://general.test/other'), ], - Network accessline 1146
makeResult('duckduckgo', 'https://general.test/other'), - Network accessline 1187
const undated = makeResult('undated-eng', 'https://example.com/undated-home', 'Kernel release notes'); - Network accessline 1188
const dated = makeResult('dated-eng', 'https://example.org/dated-release', 'Kernel release notes'); - Network accessline 1212
expect(byUrl.has('https://example.org/dated-release')).toBe(true); - Network accessline 1213
expect(byUrl.has('https://example.com/undated-home')).toBe(true); - Network accessline 1214
const urls = out.results.map((r) => r.url); const datedIdx = urls.indexOf('https://example.org/dated-release'); const undatedIdx = urls.indexOf('https://example.com/undated-home'); - Network accessline 1215
const datedIdx = urls.indexOf('https://example.org/dated-release'); - Network accessline 1216
const undatedIdx = urls.indexOf('https://example.com/undated-home'); - Network accessline 1223
const ratio = byUrl.get('https://example.com/undated-home')!.relevance_score / - Network accessline 1224
byUrl.get('https://example.com/undated-home')!.relevance_score / - Network accessline 1225
byUrl.get('https://example.org/dated-release')!.relevance_score; - Network accessline 1236
name: 'bing', results: [ makeResult('bing', 'https://random-retailer.com/redis-tshirt'), - Network accessline 1237
results: [ makeResult('bing', 'https://random-retailer.com/redis-tshirt'), makeResult('bing', 'https://redis.io/docs/cache'), - Network accessline 1238
makeResult('bing', 'https://random-retailer.com/redis-tshirt'), - Network accessline 1239
makeResult('bing', 'https://redis.io/docs/cache'), - Network accessline 1244
const out = await runV1Search({ query: 'redis cache' }); expect(out.results[0].url).toBe('https://redis.io/docs/cache'); - Network accessline 1245
expect(out.results[0].url).toBe('https://redis.io/docs/cache'); - Network accessline 1246
expect(out.results[1].url).toBe('https://random-retailer.com/redis-tshirt'); - Network accessline 1251
name: 'bing', results: [ makeResult('bing', 'https://blog.unrelated.example/k8s-rant'), - Network accessline 1252
results: [ makeResult('bing', 'https://blog.unrelated.example/k8s-rant'), makeResult('bing', 'https://kubernetes.io/docs/concepts/'), - Network accessline 1253
makeResult('bing', 'https://blog.unrelated.example/k8s-rant'), - Network accessline 1254
makeResult('bing', 'https://kubernetes.io/docs/concepts/'), - Network accessline 1259
const out = await runV1Search({ query: 'kubernetes pod lifecycle' }); expect(out.results[0].url).toBe('https://kubernetes.io/docs/concepts/'); - Network accessline 1260
expect(out.results[0].url).toBe('https://kubernetes.io/docs/concepts/'); - Network accessline 1266
name: 'bing', results: [ makeResult('bing', 'https://example-a.example/post'), - Network accessline 1267
results: [ makeResult('bing', 'https://example-a.example/post'), makeResult('bing', 'https://example-b.example/post'), - Network accessline 1268
makeResult('bing', 'https://example-a.example/post'), - Network accessline 1269
makeResult('bing', 'https://example-b.example/post'), - Network accessline 1274
const out = await runV1Search({ query: 'blue elephant garden party' }); expect(out.results.map((r) => r.url)).toEqual([ 'https://example-a.example/post', - Network accessline 1275
expect(out.results.map((r) => r.url)).toEqual([ 'https://example-a.example/post', 'https://example-b.example/post', - Network accessline 1276
'https://example-a.example/post', - Network accessline 1277
'https://example-b.example/post', - Network accessline 1283
name: 'bing', results: [ makeResult('bing', 'https://redis.io/docs/cache'), - Network accessline 1284
results: [ makeResult('bing', 'https://redis.io/docs/cache'), makeResult('bing', 'https://otherdomain.example/redis'), - Network accessline 1285
makeResult('bing', 'https://redis.io/docs/cache'), - Network accessline 1286
makeResult('bing', 'https://otherdomain.example/redis'), - Network accessline 1294
}); const urls = out.results.map((r) => r.url); expect(urls).not.toContain('https://redis.io/docs/cache'); - Network accessline 1295
const urls = out.results.map((r) => r.url); expect(urls).not.toContain('https://redis.io/docs/cache'); expect(urls).toContain('https://otherdomain.example/redis'); - Network accessline 1296
expect(urls).not.toContain('https://redis.io/docs/cache'); - Network accessline 1297
expect(urls).toContain('https://otherdomain.example/redis'); - Network accessline 1327
name: 'hn', results: [ withDate('hn', 'https://old.test/a', twoYearsAgo), - Network accessline 1328
results: [ withDate('hn', 'https://old.test/a', twoYearsAgo), withDate('hn', 'https://new.test/b', today), - Network accessline 1329
withDate('hn', 'https://old.test/a', twoYearsAgo), - Network accessline 1330
withDate('hn', 'https://new.test/b', today), - Network accessline 1338
expect(out.results[0].url).toBe('https://new.test/b'); - Network accessline 1339
expect(out.results[1].url).toBe('https://old.test/a'); - Network accessline 1348
name: 'bing', results: [ withDate('bing', 'https://example.com/old-page', twoYearsAgo), - Network accessline 1349
results: [ withDate('bing', 'https://example.com/old-page', twoYearsAgo), withDate('bing', 'https://example.com/recent-page', today), - Network accessline 1350
withDate('bing', 'https://example.com/old-page', twoYearsAgo), - Network accessline 1351
withDate('bing', 'https://example.com/recent-page', today), - Network accessline 1356
const out = await runV1Search({ query: 'best pizza in new york' }); expect(out.vertical).toBe('general'); expect(out.results[0].url).toBe('https://example.com/old-page'); - Network accessline 1357
expect(out.vertical).toBe('general'); expect(out.results[0].url).toBe('https://example.com/old-page'); expect(out.results[1].url).toBe('https://example.com/recent-page'); - Network accessline 1358
expect(out.results[0].url).toBe('https://example.com/old-page'); - Network accessline 1359
expect(out.results[1].url).toBe('https://example.com/recent-page'); - Network accessline 1365
name: 'hn', results: [ withDate('hn', 'https://old.test/a', twoYearsAgo), - Network accessline 1366
results: [ withDate('hn', 'https://old.test/a', twoYearsAgo), withDate('hn', 'https://new.test/b', today), - Network accessline 1367
withDate('hn', 'https://old.test/a', twoYearsAgo), - Network accessline 1368
withDate('hn', 'https://new.test/b', today), - Network accessline 1375
category: 'news', }); expect(out.results[0].url).toBe('https://new.test/b'); - Network accessline 1376
}); expect(out.results[0].url).toBe('https://new.test/b'); }); - Network accessline 1377
expect(out.results[0].url).toBe('https://new.test/b'); - Network accessline 1382
name: 'hn', supportsDateFilter: true, results: [makeResult('hn', 'https://news.test/a')], - Network accessline 1383
supportsDateFilter: true, results: [makeResult('hn', 'https://news.test/a')], }); - Network accessline 1384
results: [makeResult('hn', 'https://news.test/a')], - Network accessline 1396
name: 'hn', supportsDateFilter: true, results: [makeResult('hn', 'https://news.test/a')], - Network accessline 1397
supportsDateFilter: true, results: [makeResult('hn', 'https://news.test/a')], }); - Network accessline 1398
results: [makeResult('hn', 'https://news.test/a')], - Network accessline 1415
name: 'hn', results: [ withDate('hn', 'https://a.test/1', undefined), - Network accessline 1416
results: [ withDate('hn', 'https://a.test/1', undefined), withDate('hn', 'https://b.test/2', undefined), - Network accessline 1417
withDate('hn', 'https://a.test/1', undefined), - Network accessline 1418
withDate('hn', 'https://b.test/2', undefined), - Network accessline 1423
const out = await runV1Search({ query: 'latest news AI' }); expect(out.results.map((r) => r.url)).toEqual([ 'https://a.test/1', - Network accessline 1424
expect(out.results.map((r) => r.url)).toEqual([ 'https://a.test/1', 'https://b.test/2', - Network accessline 1425
'https://a.test/1', - Network accessline 1426
'https://b.test/2', - Network accessline 1433
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1434
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1435
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1437
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1438
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1439
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1453
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1454
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1455
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1457
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1458
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1459
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1473
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1474
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1475
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1477
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1478
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1479
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1493
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1494
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1495
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1497
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1498
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1499
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1512
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1513
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1514
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1516
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1517
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1518
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1528
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1529
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1530
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1532
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1533
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1534
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1540
name: 'mojeek', probeOnly: true, results: [makeResult('mojeek', 'https://mojeek.test/z')], - Network accessline 1541
probeOnly: true, results: [makeResult('mojeek', 'https://mojeek.test/z')], }); - Network accessline 1542
results: [makeResult('mojeek', 'https://mojeek.test/z')], - Network accessline 1557
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1558
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1559
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1562
name: 'mojeek', probeOnly: true, results: [makeResult('mojeek', 'https://mojeek.test/z')], - Network accessline 1563
probeOnly: true, results: [makeResult('mojeek', 'https://mojeek.test/z')], }); - Network accessline 1564
results: [makeResult('mojeek', 'https://mojeek.test/z')], - Network accessline 1578
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1579
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1580
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1582
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1583
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1584
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1587
name: 'mojeek', probeOnly: true, results: [makeResult('mojeek', 'https://mojeek.test/z')], - Network accessline 1588
probeOnly: true, results: [makeResult('mojeek', 'https://mojeek.test/z')], }); - Network accessline 1589
results: [makeResult('mojeek', 'https://mojeek.test/z')], - Network accessline 1609
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1610
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1611
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1613
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1614
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1615
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1629
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1630
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1631
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1633
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1634
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1635
results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1653
const { entry: bing, spy: bingSpy } = makeEntry({ name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1654
name: 'bing', results: [makeResult('bing', 'https://bing.test/x')], }); - Network accessline 1655
results: [makeResult('bing', 'https://bing.test/x')], - Network accessline 1657
const { entry: ddg, spy: ddgSpy } = makeEntry({ name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], - Network accessline 1658
name: 'duckduckgo', results: [makeResult('duckduckgo', 'https://ddg.test/y')], }); - Network accessline 1659
results: [makeResult('duckduckgo', 'https://ddg.test/y')],
tests/unit/search/v1/recency-boost.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/v1/recent-cache-dedup.test.ts
- Executable scriptline 1
Executable file - Network accessline 19
describe('normalizeUrlForDedup', () => { it('lowercases the host', () => { expect(normalizeUrlForDedup('https://EXAMPLE.com/foo')).toBe( - Network accessline 20
it('lowercases the host', () => { expect(normalizeUrlForDedup('https://EXAMPLE.com/foo')).toBe( 'https://example.com/foo', - Network accessline 21
expect(normalizeUrlForDedup('https://EXAMPLE.com/foo')).toBe( - Network accessline 22
'https://example.com/foo', - Network accessline 26
it('strips trailing slash on path', () => { expect(normalizeUrlForDedup('https://example.com/foo/')).toBe( - Network accessline 27
expect(normalizeUrlForDedup('https://example.com/foo/')).toBe( - Network accessline 28
'https://example.com/foo', - Network accessline 32
it('normalizes root path', () => { expect(normalizeUrlForDedup('https://example.com/')).toBe( - Network accessline 33
expect(normalizeUrlForDedup('https://example.com/')).toBe( - Network accessline 34
'https://example.com', - Network accessline 38
it('drops the fragment', () => { expect(normalizeUrlForDedup('https://example.com/p#section')).toBe( - Network accessline 39
expect(normalizeUrlForDedup('https://example.com/p#section')).toBe( - Network accessline 40
'https://example.com/p', - Network accessline 45
expect( normalizeUrlForDedup( 'https://example.com/p?utm_source=x&gclid=y&fbclid=z&keep=1', - Network accessline 46
normalizeUrlForDedup( 'https://example.com/p?utm_source=x&gclid=y&fbclid=z&keep=1', ), - Network accessline 47
'https://example.com/p?utm_source=x&gclid=y&fbclid=z&keep=1', - Network accessline 48
), ).toBe('https://example.com/p?keep=1'); }); - Network accessline 49
).toBe('https://example.com/p?keep=1'); - Network accessline 53
expect( normalizeUrlForDedup( 'https://example.com/p?UTM_Source=x&Utm_Medium=m&GCLID=y&FbClid=z&Keep=1', - Network accessline 54
normalizeUrlForDedup( 'https://example.com/p?UTM_Source=x&Utm_Medium=m&GCLID=y&FbClid=z&Keep=1', ), - Network accessline 55
'https://example.com/p?UTM_Source=x&Utm_Medium=m&GCLID=y&FbClid=z&Keep=1', - Network accessline 56
), ).toBe('https://example.com/p?Keep=1'); }); - Network accessline 57
).toBe('https://example.com/p?Keep=1'); - Network accessline 60
it('sorts remaining params alphabetically', () => { expect(normalizeUrlForDedup('https://example.com/p?b=2&a=1')).toBe( - Network accessline 61
expect(normalizeUrlForDedup('https://example.com/p?b=2&a=1')).toBe( - Network accessline 62
'https://example.com/p?a=1&b=2', - Network accessline 66
it('strips default port 443 for https', () => { expect(normalizeUrlForDedup('https://example.com:443/p')).toBe( - Network accessline 67
expect(normalizeUrlForDedup('https://example.com:443/p')).toBe( - Network accessline 68
'https://example.com/p', - Network accessline 72
it('strips default port 80 for http', () => { expect(normalizeUrlForDedup('http://example.com:80/p')).toBe( - Network accessline 73
expect(normalizeUrlForDedup('http://example.com:80/p')).toBe( - Network accessline 74
'http://example.com/p', - Network accessline 83
describe('dedupAgainstRecentUrls', () => { it('returns input unchanged when recent_urls is undefined', () => { const results = [makeResult('https://example.com/a')]; - Network accessline 84
it('returns input unchanged when recent_urls is undefined', () => { const results = [makeResult('https://example.com/a')]; expect(dedupAgainstRecentUrls(results, undefined)).toBe(results); - Network accessline 85
const results = [makeResult('https://example.com/a')]; - Network accessline 89
it('returns input unchanged when recent_urls is empty', () => { const results = [makeResult('https://example.com/a')]; - Network accessline 90
const results = [makeResult('https://example.com/a')]; - Network accessline 94
it('drops an exact URL match', () => { const results = [ makeResult('https://example.com/a'), - Network accessline 95
const results = [ makeResult('https://example.com/a'), makeResult('https://example.com/b'), - Network accessline 96
makeResult('https://example.com/a'), - Network accessline 97
makeResult('https://example.com/b'), - Network accessline 98
]; const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); expect(out.map((r) => r.url)).toEqual(['https://example.com/b']); - Network accessline 99
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 100
expect(out.map((r) => r.url)).toEqual(['https://example.com/b']); - Network accessline 103
it('drops a result whose URL only differs by trailing slash', () => { const results = [makeResult('https://example.com/a/')]; - Network accessline 104
const results = [makeResult('https://example.com/a/')]; - Network accessline 105
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 109
it('drops a result whose URL only differs by fragment', () => { const results = [makeResult('https://example.com/a#section')]; - Network accessline 110
const results = [makeResult('https://example.com/a#section')]; - Network accessline 111
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 115
it('drops a result whose URL only differs by utm params', () => { const results = [ makeResult('https://example.com/a?utm_source=newsletter'), - Network accessline 116
const results = [ makeResult('https://example.com/a?utm_source=newsletter'), ]; - Network accessline 117
makeResult('https://example.com/a?utm_source=newsletter'), - Network accessline 118
]; const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); expect(out).toHaveLength(0); - Network accessline 119
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 123
it('keeps a result on a different domain', () => { const results = [makeResult('https://other.com/a')]; - Network accessline 124
const results = [makeResult('https://other.com/a')]; - Network accessline 125
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 129
it('keeps a result with a different path', () => { const results = [makeResult('https://example.com/b')]; - Network accessline 130
const results = [makeResult('https://example.com/b')]; - Network accessline 131
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 135
it('ignores malformed URLs in recent_urls gracefully', () => { const results = [makeResult('https://example.com/a')]; - Network accessline 136
const results = [makeResult('https://example.com/a')]; - Network accessline 137
const out = dedupAgainstRecentUrls(results, [ 'not a url', 'https://example.com/a', - Network accessline 138
'not a url', 'https://example.com/a', ]); - Network accessline 139
'https://example.com/a', - Network accessline 144
it('keeps a result with a malformed URL even when dedup list is present', () => { const results = [makeResult('::::not-a-url::::')]; const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 145
const results = [makeResult('::::not-a-url::::')]; const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); expect(out).toHaveLength(1); - Network accessline 146
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 150
it('drops only the matching subset when multiple recent URLs partially overlap', () => { const results = [ makeResult('https://example.com/a'), - Network accessline 151
const results = [ makeResult('https://example.com/a'), makeResult('https://example.com/b'), - Network accessline 152
makeResult('https://example.com/a'), - Network accessline 153
makeResult('https://example.com/b'), - Network accessline 154
makeResult('https://example.com/c'), - Network accessline 155
]; const out = dedupAgainstRecentUrls(results, [ 'https://example.com/a', - Network accessline 156
const out = dedupAgainstRecentUrls(results, [ 'https://example.com/a', 'https://example.com/c', - Network accessline 157
'https://example.com/a', - Network accessline 158
'https://example.com/c', - Network accessline 159
]); expect(out.map((r) => r.url)).toEqual(['https://example.com/b']); }); - Network accessline 160
expect(out.map((r) => r.url)).toEqual(['https://example.com/b']); - Network accessline 163
it('handles host case-fold between result and recent URL', () => { const results = [makeResult('https://Example.COM/a')]; - Network accessline 164
const results = [makeResult('https://Example.COM/a')]; - Network accessline 165
const out = dedupAgainstRecentUrls(results, ['https://example.com/a']); - Network accessline 169
it('returns input unchanged when recent_urls contains only malformed entries', () => { const results = [makeResult('https://example.com/a')]; - Network accessline 170
const results = [makeResult('https://example.com/a')]; - Network accessline 191
it('lowercases paths on the default microsoft.com allowlist', () => { expect( normalizeUrlForDedup('https://learn.microsoft.com/en-us/Azure/Topic'), - Network accessline 192
expect( normalizeUrlForDedup('https://learn.microsoft.com/en-us/Azure/Topic'), ).toBe('https://learn.microsoft.com/en-us/azure/topic'); - Network accessline 193
normalizeUrlForDedup('https://learn.microsoft.com/en-us/Azure/Topic'), - Network accessline 194
).toBe('https://learn.microsoft.com/en-us/azure/topic'); - Network accessline 197
it('lowercases paths on archive.org', () => { expect(normalizeUrlForDedup('https://web.archive.org/Web/2024/X')).toBe( - Network accessline 198
expect(normalizeUrlForDedup('https://web.archive.org/Web/2024/X')).toBe( - Network accessline 199
'https://web.archive.org/web/2024/x', - Network accessline 203
it('matches parent-domain suffixes (any.subdomain.microsoft.com)', () => { expect( normalizeUrlForDedup('https://Tech.MICROSOFT.com/Docs/Foo'), - Network accessline 204
expect( normalizeUrlForDedup('https://Tech.MICROSOFT.com/Docs/Foo'), ).toBe('https://tech.microsoft.com/docs/foo'); - Network accessline 205
normalizeUrlForDedup('https://Tech.MICROSOFT.com/Docs/Foo'), - Network accessline 206
).toBe('https://tech.microsoft.com/docs/foo'); - Network accessline 209
it('preserves case on case-sensitive hosts like github.com', () => { expect(normalizeUrlForDedup('https://github.com/KnockOutEZ/Repo')).toBe( - Network accessline 210
expect(normalizeUrlForDedup('https://github.com/KnockOutEZ/Repo')).toBe( - Network accessline 211
'https://github.com/KnockOutEZ/Repo', - Network accessline 215
it('honors WIGOLO_DEDUP_CASE_INSENSITIVE_HOSTS env extension', () => { process.env.WIGOLO_DEDUP_CASE_INSENSITIVE_HOSTS = 'mysite.example'; expect(normalizeUrlForDedup('https://mysite.example/A/B')).toBe( - Network accessline 216
process.env.WIGOLO_DEDUP_CASE_INSENSITIVE_HOSTS = 'mysite.example'; expect(normalizeUrlForDedup('https://mysite.example/A/B')).toBe( 'https://mysite.example/a/b', - Network accessline 217
expect(normalizeUrlForDedup('https://mysite.example/A/B')).toBe( - Network accessline 218
'https://mysite.example/a/b', - Network accessline 228
it('dedups case-different paths on case-insensitive hosts', () => { const results = [makeResult('https://learn.microsoft.com/EN-US/Azure')]; - Network accessline 229
const results = [makeResult('https://learn.microsoft.com/EN-US/Azure')]; - Network accessline 230
const out = dedupAgainstRecentUrls(results, [ 'https://learn.microsoft.com/en-us/azure', ]); - Network accessline 231
'https://learn.microsoft.com/en-us/azure', - Network accessline 236
it('does NOT dedup case-different paths on github.com', () => { const results = [makeResult('https://github.com/Anthropic/sdk')]; - Network accessline 237
const results = [makeResult('https://github.com/Anthropic/sdk')]; - Network accessline 238
const out = dedupAgainstRecentUrls(results, [ 'https://github.com/anthropic/sdk', ]); - Network accessline 239
'https://github.com/anthropic/sdk',
tests/unit/search/v1/rss/feed-config.test.ts
- Executable scriptline 1
Executable file - Network accessline 36
it('loads env feeds (2 urls, comma separated)', () => { process.env.WIGOLO_RSS_FEEDS = 'https://example.com/a.xml,https://example.com/b.xml'; - Network accessline 37
process.env.WIGOLO_RSS_FEEDS = 'https://example.com/a.xml,https://example.com/b.xml'; - Network accessline 38
const r = loadFeedConfig({ dataDir: dir }); expect(r.feeds.map((f) => f.url)).toEqual([ 'https://example.com/a.xml', - Network accessline 39
expect(r.feeds.map((f) => f.url)).toEqual([ 'https://example.com/a.xml', 'https://example.com/b.xml', - Network accessline 40
'https://example.com/a.xml', - Network accessline 41
'https://example.com/b.xml', - Network accessline 46
it('loads file feeds (3 entries)', () => { const entries = [ { url: 'https://a.example.com/feed' }, - Network accessline 47
const entries = [ { url: 'https://a.example.com/feed' }, { url: 'https://b.example.com/feed', category: 'devops' }, - Network accessline 48
{ url: 'https://a.example.com/feed' }, - Network accessline 49
{ url: 'https://b.example.com/feed', category: 'devops' }, - Network accessline 50
{ url: 'https://c.example.com/feed', intervalSec: 600 }, - Network accessline 54
expect(r.feeds).toHaveLength(3); expect(r.sources).toEqual(['file']); expect(r.feeds.find((f) => f.url.startsWith('https://b'))?.category).toBe('devops'); - Network accessline 55
expect(r.sources).toEqual(['file']); expect(r.feeds.find((f) => f.url.startsWith('https://b'))?.category).toBe('devops'); expect(r.feeds.find((f) => f.url.startsWith('https://c'))?.intervalSec).toBe(600); - Network accessline 56
expect(r.feeds.find((f) => f.url.startsWith('https://b'))?.category).toBe('devops'); - Network accessline 57
expect(r.feeds.find((f) => f.url.startsWith('https://c'))?.intervalSec).toBe(600); - Network accessline 60
it('merges env and file, env wins on URL collision, dedups', () => { process.env.WIGOLO_RSS_FEEDS = 'https://shared.example.com/feed,https://only-env.example.com/feed'; - Network accessline 61
process.env.WIGOLO_RSS_FEEDS = 'https://shared.example.com/feed,https://only-env.example.com/feed'; - Network accessline 62
const entries = [ { url: 'https://shared.example.com/feed', category: 'file-says' }, { url: 'https://only-file.example.com/feed' }, - Network accessline 63
{ url: 'https://shared.example.com/feed', category: 'file-says' }, - Network accessline 64
{ url: 'https://only-file.example.com/feed' }, - Network accessline 69
const urls = r.feeds.map((f) => f.url).sort(); expect(urls).toEqual([ 'https://only-env.example.com/feed', - Network accessline 70
expect(urls).toEqual([ 'https://only-env.example.com/feed', 'https://only-file.example.com/feed', - Network accessline 71
'https://only-env.example.com/feed', - Network accessline 72
'https://only-file.example.com/feed', - Network accessline 73
'https://shared.example.com/feed', - Network accessline 76
const shared = r.feeds.find((f) => f.url === 'https://shared.example.com/feed'); - Network accessline 81
it('drops invalid URLs from env silently', () => { process.env.WIGOLO_RSS_FEEDS = 'not-a-url,https://good.example.com/feed,ftp://bad.example.com'; - Network accessline 82
process.env.WIGOLO_RSS_FEEDS = 'not-a-url,https://good.example.com/feed,ftp://bad.example.com'; - Network accessline 83
const r = loadFeedConfig({ dataDir: dir }); expect(r.feeds.map((f) => f.url)).toEqual(['https://good.example.com/feed']); }); - Network accessline 84
expect(r.feeds.map((f) => f.url)).toEqual(['https://good.example.com/feed']); - Network accessline 87
it('missing file does not throw and returns env-only', () => { process.env.WIGOLO_RSS_FEEDS = 'https://env.example.com/feed'; - Network accessline 88
process.env.WIGOLO_RSS_FEEDS = 'https://env.example.com/feed'; - Network accessline 94
it('malformed JSON does not throw, falls back to env only', () => { process.env.WIGOLO_RSS_FEEDS = 'https://env.example.com/feed'; - Network accessline 95
process.env.WIGOLO_RSS_FEEDS = 'https://env.example.com/feed'; - Network accessline 97
const r = loadFeedConfig({ dataDir: dir }); expect(r.feeds).toHaveLength(1); expect(r.feeds[0].url).toBe('https://env.example.com/feed'); - Network accessline 98
expect(r.feeds).toHaveLength(1); expect(r.feeds[0].url).toBe('https://env.example.com/feed'); }); - Network accessline 99
expect(r.feeds[0].url).toBe('https://env.example.com/feed'); - Network accessline 102
it('preserves intervalSec from file through merge', () => { const entries = [{ url: 'https://x.example.com/feed', intervalSec: 120 }]; - Network accessline 103
const entries = [{ url: 'https://x.example.com/feed', intervalSec: 120 }];
tests/unit/search/v1/rss/feed-parser.test.ts
- Executable scriptline 1
Executable file - Network accessline 6
<channel> <title>Example News</title> <link>https://example.com/</link> - Network accessline 7
<title>Example News</title> <link>https://example.com/</link> <description>An example feed.</description> - Network accessline 8
<link>https://example.com/</link> - Network accessline 10
<item> <title>First Post</title> <link>https://example.com/1</link> - Network accessline 11
<title>First Post</title> <link>https://example.com/1</link> <description>About AI & machine learning.</description> - Network accessline 12
<link>https://example.com/1</link> - Network accessline 13
<description>About AI & machine learning.</description> <guid>https://example.com/1</guid> <pubDate>Tue, 03 Jun 2025 09:00:00 GMT</pubDate> - Network accessline 14
<guid>https://example.com/1</guid> - Network accessline 17
<item> <title>Second Post</title> <link>https://example.com/2</link> - Network accessline 18
<title>Second Post</title> <link>https://example.com/2</link> <description>Cluster computing.</description> - Network accessline 19
<link>https://example.com/2</link> - Network accessline 24
<item> <title>Third Post</title> <link>https://example.com/3</link> - Network accessline 25
<title>Third Post</title> <link>https://example.com/3</link> <description>No date here.</description> - Network accessline 26
<link>https://example.com/3</link> - Network accessline 27
<description>No date here.</description> <guid>https://example.com/3</guid> </item> - Network accessline 28
<guid>https://example.com/3</guid> - Network accessline 33
const ATOM = `<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - Network accessline 34
<feed xmlns="http://www.w3.org/2005/Atom"> - Network accessline 37
<entry> <title>Atom Entry One</title> <link rel="alternate" href="https://atom.example.com/a"/> - Network accessline 38
<title>Atom Entry One</title> <link rel="alternate" href="https://atom.example.com/a"/> <id>urn:example:a</id> - Network accessline 39
<link rel="alternate" href="https://atom.example.com/a"/> - Network accessline 44
<entry> <title>Atom Entry Two</title> <link rel="alternate" href="https://atom.example.com/b"/> - Network accessline 45
<title>Atom Entry Two</title> <link rel="alternate" href="https://atom.example.com/b"/> <id>urn:example:b</id> - Network accessline 46
<link rel="alternate" href="https://atom.example.com/b"/> - Network accessline 53
const ATOM_CONTENT = `<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> - Network accessline 54
<feed xmlns="http://www.w3.org/2005/Atom"> - Network accessline 56
<entry> <title>Content Entry</title> <link rel="alternate" href="https://atom.example.com/c"/> - Network accessline 57
<title>Content Entry</title> <link rel="alternate" href="https://atom.example.com/c"/> <id>urn:example:c</id> - Network accessline 58
<link rel="alternate" href="https://atom.example.com/c"/> - Network accessline 68
describe('parseFeed', () => { it('parses RSS 2.0 with 3 items', () => { const result = parseFeed(RSS_2, 'https://example.com/feed.xml'); - Network accessline 69
it('parses RSS 2.0 with 3 items', () => { const result = parseFeed(RSS_2, 'https://example.com/feed.xml'); expect(result).not.toBeNull(); - Network accessline 70
const result = parseFeed(RSS_2, 'https://example.com/feed.xml'); - Network accessline 71
expect(result).not.toBeNull(); expect(result!.feedUrl).toBe('https://example.com/feed.xml'); expect(result!.feedTitle).toBe('Example News'); - Network accessline 72
expect(result!.feedUrl).toBe('https://example.com/feed.xml'); - Network accessline 74
expect(result!.items).toHaveLength(3); expect(result!.items[0].title).toBe('First Post'); expect(result!.items[0].link).toBe('https://example.com/1'); - Network accessline 75
expect(result!.items[0].title).toBe('First Post'); expect(result!.items[0].link).toBe('https://example.com/1'); expect(result!.items[0].guid).toBe('https://example.com/1'); - Network accessline 76
expect(result!.items[0].link).toBe('https://example.com/1'); - Network accessline 77
expect(result!.items[0].guid).toBe('https://example.com/1'); - Network accessline 81
it('decodes HTML entities in summary (linkedom)', () => { const r = parseFeed(RSS_2, 'https://example.com/feed.xml'); - Network accessline 82
const r = parseFeed(RSS_2, 'https://example.com/feed.xml'); - Network accessline 88
it('parses Atom with 2 entries', () => { const r = parseFeed(ATOM, 'https://atom.example.com/feed.xml'); - Network accessline 89
const r = parseFeed(ATOM, 'https://atom.example.com/feed.xml'); - Network accessline 91
expect(r!.items).toHaveLength(2); expect(r!.items[0].title).toBe('Atom Entry One'); expect(r!.items[0].link).toBe('https://atom.example.com/a'); - Network accessline 92
expect(r!.items[0].title).toBe('Atom Entry One'); expect(r!.items[0].link).toBe('https://atom.example.com/a'); expect(r!.items[0].guid).toBe('urn:example:a'); - Network accessline 93
expect(r!.items[0].link).toBe('https://atom.example.com/a'); - Network accessline 98
it('uses <content> when <summary> is absent', () => { const r = parseFeed(ATOM_CONTENT, 'https://atom.example.com/c.xml'); - Network accessline 99
const r = parseFeed(ATOM_CONTENT, 'https://atom.example.com/c.xml'); - Network accessline 129
<rss version="2.0"><channel> <title>RSS wins</title> <item><title>From RSS</title><link>https://r.example.com/1</link><description>d</description></item> - Network accessline 130
<title>RSS wins</title> <item><title>From RSS</title><link>https://r.example.com/1</link><description>d</description></item> </channel></rss>`; - Network accessline 131
<item><title>From RSS</title><link>https://r.example.com/1</link><description>d</description></item>
tests/unit/search/v1/rss/feed-poller.test.ts
- Executable scriptline 1
Executable file - Network accessline 13
<rss version="2.0"><channel> <title>Feed A</title> <item><title>A1</title><link>https://a.example.com/1</link><description>desc</description><guid>a-1</guid></item> - Network accessline 14
<title>Feed A</title> <item><title>A1</title><link>https://a.example.com/1</link><description>desc</description><guid>a-1</guid></item> <item><title>A2</title><link>https://a.example.com/2</link><description>desc</description><guid>a-2< - Network accessline 15
<item><title>A1</title><link>https://a.example.com/1</link><description>desc</description><guid>a-1</guid></item> - Network accessline 16
<item><title>A2</title><link>https://a.example.com/2</link><description>desc</description><guid>a-2</guid></item> - Network accessline 20
<rss version="2.0"><channel> <title>Feed B</title> <item><title>B1</title><link>https://b.example.com/1</link><description>desc</description><guid>b-1</guid></item> - Network accessline 21
<title>Feed B</title> <item><title>B1</title><link>https://b.example.com/1</link><description>desc</description><guid>b-1</guid></item> </channel></rss>`; - Network accessline 22
<item><title>B1</title><link>https://b.example.com/1</link><description>desc</description><guid>b-1</guid></item> - Network accessline 44
it('polls two feeds and inserts items', async () => { const fetchImpl = makeFetch({ 'https://a.example.com/feed': { status: 200, body: RSS_A }, - Network accessline 45
const fetchImpl = makeFetch({ 'https://a.example.com/feed': { status: 200, body: RSS_A }, 'https://b.example.com/feed': { status: 200, body: RSS_B }, - Network accessline 46
'https://a.example.com/feed': { status: 200, body: RSS_A }, - Network accessline 47
'https://b.example.com/feed': { status: 200, body: RSS_B }, - Network accessline 49
const results = await pollFeedsOnce({ feeds: [ { url: 'https://a.example.com/feed' }, - Network accessline 50
feeds: [ { url: 'https://a.example.com/feed' }, { url: 'https://b.example.com/feed' }, - Network accessline 51
{ url: 'https://a.example.com/feed' }, - Network accessline 52
{ url: 'https://b.example.com/feed' }, - Network accessline 61
it('one feed 404, other still processed', async () => { const fetchImpl = makeFetch({ 'https://a.example.com/feed': { status: 200, body: RSS_A }, - Network accessline 63
'https://a.example.com/feed': { status: 200, body: RSS_A }, - Network accessline 66
const results = await pollFeedsOnce({ feeds: [ { url: 'https://a.example.com/feed' }, - Network accessline 67
feeds: [ { url: 'https://a.example.com/feed' }, { url: 'https://b.example.com/feed' }, - Network accessline 68
{ url: 'https://a.example.com/feed' }, - Network accessline 69
{ url: 'https://b.example.com/feed' }, - Network accessline 71
fetchImpl, }); const a = results.find((r) => r.feedUrl === 'https://a.example.com/feed'); - Network accessline 72
}); const a = results.find((r) => r.feedUrl === 'https://a.example.com/feed'); const b = results.find((r) => r.feedUrl === 'https://b.example.com/feed'); - Network accessline 73
const a = results.find((r) => r.feedUrl === 'https://a.example.com/feed'); - Network accessline 74
const b = results.find((r) => r.feedUrl === 'https://b.example.com/feed'); - Network accessline 91
}); await pollFeedsOnce({ feeds: [{ url: 'https://a.example.com/feed' }], - Network accessline 92
await pollFeedsOnce({ feeds: [{ url: 'https://a.example.com/feed' }], fetchImpl: spy as unknown as typeof fetch, - Network accessline 93
feeds: [{ url: 'https://a.example.com/feed' }], fetchImpl: spy as unknown as typeof fetch, }); - Network accessline 99
it('honors per-feed category override on insert', async () => { const fetchImpl = makeFetch({ 'https://a.example.com/feed': { status: 200, body: RSS_A }, - Network accessline 100
const fetchImpl = makeFetch({ 'https://a.example.com/feed': { status: 200, body: RSS_A }, }); - Network accessline 101
'https://a.example.com/feed': { status: 200, body: RSS_A }, - Network accessline 102
}); await pollFeedsOnce({ feeds: [{ url: 'https://a.example.com/feed', category: 'tech' }], - Network accessline 103
await pollFeedsOnce({ feeds: [{ url: 'https://a.example.com/feed', category: 'tech' }], fetchImpl, - Network accessline 104
feeds: [{ url: 'https://a.example.com/feed', category: 'tech' }], - Network accessline 126
const handle = pollFeedsForever({ intervalSec: 0.01, feeds: [{ url: 'https://a.example.com/feed' }], - Network accessline 127
intervalSec: 0.01, feeds: [{ url: 'https://a.example.com/feed' }], fetchImpl: fetchImpl as unknown as typeof fetch, - Network accessline 128
feeds: [{ url: 'https://a.example.com/feed' }], fetchImpl: fetchImpl as unknown as typeof fetch, });
tests/unit/search/v1/rss/feed-store.test.ts
- Executable scriptline 1
Executable file - Network accessline 10
const SAMPLES = [ { feedUrl: 'https://a.example.com/feed', - Network accessline 11
{ feedUrl: 'https://a.example.com/feed', guid: 'a-1', - Network accessline 12
feedUrl: 'https://a.example.com/feed', - Network accessline 13
guid: 'a-1', title: 'AI breakthroughs in compilers', link: 'https://a.example.com/1', - Network accessline 14
title: 'AI breakthroughs in compilers', link: 'https://a.example.com/1', summary: 'Large language models help optimize generated code.', - Network accessline 15
link: 'https://a.example.com/1', - Network accessline 18
}, { feedUrl: 'https://a.example.com/feed', - Network accessline 19
{ feedUrl: 'https://a.example.com/feed', guid: 'a-2', - Network accessline 20
feedUrl: 'https://a.example.com/feed', - Network accessline 21
guid: 'a-2', title: 'Database internals deep dive', link: 'https://a.example.com/2', - Network accessline 22
title: 'Database internals deep dive', link: 'https://a.example.com/2', summary: 'WAL and MVCC explained.', - Network accessline 23
link: 'https://a.example.com/2', - Network accessline 26
}, { feedUrl: 'https://b.example.com/feed', - Network accessline 27
{ feedUrl: 'https://b.example.com/feed', guid: 'b-1', - Network accessline 28
feedUrl: 'https://b.example.com/feed', - Network accessline 29
guid: 'b-1', title: 'AI tooling roundup', link: 'https://b.example.com/1', - Network accessline 30
title: 'AI tooling roundup', link: 'https://b.example.com/1', summary: 'New IDE integrations and code review bots.', - Network accessline 31
link: 'https://b.example.com/1', - Network accessline 98
upsertFeedItems([ { feedUrl: 'https://c.example.com/feed', - Network accessline 99
{ feedUrl: 'https://c.example.com/feed', guid: 'c-1', - Network accessline 100
feedUrl: 'https://c.example.com/feed', - Network accessline 101
guid: 'c-1', title: 'Undated note about widgets', link: 'https://c.example.com/1', - Network accessline 102
title: 'Undated note about widgets', link: 'https://c.example.com/1', summary: 'No date here.', - Network accessline 103
link: 'https://c.example.com/1',
tests/unit/search/v1/rss/rss-engine.test.ts
- Executable scriptline 1
Executable file - Network accessline 27
upsertFeedItems([ { feedUrl: 'https://x.example.com/feed', - Network accessline 28
{ feedUrl: 'https://x.example.com/feed', guid: 'x-1', - Network accessline 29
feedUrl: 'https://x.example.com/feed', - Network accessline 30
guid: 'x-1', title: 'AI search techniques', link: 'https://x.example.com/1', - Network accessline 31
title: 'AI search techniques', link: 'https://x.example.com/1', summary: 'Hybrid retrieval combining BM25 and vector search.', - Network accessline 32
link: 'https://x.example.com/1', - Network accessline 39
expect(results).toHaveLength(1); expect(results[0].engine).toBe('rss-feed'); expect(results[0].url).toBe('https://x.example.com/1'); - Network accessline 40
expect(results[0].engine).toBe('rss-feed'); expect(results[0].url).toBe('https://x.example.com/1'); expect(results[0].title).toBe('AI search techniques'); - Network accessline 41
expect(results[0].url).toBe('https://x.example.com/1'); - Network accessline 60
upsertFeedItems([ { feedUrl: 'https://x.example.com/feed', - Network accessline 61
{ feedUrl: 'https://x.example.com/feed', guid: 'x-2', - Network accessline 62
feedUrl: 'https://x.example.com/feed', - Network accessline 63
guid: 'x-2', title: 'Undated AI piece', link: 'https://x.example.com/2', - Network accessline 64
title: 'Undated AI piece', link: 'https://x.example.com/2', summary: 'no date', - Network accessline 65
link: 'https://x.example.com/2',
tests/unit/search/v1/v1-provider.test.ts
- Executable scriptline 1
Executable file - Network accessline 14
data: { answer: 'mocked answer', citations: [{ index: 1, url: 'https://x.example', title: 'x', snippet: '' }], - Network accessline 15
answer: 'mocked answer', citations: [{ index: 1, url: 'https://x.example', title: 'x', snippet: '' }], fallback_level: 1 as const, - Network accessline 16
citations: [{ index: 1, url: 'https://x.example', title: 'x', snippet: '' }], - Network accessline 67
runV1SearchMock.mockResolvedValueOnce({ results: [ { title: 'A cat', url: 'https://example.com/cats', snippet: 'src', relevance_score: 1, engine: 'ddg-image', image_url: 'https://cdn/cat.jpg' }, - Network accessline 68
results: [ { title: 'A cat', url: 'https://example.com/cats', snippet: 'src', relevance_score: 1, engine: 'ddg-image', image_url: 'https://cdn/cat.jpg' }, ], - Network accessline 69
{ title: 'A cat', url: 'https://example.com/cats', snippet: 'src', relevance_score: 1, engine: 'ddg-image', image_url: 'https://cdn/cat.jpg' }, - Network accessline 135
runV1SearchMock.mockImplementationOnce(async () => ({ results: [ { title: 'Shared', url: 'https://shared.example/a', snippet: 's', relevance_score: 0.9, engine: 'bing' }, - Network accessline 136
results: [ { title: 'Shared', url: 'https://shared.example/a', snippet: 's', relevance_score: 0.9, engine: 'bing' }, { title: 'Only-A', url: 'https://only-a.example', snippet: '', relevance_score: 0.8, engine: 'bing' }, - Network accessline 137
{ title: 'Shared', url: 'https://shared.example/a', snippet: 's', relevance_score: 0.9, engine: 'bing' }, - Network accessline 138
{ title: 'Only-A', url: 'https://only-a.example', snippet: '', relevance_score: 0.8, engine: 'bing' }, - Network accessline 143
runV1SearchMock.mockImplementationOnce(async () => ({ results: [ { title: 'Only-B', url: 'https://only-b.example', snippet: '', relevance_score: 0.95, engine: 'duckduckgo' }, - Network accessline 144
results: [ { title: 'Only-B', url: 'https://only-b.example', snippet: '', relevance_score: 0.95, engine: 'duckduckgo' }, { title: 'Shared', url: 'https://shared.example/a', snippet: 's', relevance_score: 0.7, engine: 'du - Network accessline 145
{ title: 'Only-B', url: 'https://only-b.example', snippet: '', relevance_score: 0.95, engine: 'duckduckgo' }, - Network accessline 146
{ title: 'Shared', url: 'https://shared.example/a', snippet: 's', relevance_score: 0.7, engine: 'duckduckgo' }, - Network accessline 162
expect(urls[0]).toBe('https://shared.example/a'); - Network accessline 163
expect(urls).toContain('https://only-a.example'); - Network accessline 164
expect(urls).toContain('https://only-b.example'); - Network accessline 206
runSynthesisMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 207
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 208
results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 227
runV1SearchMock.mockImplementationOnce(async () => ({ results: [ { title: 'OK', url: 'https://ok.example', snippet: '', relevance_score: 0.5, engine: 'bing' }, - Network accessline 228
results: [ { title: 'OK', url: 'https://ok.example', snippet: '', relevance_score: 0.5, engine: 'bing' }, ], - Network accessline 229
{ title: 'OK', url: 'https://ok.example', snippet: '', relevance_score: 0.5, engine: 'bing' }, - Network accessline 251
getCachedSearchResultsMock.mockReturnValue(null); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 252
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 253
results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 265
getCachedSearchResultsMock.mockReturnValue(null); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'bing' }], - Network accessline 266
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'bing' }], enginesUsed: ['bing'], - Network accessline 267
results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'bing' }], - Network accessline 269
degraded: false, outcomes: [ { engine: 'bing', ok: true, latencyMs: 120, results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'bing' }] }, - Network accessline 270
outcomes: [ { engine: 'bing', ok: true, latencyMs: 120, results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'bing' }] }, { engine: 'duckduckgo', ok: false, latencyMs: 80, results: [], error - Network accessline 271
{ engine: 'bing', ok: true, latencyMs: 120, results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'bing' }] }, - Network accessline 304
getCachedSearchResultsMock.mockReturnValue({ query: 'q', results: [{ title: 'cached', url: 'https://c', snippet: '', relevance_score: 1 }], - Network accessline 305
query: 'q', results: [{ title: 'cached', url: 'https://c', snippet: '', relevance_score: 1 }], engines_used: ['bing'], - Network accessline 306
results: [{ title: 'cached', url: 'https://c', snippet: '', relevance_score: 1 }], - Network accessline 325
getCachedSearchResultsMock.mockReturnValue(null); runV1SearchMock.mockResolvedValue({ results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], - Network accessline 326
runV1SearchMock.mockResolvedValue({ results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 327
results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], - Network accessline 337
const [cachedKey, cachedItems, cachedEngines] = cacheSearchResultsMock.mock.calls[0]; expect(cachedKey).toBe('rust async runtime'); expect(cachedItems.map((i: { url: string }) => i.url)).toEqual(['https://a.example']); - Network accessline 338
expect(cachedKey).toBe('rust async runtime'); expect(cachedItems.map((i: { url: string }) => i.url)).toEqual(['https://a.example']); expect(cachedEngines).toEqual(['b']); - Network accessline 339
expect(cachedItems.map((i: { url: string }) => i.url)).toEqual(['https://a.example']); - Network accessline 349
query: 'rust async runtime', results: [ { title: 'Cached', url: 'https://cached.example', snippet: 'sc', relevance_score: 1 }, - Network accessline 350
results: [ { title: 'Cached', url: 'https://cached.example', snippet: 'sc', relevance_score: 1 }, ], - Network accessline 351
{ title: 'Cached', url: 'https://cached.example', snippet: 'sc', relevance_score: 1 }, - Network accessline 364
if (result.ok) { expect(result.data.results).toHaveLength(1); expect(result.data.results[0].url).toBe('https://cached.example'); - Network accessline 365
expect(result.data.results).toHaveLength(1); expect(result.data.results[0].url).toBe('https://cached.example'); expect(result.data.results[0].cached).toBe(true); - Network accessline 366
expect(result.data.results[0].url).toBe('https://cached.example'); - Network accessline 377
getCachedSearchResultsMock.mockReturnValue({ query: 'q', results: [{ title: 'stale', url: 'https://stale.example', snippet: '', relevance_score: 1 }], - Network accessline 378
query: 'q', results: [{ title: 'stale', url: 'https://stale.example', snippet: '', relevance_score: 1 }], engines_used: ['x'], - Network accessline 379
results: [{ title: 'stale', url: 'https://stale.example', snippet: '', relevance_score: 1 }], - Network accessline 382
}); runV1SearchMock.mockResolvedValue({ results: [{ title: 'fresh', url: 'https://fresh.example', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 383
runV1SearchMock.mockResolvedValue({ results: [{ title: 'fresh', url: 'https://fresh.example', snippet: '', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 384
results: [{ title: 'fresh', url: 'https://fresh.example', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 397
expect(result.ok).toBe(true); if (result.ok) { expect(result.data.results[0].url).toBe('https://fresh.example'); - Network accessline 398
if (result.ok) { expect(result.data.results[0].url).toBe('https://fresh.example'); } - Network accessline 399
expect(result.data.results[0].url).toBe('https://fresh.example'); - Network accessline 407
getCachedSearchResultsMock.mockReturnValue({ query: 'q', results: [{ title: 'old', url: 'https://old.example', snippet: '', relevance_score: 1 }], - Network accessline 408
query: 'q', results: [{ title: 'old', url: 'https://old.example', snippet: '', relevance_score: 1 }], engines_used: ['x'], - Network accessline 409
results: [{ title: 'old', url: 'https://old.example', snippet: '', relevance_score: 1 }], - Network accessline 413
}); runV1SearchMock.mockResolvedValue({ results: [{ title: 'fresh', url: 'https://fresh.example', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 414
runV1SearchMock.mockResolvedValue({ results: [{ title: 'fresh', url: 'https://fresh.example', snippet: '', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 415
results: [{ title: 'fresh', url: 'https://fresh.example', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 423
expect(runV1SearchMock).toHaveBeenCalledOnce(); if (result.ok) { expect(result.data.results[0].url).toBe('https://fresh.example'); - Network accessline 424
if (result.ok) { expect(result.data.results[0].url).toBe('https://fresh.example'); } - Network accessline 425
expect(result.data.results[0].url).toBe('https://fresh.example'); - Network accessline 433
getCachedSearchResultsMock.mockReturnValue(null); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 434
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 435
results: [{ title: 't', url: 'https://x', snippet: '', relevance_score: 1, engine: 'b' }], - Network accessline 470
applyEvidenceDefaultMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 471
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 472
results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 489
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 490
results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, { title: 'B', url: 'https://b.example', snippet: 'sb', relevance_score: 0.5, engine: 'b' }, - Network accessline 491
{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 492
{ title: 'B', url: 'https://b.example', snippet: 'sb', relevance_score: 0.5, engine: 'b' }, - Network accessline 506
const [items, passedRouter] = fetchContentMock.mock.calls[0]; expect(passedRouter).toBe(router); expect(items.map((i: { url: string }) => i.url)).toEqual(['https://a.example', 'https://b.example']); - Network accessline 507
expect(passedRouter).toBe(router); expect(items.map((i: { url: string }) => i.url)).toEqual(['https://a.example', 'https://b.example']); expect(result.ok).toBe(true); - Network accessline 508
expect(items.map((i: { url: string }) => i.url)).toEqual(['https://a.example', 'https://b.example']); - Network accessline 516
applyEvidenceDefaultMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 517
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 518
results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 537
applyEvidenceDefaultMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], - Network accessline 538
runV1SearchMock.mockResolvedValue({ results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 539
results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], - Network accessline 548
expect(applyEvidenceDefaultMock).toHaveBeenCalledOnce(); const [, , passedItems, passedQuery] = applyEvidenceDefaultMock.mock.calls[0]; expect(passedItems.map((i: { url: string }) => i.url)).toEqual(['https://a.example']); - Network accessline 549
const [, , passedItems, passedQuery] = applyEvidenceDefaultMock.mock.calls[0]; expect(passedItems.map((i: { url: string }) => i.url)).toEqual(['https://a.example']); expect(passedQuery).toBe('q'); - Network accessline 550
expect(passedItems.map((i: { url: string }) => i.url)).toEqual(['https://a.example']); - Network accessline 557
applyEvidenceDefaultMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], - Network accessline 558
runV1SearchMock.mockResolvedValue({ results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 559
results: [{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }], - Network accessline 599
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'first', relevance_score: 1, engine: 'b' }, - Network accessline 600
results: [ { title: 'A', url: 'https://a.example', snippet: 'first', relevance_score: 1, engine: 'b' }, ], - Network accessline 601
{ title: 'A', url: 'https://a.example', snippet: 'first', relevance_score: 1, engine: 'b' }, - Network accessline 618
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 619
results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, { title: 'B', url: 'https://b.example', snippet: 'sb', relevance_score: 0.5, engine: 'b' }, - Network accessline 620
{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 621
{ title: 'B', url: 'https://b.example', snippet: 'sb', relevance_score: 0.5, engine: 'b' }, - Network accessline 633
if (result.ok) { expect(result.data.citations).toEqual([ { index: 1, url: 'https://a.example', title: 'A', snippet: 'sa' }, - Network accessline 634
expect(result.data.citations).toEqual([ { index: 1, url: 'https://a.example', title: 'A', snippet: 'sa' }, { index: 2, url: 'https://b.example', title: 'B', snippet: 'sb' }, - Network accessline 635
{ index: 1, url: 'https://a.example', title: 'A', snippet: 'sa' }, - Network accessline 636
{ index: 2, url: 'https://b.example', title: 'B', snippet: 'sb' }, - Network accessline 644
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 645
results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, ], - Network accessline 646
{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 659
expect(result.data.citations).toHaveLength(1); expect(result.data.citations_xml).toContain('<source'); expect(result.data.citations_xml).toContain('https://a.example'); - Network accessline 660
expect(result.data.citations_xml).toContain('<source'); expect(result.data.citations_xml).toContain('https://a.example'); } - Network accessline 661
expect(result.data.citations_xml).toContain('https://a.example'); - Network accessline 667
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 668
results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, ], - Network accessline 669
{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 690
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 691
results: [ { title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, ], - Network accessline 692
{ title: 'A', url: 'https://a.example', snippet: 'sa', relevance_score: 1, engine: 'b' }, - Network accessline 699
data: { answer: 'A says X [1].', citations: [{ index: 1, url: 'https://a.example', title: 'A', snippet: 'sa' }], - Network accessline 700
answer: 'A says X [1].', citations: [{ index: 1, url: 'https://a.example', title: 'A', snippet: 'sa' }], fallback_level: 1, - Network accessline 701
citations: [{ index: 1, url: 'https://a.example', title: 'A', snippet: 'sa' }], - Network accessline 723
runV1SearchMock.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example', snippet: 'first', relevance_score: 1, engine: 'b' }, - Network accessline 724
results: [ { title: 'A', url: 'https://a.example', snippet: 'first', relevance_score: 1, engine: 'b' }, { title: 'B', url: 'https://b.example', snippet: 'second', relevance_score: 0.5, engine: 'b' }, - Network accessline 725
{ title: 'A', url: 'https://a.example', snippet: 'first', relevance_score: 1, engine: 'b' }, - Network accessline 726
{ title: 'B', url: 'https://b.example', snippet: 'second', relevance_score: 0.5, engine: 'b' }, - Network accessline 734
answer: 'A answer with [1] and [2].', citations: [ { index: 1, url: 'https://a.example', title: 'A', snippet: 'first' }, - Network accessline 735
citations: [ { index: 1, url: 'https://a.example', title: 'A', snippet: 'first' }, { index: 2, url: 'https://b.example', title: 'B', snippet: 'second' }, - Network accessline 736
{ index: 1, url: 'https://a.example', title: 'A', snippet: 'first' }, - Network accessline 737
{ index: 2, url: 'https://b.example', title: 'B', snippet: 'second' }, - Network accessline 764
runV1SearchMock.mockResolvedValue({ results: [ { title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }, - Network accessline 765
results: [ { title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }, ], - Network accessline 766
{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }, - Network accessline 791
runSynthesisMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 792
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 793
results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 814
runSynthesisMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 815
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 816
results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 839
runSynthesisMock.mockClear(); runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], - Network accessline 840
runV1SearchMock.mockResolvedValue({ results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }], enginesUsed: ['b'], - Network accessline 841
results: [{ title: 't', url: 'https://x', snippet: 's', relevance_score: 1, engine: 'b' }],
tests/unit/search/v1/verticals/code.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted]
tests/unit/search/v1/verticals/docs.test.ts
tests/unit/search/v1/verticals/general.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted]
tests/unit/search/v1/verticals/news.test.ts
- Executable scriptline 1
Executable file - Network accessline 109
describe('RSS feed integration', () => { it('adds rss-feed engine when env-configured (even with empty store)', () => { process.env.WIGOLO_RSS_FEEDS = 'https://blog.example.com/feed.xml'; - Network accessline 110
it('adds rss-feed engine when env-configured (even with empty store)', () => { process.env.WIGOLO_RSS_FEEDS = 'https://blog.example.com/feed.xml'; _resetNewsEnginesForTest(); - Network accessline 111
process.env.WIGOLO_RSS_FEEDS = 'https://blog.example.com/feed.xml'; - Network accessline 124
upsertFeedItems([ { feedUrl: 'https://stored.example.com/feed', - Network accessline 125
{ feedUrl: 'https://stored.example.com/feed', guid: 's-1', - Network accessline 126
feedUrl: 'https://stored.example.com/feed', - Network accessline 127
guid: 's-1', title: 'A stored item', link: 'https://stored.example.com/1', - Network accessline 128
title: 'A stored item', link: 'https://stored.example.com/1', summary: 'body', - Network accessline 129
link: 'https://stored.example.com/1', - Network accessline 143
it('memoizes RSS decision — adding feeds after first call does not change result', () => { const before = getNewsEngines(); process.env.WIGOLO_RSS_FEEDS = 'https://late.example.com/feed'; - Network accessline 144
const before = getNewsEngines(); process.env.WIGOLO_RSS_FEEDS = 'https://late.example.com/feed'; const after = getNewsEngines(); - Network accessline 145
process.env.WIGOLO_RSS_FEEDS = 'https://late.example.com/feed';
tests/unit/search/v1/verticals/papers.test.ts
- Executable scriptline 1
Executable file
tests/unit/search/validator.test.ts
- Executable scriptline 1
Executable file - Network accessline 36
it('keeps valid URLs', async () => { const results = [{ url: `http://127.0.0.1:${port}/ok`, title: 'OK' }]; - Network accessline 37
const results = [{ url: `http://127.0.0.1:${port}/ok`, title: 'OK' }]; - Network accessline 42
it('filters 404 URLs', async () => { const results = [ { url: `http://127.0.0.1:${port}/ok`, title: 'OK' }, - Network accessline 43
const results = [ { url: `http://127.0.0.1:${port}/ok`, title: 'OK' }, { url: `http://127.0.0.1:${port}/not-found`, title: 'Missing' }, - Network accessline 44
{ url: `http://127.0.0.1:${port}/ok`, title: 'OK' }, - Network accessline 45
{ url: `http://127.0.0.1:${port}/not-found`, title: 'Missing' }, - Network accessline 52
it('filters 5xx URLs', async () => { const results = [{ url: `http://127.0.0.1:${port}/error`, title: 'Err' }]; - Network accessline 53
const results = [{ url: `http://127.0.0.1:${port}/error`, title: 'Err' }]; - Network accessline 58
it('filters URLs that time out', async () => { const results = [{ url: `http://127.0.0.1:${port}/slow`, title: 'Slow' }]; - Network accessline 59
const results = [{ url: `http://127.0.0.1:${port}/slow`, title: 'Slow' }]; - Network accessline 65
process.env.VALIDATE_LINKS = 'false'; resetConfig(); const results = [{ url: `http://127.0.0.1:${port}/not-found`, title: 'Missing' }]; - Network accessline 66
resetConfig(); const results = [{ url: `http://127.0.0.1:${port}/not-found`, title: 'Missing' }]; const valid = await validateLinks(results); - Network accessline 67
const results = [{ url: `http://127.0.0.1:${port}/not-found`, title: 'Missing' }]; - Network accessline 72
it('handles concurrent validation within batch limit', async () => { const results = Array.from({ length: 10 }, (_, i) => ({ url: `http://127.0.0.1:${port}/ok?i=${i}`, - Network accessline 73
const results = Array.from({ length: 10 }, (_, i) => ({ url: `http://127.0.0.1:${port}/ok?i=${i}`, title: `Result ${i}`, - Network accessline 74
url: `http://127.0.0.1:${port}/ok?i=${i}`,
tests/unit/searxng/bootstrap-lock.test.ts
- Executable scriptline 1
Executable file
tests/unit/searxng/bootstrap-retry.test.ts
tests/unit/searxng/bootstrap.test.ts
- Executable scriptline 1
Executable file - Network accessline 114
describe('resolveSearchBackend', () => { it('returns user-provided URL when SEARXNG_URL is set', async () => { process.env.SEARXNG_URL = 'http://my-searxng:8080'; - Network accessline 115
it('returns user-provided URL when SEARXNG_URL is set', async () => { process.env.SEARXNG_URL = 'http://my-searxng:8080'; resetConfig(); - Network accessline 116
process.env.SEARXNG_URL = 'http://my-searxng:8080'; - Network accessline 118
const result = await resolveSearchBackend(); expect(result.type).toBe('external'); expect(result.url).toBe('http://my-searxng:8080'); - Network accessline 119
expect(result.type).toBe('external'); expect(result.url).toBe('http://my-searxng:8080'); }); - Network accessline 120
expect(result.url).toBe('http://my-searxng:8080');
tests/unit/searxng/docker.test.ts
- Executable scriptline 1
Executable file - Dangerous shell operationline 119
const trickyName = "wigolo; rm -rf / #'"; - Dangerous shell operationline 130
it('runs docker stop then rm when docker is available', () => { - Dangerous shell operationline 137
it('runs podman stop then rm when only podman is available', () => {
tests/unit/searxng/enabled.test.ts
- Executable scriptline 1
Executable file - Network accessline 44
expect( searxngConfigured(cfg({ searchBackend: 'core', searxngUrl: 'http://sx.local:8888' })), - Network accessline 45
searxngConfigured(cfg({ searchBackend: 'core', searxngUrl: 'http://sx.local:8888' })), - Network accessline 46
).toBe(true); expect(searxngConfigured(cfg({ searxngUrl: 'http://sx.local:8888' }))).toBe(true); }); - Network accessline 47
expect(searxngConfigured(cfg({ searxngUrl: 'http://sx.local:8888' }))).toBe(true); - Network accessline 59
it('is TRUE when an external URL is set (no disk probe needed)', () => { expect(searxngBackendAvailable(cfg({ searxngUrl: 'http://sx.local:8888' }))).toBe(true); - Network accessline 60
expect(searxngBackendAvailable(cfg({ searxngUrl: 'http://sx.local:8888' }))).toBe(true);
tests/unit/searxng/process-health.test.ts
- Executable scriptline 1
Executable file
tests/unit/searxng/process-lock.test.ts
- Executable scriptline 1
Executable file
tests/unit/searxng/process.test.ts
tests/unit/security/key-crypto.test.ts
- Executable scriptline 1
Executable file
tests/unit/security/key-store.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 5
[Credential-related source omitted] - Access to secretsline 6
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 94
[Credential-related source omitted] - Access to secretsline 101
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 158
[Credential-related source omitted] - Access to secretsline 164
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 167
[Credential-related source omitted] - Access to secretsline 168
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Access to secretsline 171
[Credential-related source omitted] - Access to secretsline 177
[Credential-related source omitted] - Access to secretsline 178
[Credential-related source omitted] - Access to secretsline 179
[Credential-related source omitted] - Access to secretsline 180
[Credential-related source omitted] - Access to secretsline 182
[Credential-related source omitted] - Access to secretsline 185
[Credential-related source omitted] - Access to secretsline 187
[Credential-related source omitted] - Access to secretsline 188
[Credential-related source omitted] - Access to secretsline 193
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 201
[Credential-related source omitted] - Access to secretsline 203
[Credential-related source omitted] - Access to secretsline 209
[Credential-related source omitted] - Access to secretsline 210
[Credential-related source omitted] - Access to secretsline 216
[Credential-related source omitted] - Access to secretsline 219
[Credential-related source omitted] - Access to secretsline 231
[Credential-related source omitted] - Access to secretsline 238
[Credential-related source omitted] - Access to secretsline 270
[Credential-related source omitted] - Access to secretsline 274
[Credential-related source omitted] - Access to secretsline 276
[Credential-related source omitted] - Access to secretsline 279
[Credential-related source omitted]
tests/unit/server/backend-status-bootstrapping.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/backend-status.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/format-schema.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/instructions.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/schema-registration.test.ts
- Executable scriptline 1
Executable file - Network accessline 66
constructor(_httpClient: unknown, _browserPool: unknown) {} fetch = vi.fn().mockResolvedValue({ url: 'https://example.com/', - Network accessline 67
fetch = vi.fn().mockResolvedValue({ url: 'https://example.com/', finalUrl: 'https://example.com/', - Network accessline 68
url: 'https://example.com/', - Network accessline 69
finalUrl: 'https://example.com/', - Network accessline 194
arguments: { prompt: 'Read the example page title', urls: ['https://example.com/'], - Network accessline 195
prompt: 'Read the example page title', urls: ['https://example.com/'], max_pages: 1, - Network accessline 196
urls: ['https://example.com/'], - Network accessline 284
const res = await client.callTool({ name: 'extract', arguments: { url: 'https://example.com/', mode: 'brand' }, - Network accessline 285
name: 'extract', arguments: { url: 'https://example.com/', mode: 'brand' }, }); - Network accessline 286
arguments: { url: 'https://example.com/', mode: 'brand' },
tests/unit/server/search-response.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/server-factory.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/tool-annotations.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/tool-schemas.test.ts
- Executable scriptline 1
Executable file
tests/unit/server/warmup-on-start.test.ts
- Executable scriptline 1
Executable file - Network accessline 186
expect(origins).toEqual( expect.arrayContaining([ 'https://www.bing.com', - Network accessline 187
expect.arrayContaining([ 'https://www.bing.com', 'https://lite.duckduckgo.com', - Network accessline 188
'https://www.bing.com', - Network accessline 189
'https://lite.duckduckgo.com', - Network accessline 190
'https://en.wikipedia.org',
tests/unit/setup-status.test.ts
tests/unit/skill-md.test.ts
- Executable scriptline 1
Executable file
tests/unit/sponsors-links.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
const url = new URL(testmu().url); expect(url.origin + url.pathname).toBe('https://www.testmuai.com/'); - Network accessline 32
expect(url.origin + url.pathname).toBe('https://www.testmuai.com/'); - Network accessline 72
const withContent: Sponsor = { ...testmu(), url: 'https://example.com/?utm_source=wigolo&utm_content=their-own-campaign', - Network accessline 73
...testmu(), url: 'https://example.com/?utm_source=wigolo&utm_content=their-own-campaign', }; - Network accessline 74
url: 'https://example.com/?utm_source=wigolo&utm_content=their-own-campaign', - Network accessline 100
'README', '<script>alert(1)</script>', 'https://attacker.example', - Network accessline 101
'<script>alert(1)</script>', 'https://attacker.example', '', - Network accessline 102
'https://attacker.example', - Network accessline 127
expect(sponsorGoUrl('testmu', 'readme', 'https://wigolo.app')).toBe( - Network accessline 128
'https://wigolo.app/go/testmu/?ref=readme', - Network accessline 132
it('does not double the slash when the site URL has a trailing one', () => { expect(sponsorGoUrl('testmu', 'readme', 'https://wigolo.app/')).toBe( - Network accessline 133
expect(sponsorGoUrl('testmu', 'readme', 'https://wigolo.app/')).toBe( - Network accessline 134
'https://wigolo.app/go/testmu/?ref=readme', - Network accessline 166
describe('sponsorReleaseLine', () => { it('links each sponsor through the hop tagged as a release placement', () => { const line = sponsorReleaseLine('https://wigolo.app'); - Network accessline 167
it('links each sponsor through the hop tagged as a release placement', () => { const line = sponsorReleaseLine('https://wigolo.app'); for (const s of SPONSORS) { - Network accessline 168
const line = sponsorReleaseLine('https://wigolo.app'); - Network accessline 169
for (const s of SPONSORS) { expect(line).toContain(`[${s.name}](https://wigolo.app/go/${s.slug}/?ref=release)`); } - Network accessline 170
expect(line).toContain(`[${s.name}](https://wigolo.app/go/${s.slug}/?ref=release)`);
tests/unit/tools/agent.test.ts
- Executable scriptline 1
Executable file - Network accessline 25
name: 'test-stub', search: vi.fn().mockResolvedValue([ { title: 'Result 1', url: 'https://example.com/1', snippet: 'Content 1', relevance_score: 0.9, engine: 'test-stub' }, - Network accessline 26
search: vi.fn().mockResolvedValue([ { title: 'Result 1', url: 'https://example.com/1', snippet: 'Content 1', relevance_score: 0.9, engine: 'test-stub' }, ] as RawSearchResult[]), - Network accessline 27
{ title: 'Result 1', url: 'https://example.com/1', snippet: 'Content 1', relevance_score: 0.9, engine: 'test-stub' }, - Network accessline 31
const stubRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', - Network accessline 32
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', finalUrl: 'https://example.com/1', - Network accessline 33
url: 'https://example.com/1', - Network accessline 34
finalUrl: 'https://example.com/1', - Network accessline 141
const input: AgentInput = { prompt: 'Check these', urls: ['https://example.com/a', 'https://example.com/b'], - Network accessline 142
prompt: 'Check these', urls: ['https://example.com/a', 'https://example.com/b'], }; - Network accessline 143
urls: ['https://example.com/a', 'https://example.com/b'], - Network accessline 241
const richRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/topic', - Network accessline 242
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/topic', finalUrl: 'https://example.com/topic', - Network accessline 243
url: 'https://example.com/topic', - Network accessline 244
finalUrl: 'https://example.com/topic', - Network accessline 263
const input: AgentInput = { prompt: 'Tell me about TypeScript', urls: ['https://example.com/topic'], - Network accessline 264
prompt: 'Tell me about TypeScript', urls: ['https://example.com/topic'], max_pages: 1, - Network accessline 265
urls: ['https://example.com/topic'], - Network accessline 292
const input: AgentInput = { prompt: 'Tell me about TypeScript', urls: ['https://example.com/topic'], - Network accessline 293
prompt: 'Tell me about TypeScript', urls: ['https://example.com/topic'], max_pages: 1, - Network accessline 294
urls: ['https://example.com/topic'], - Network accessline 316
const input: AgentInput = { prompt: 'Extract types', urls: ['https://example.com/topic'], - Network accessline 317
prompt: 'Extract types', urls: ['https://example.com/topic'], schema: { type: 'object', properties: { name: { type: 'string' } } }, - Network accessline 318
urls: ['https://example.com/topic'], - Network accessline 335
const urls = Array.from({ length: 40 }, (_, i) => `https://example.com/page-${i}`);
tests/unit/tools/cache-hybrid.test.ts
- Executable scriptline 1
Executable file - Network accessline 56
return { id: 1, url: overrides.url ?? 'https://example.com', - Network accessline 57
id: 1, url: overrides.url ?? 'https://example.com', normalizedUrl: overrides.normalizedUrl ?? overrides.url ?? 'https://example.com', - Network accessline 58
url: overrides.url ?? 'https://example.com', - Network accessline 59
normalizedUrl: overrides.normalizedUrl ?? overrides.url ?? 'https://example.com', - Network accessline 92
it('fuses FTS5 + vector rankings and hydrates results in fused order', async () => { vi.mocked(ftsSearchRanked).mockReturnValue([ { url: 'https://a', score: 10 }, - Network accessline 93
vi.mocked(ftsSearchRanked).mockReturnValue([ { url: 'https://a', score: 10 }, { url: 'https://b', score: 8 }, - Network accessline 94
{ url: 'https://a', score: 10 }, - Network accessline 95
{ url: 'https://b', score: 8 }, - Network accessline 96
{ url: 'https://c', score: 5 }, - Network accessline 107
size: 3, results: [ { id: 'c', score: 0.9, metadata: { url: 'https://c', contentHash: 'hc', modelId: 'test' } }, - Network accessline 108
results: [ { id: 'c', score: 0.9, metadata: { url: 'https://c', contentHash: 'hc', modelId: 'test' } }, { id: 'd', score: 0.6, metadata: { url: 'https://d', contentHash: 'hd', modelId: 'test' } }, - Network accessline 109
{ id: 'c', score: 0.9, metadata: { url: 'https://c', contentHash: 'hc', modelId: 'test' } }, - Network accessline 110
{ id: 'd', score: 0.6, metadata: { url: 'https://d', contentHash: 'hd', modelId: 'test' } }, - Network accessline 111
{ id: 'a', score: 0.5, metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 125
expect(urls.slice(0, 2).sort()).toEqual(['https://a', 'https://c']); - Network accessline 127
expect(urls.slice(2).sort()).toEqual(['https://b', 'https://d']); - Network accessline 163
it('respects limit when hydrating fused results', async () => { vi.mocked(ftsSearchRanked).mockReturnValue([ { url: 'https://a', score: 5 }, - Network accessline 164
vi.mocked(ftsSearchRanked).mockReturnValue([ { url: 'https://a', score: 5 }, { url: 'https://b', score: 4 }, - Network accessline 165
{ url: 'https://a', score: 5 }, - Network accessline 166
{ url: 'https://b', score: 4 }, - Network accessline 167
{ url: 'https://c', score: 3 }, - Network accessline 176
size: 3, results: [ { id: 'a', score: 0.9, metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 177
results: [ { id: 'a', score: 0.9, metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, { id: 'b', score: 0.7, metadata: { url: 'https://b', contentHash: 'hb', modelId: 'test' } }, - Network accessline 178
{ id: 'a', score: 0.9, metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 179
{ id: 'b', score: 0.7, metadata: { url: 'https://b', contentHash: 'hb', modelId: 'test' } }, - Network accessline 180
{ id: 'c', score: 0.5, metadata: { url: 'https://c', contentHash: 'hc', modelId: 'test' } }, - Network accessline 192
it('skips URLs missing from the cache during hydration', async () => { vi.mocked(ftsSearchRanked).mockReturnValue([{ url: 'https://a', score: 5 }]); - Network accessline 193
vi.mocked(ftsSearchRanked).mockReturnValue([{ url: 'https://a', score: 5 }]); - Network accessline 201
size: 2, results: [ { id: 'b', score: 0.9, metadata: { url: 'https://b', contentHash: 'hb', modelId: 'test' } }, - Network accessline 202
results: [ { id: 'b', score: 0.9, metadata: { url: 'https://b', contentHash: 'hb', modelId: 'test' } }, { id: 'a', score: 0.5, metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 203
{ id: 'b', score: 0.9, metadata: { url: 'https://b', contentHash: 'hb', modelId: 'test' } }, - Network accessline 204
{ id: 'a', score: 0.5, metadata: { url: 'https://a', contentHash: 'ha', modelId: 'test' } }, - Network accessline 207
); vi.mocked(getCachedContentByNormalizedUrl).mockImplementation((url: string) => url === 'https://b' ? null : makeCachedContent({ url, normalizedUrl: url }), - Network accessline 208
vi.mocked(getCachedContentByNormalizedUrl).mockImplementation((url: string) => url === 'https://b' ? null : makeCachedContent({ url, normalizedUrl: url }), ); - Network accessline 209
url === 'https://b' ? null : makeCachedContent({ url, normalizedUrl: url }), - Network accessline 212
const out = await handleCache({ query: 'foo', mode: 'hybrid', limit: 3 }); expect(out.results!.map(r => r.url)).toEqual(['https://a']); - Network accessline 213
expect(out.results!.map(r => r.url)).toEqual(['https://a']);
tests/unit/tools/cache.test.ts
- Executable scriptline 1
Executable file - Network accessline 38
return { fetch: vi.fn().mockResolvedValue({ url: finalUrl ?? 'https://example.com', - Network accessline 39
fetch: vi.fn().mockResolvedValue({ url: finalUrl ?? 'https://example.com', finalUrl: finalUrl ?? 'https://example.com', - Network accessline 40
url: finalUrl ?? 'https://example.com', - Network accessline 41
finalUrl: finalUrl ?? 'https://example.com', - Network accessline 51
return { id: 1, url: 'https://example.com', - Network accessline 52
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 53
url: 'https://example.com', - Network accessline 54
normalizedUrl: 'https://example.com', - Network accessline 112
expect(result.results).toHaveLength(1); expect(result.results![0].url).toBe('https://example.com'); - Network accessline 113
expect(result.results![0].url).toBe('https://example.com'); - Network accessline 191
const big = (n: number) => 'word '.repeat(n).trim(); vi.mocked(searchCacheFiltered).mockReturnValue([ makeCachedContent({ url: 'https://a.example.com', markdown: big(800) }), - Network accessline 192
vi.mocked(searchCacheFiltered).mockReturnValue([ makeCachedContent({ url: 'https://a.example.com', markdown: big(800) }), makeCachedContent({ url: 'https://b.example.com', markdown: big(800) }), - Network accessline 193
makeCachedContent({ url: 'https://a.example.com', markdown: big(800) }), - Network accessline 194
makeCachedContent({ url: 'https://b.example.com', markdown: big(800) }), - Network accessline 195
makeCachedContent({ url: 'https://c.example.com', markdown: big(800) }), - Network accessline 227
{ id: 1, url: 'https://example.com/a', - Network accessline 228
id: 1, url: 'https://example.com/a', normalizedUrl: 'https://example.com/a', - Network accessline 229
url: 'https://example.com/a', - Network accessline 230
normalizedUrl: 'https://example.com/a', - Network accessline 253
expect(result.changes).toBeDefined(); expect(result.changes).toHaveLength(1); expect(result.changes![0].url).toBe('https://example.com/a'); - Network accessline 254
expect(result.changes).toHaveLength(1); expect(result.changes![0].url).toBe('https://example.com/a'); expect(result.changes![0].changed).toBe(false); - Network accessline 255
expect(result.changes![0].url).toBe('https://example.com/a'); expect(result.changes![0].changed).toBe(false); expect(router.fetch).toHaveBeenCalledWith('https://example.com/a', { renderJs: 'auto' }); - Network accessline 256
expect(result.changes![0].changed).toBe(false); expect(router.fetch).toHaveBeenCalledWith('https://example.com/a', { renderJs: 'auto' }); }); - Network accessline 257
expect(router.fetch).toHaveBeenCalledWith('https://example.com/a', { renderJs: 'auto' }); - Network accessline 262
{ id: 1, url: 'https://example.com/b', - Network accessline 263
id: 1, url: 'https://example.com/b', normalizedUrl: 'https://example.com/b', - Network accessline 264
url: 'https://example.com/b', - Network accessline 265
normalizedUrl: 'https://example.com/b', - Network accessline 298
vi.mocked(searchCacheFiltered).mockReturnValue([ { id: 1, url: 'https://a.com', normalizedUrl: 'https://a.com', - Network accessline 299
{ id: 1, url: 'https://a.com', normalizedUrl: 'https://a.com', title: 'A', markdown: 'a', rawHtml: '', metadata: '{}', - Network accessline 300
id: 1, url: 'https://a.com', normalizedUrl: 'https://a.com', - Network accessline 305
}, { id: 2, url: 'https://b.com', normalizedUrl: 'https://b.com', - Network accessline 306
{ id: 2, url: 'https://b.com', normalizedUrl: 'https://b.com', title: 'B', markdown: 'b', rawHtml: '', metadata: '{}', - Network accessline 307
id: 2, url: 'https://b.com', normalizedUrl: 'https://b.com', - Network accessline 353
vi.mocked(searchCacheFiltered).mockReturnValue([ { id: 1, url: 'https://error.com', normalizedUrl: 'https://error.com', - Network accessline 354
{ id: 1, url: 'https://error.com', normalizedUrl: 'https://error.com', title: 'Error Page', markdown: 'content', rawHtml: '', metadata: '{}', - Network accessline 355
id: 1, url: 'https://error.com', normalizedUrl: 'https://error.com', - Network accessline 391
vi.mocked(searchCacheFiltered).mockReturnValue([ { id: 1, url: 'https://example.com/c', normalizedUrl: 'https://example.com/c', - Network accessline 392
{ id: 1, url: 'https://example.com/c', normalizedUrl: 'https://example.com/c', title: 'C', markdown: 'content', rawHtml: '', metadata: '{}', - Network accessline 393
id: 1, url: 'https://example.com/c', normalizedUrl: 'https://example.com/c', - Network accessline 409
vi.mocked(searchCacheFiltered).mockReturnValue([ { id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 410
{ id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', title: 'X', markdown: 'x', rawHtml: '', metadata: '{}', - Network accessline 411
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 426
vi.mocked(searchCacheFiltered).mockReturnValue([ { id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 427
{ id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', title: 'X', markdown: 'old', rawHtml: '', metadata: '{}', - Network accessline 428
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 448
expect(vi.mocked(detectChange)).toHaveBeenCalledWith( 'https://example.com', - Network accessline 449
'https://example.com',
tests/unit/tools/crawl-map-routing.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
it('returns MapOutput shape when strategy is map', async () => { const router = createMockRouter({ 'https://example.com': htmlPage(['/page1', '/page2']), - Network accessline 34
const router = createMockRouter({ 'https://example.com': htmlPage(['/page1', '/page2']), 'https://example.com/robots.txt': 'User-agent: *\nAllow: /', - Network accessline 35
'https://example.com': htmlPage(['/page1', '/page2']), - Network accessline 36
'https://example.com/robots.txt': 'User-agent: *\nAllow: /', - Network accessline 39
const output = await handleCrawl( { url: 'https://example.com', strategy: 'map', max_depth: 1 }, - Network accessline 40
{ url: 'https://example.com', strategy: 'map', max_depth: 1 }, - Network accessline 51
it('uses HTTP-only fetch (renderJs: never) for map mode', async () => { - Network accessline 52
const router = createMockRouter({ 'https://example.com': htmlPage(['/page1']), }); - Network accessline 53
'https://example.com': htmlPage(['/page1']), - Network accessline 56
await handleCrawl( { url: 'https://example.com', strategy: 'map', max_depth: 1 }, - Network accessline 57
{ url: 'https://example.com', strategy: 'map', max_depth: 1 }, - Network accessline 68
it('passes max_depth and max_pages to mapper', async () => { const router = createMockRouter({ 'https://example.com': htmlPage( - Network accessline 69
const router = createMockRouter({ 'https://example.com': htmlPage( Array.from({ length: 50 }, (_, i) => `/p${i}`), - Network accessline 70
'https://example.com': htmlPage( - Network accessline 75
const output = await handleCrawl( { url: 'https://example.com', strategy: 'map', max_depth: 1, max_pages: 5 }, - Network accessline 76
{ url: 'https://example.com', strategy: 'map', max_depth: 1, max_pages: 5 }, - Network accessline 83
it('passes include_patterns and exclude_patterns to mapper', async () => { const router = createMockRouter({ 'https://example.com': htmlPage(['/docs/intro', '/blog/post', '/docs/api']), - Network accessline 84
const router = createMockRouter({ 'https://example.com': htmlPage(['/docs/intro', '/blog/post', '/docs/api']), }); - Network accessline 85
'https://example.com': htmlPage(['/docs/intro', '/blog/post', '/docs/api']), - Network accessline 88
const output = await handleCrawl( { url: 'https://example.com', - Network accessline 89
{ url: 'https://example.com', strategy: 'map', - Network accessline 90
url: 'https://example.com', - Network accessline 99
const urls = (output as any).urls as string[]; const nonSeed = urls.filter((u: string) => u !== 'https://example.com'); - Network accessline 100
const nonSeed = urls.filter((u: string) => u !== 'https://example.com'); - Network accessline 101
expect(nonSeed).toContain('https://example.com/docs/intro'); - Network accessline 102
expect(nonSeed).not.toContain('https://example.com/blog/post'); - Network accessline 103
expect(nonSeed).not.toContain('https://example.com/docs/api'); - Network accessline 106
it('does not invoke Crawler class for map strategy', async () => { const router = createMockRouter({ 'https://example.com': htmlPage([]), - Network accessline 107
const router = createMockRouter({ 'https://example.com': htmlPage([]), }); - Network accessline 108
'https://example.com': htmlPage([]), - Network accessline 111
const output = await handleCrawl( { url: 'https://example.com', strategy: 'map', max_depth: 1 }, - Network accessline 112
{ url: 'https://example.com', strategy: 'map', max_depth: 1 }, - Network accessline 128
const output = await handleCrawl( { url: 'https://nonexistent.example.com', strategy: 'map', max_depth: 1 }, - Network accessline 129
{ url: 'https://nonexistent.example.com', strategy: 'map', max_depth: 1 }, - Network accessline 139
const router = createMockRouter({ 'https://example.com': htmlPage(['/page1']), - Network accessline 140
'https://example.com': htmlPage(['/page1']), - Network accessline 141
'https://example.com/robots.txt': 'User-agent: *\nAllow: /', - Network accessline 147
const output = await handleCrawl( { url: 'https://example.com', strategy: 'bfs', max_depth: 1 }, - Network accessline 148
{ url: 'https://example.com', strategy: 'bfs', max_depth: 1 },
tests/unit/tools/crawl.test.ts
- Executable scriptline 1
Executable file - Network accessline 42
return { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 43
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 44
url: 'https://example.com', - Network accessline 45
finalUrl: 'https://example.com', - Network accessline 60
const mockCrawl = vi.fn().mockResolvedValue({ pages: [ { url: 'https://docs.example.com', title: 'Home', markdown: '# Home\n\nWelcome.', depth: 0 }, - Network accessline 61
pages: [ { url: 'https://docs.example.com', title: 'Home', markdown: '# Home\n\nWelcome.', depth: 0 }, { url: 'https://docs.example.com/intro', title: 'Intro', markdown: '# Intro\n\nGetting started.', depth: 1 }, - Network accessline 62
{ url: 'https://docs.example.com', title: 'Home', markdown: '# Home\n\nWelcome.', depth: 0 }, - Network accessline 63
{ url: 'https://docs.example.com/intro', title: 'Intro', markdown: '# Intro\n\nGetting started.', depth: 1 }, - Network accessline 64
{ url: 'https://docs.example.com/api', title: 'API', markdown: '# API\n\nEndpoints here.', depth: 1 }, - Network accessline 76
it('returns crawl results with defaults', async () => { const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 78
const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 90
pages: [ { url: 'https://docs.example.com', - Network accessline 91
{ url: 'https://docs.example.com', title: 'Cleared', - Network accessline 92
url: 'https://docs.example.com', - Network accessline 97
solve_method: 'auto-pass' as const, }, { url: 'https://docs.example.com/plain', title: 'Plain', markdown: '# Plain', depth: 1 }, - Network accessline 98
}, { url: 'https://docs.example.com/plain', title: 'Plain', markdown: '# Plain', depth: 1 }, ], - Network accessline 99
{ url: 'https://docs.example.com/plain', title: 'Plain', markdown: '# Plain', depth: 1 }, - Network accessline 110
const router = mockRouter(); const result = await handleCrawl({ url: 'https://docs.example.com' }, router as any) as CrawlOutput; - Network accessline 111
const result = await handleCrawl({ url: 'https://docs.example.com' }, router as any) as CrawlOutput; - Network accessline 120
it('calls deduplicatePages', async () => { const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 122
const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 130
const mockCrawl = vi.fn().mockResolvedValue({ pages: [ { url: 'https://a.com/1', title: 'P1', markdown: 'A'.repeat(60000), depth: 0 }, - Network accessline 131
pages: [ { url: 'https://a.com/1', title: 'P1', markdown: 'A'.repeat(60000), depth: 0 }, { url: 'https://a.com/2', title: 'P2', markdown: 'B'.repeat(60000), depth: 1 }, - Network accessline 132
{ url: 'https://a.com/1', title: 'P1', markdown: 'A'.repeat(60000), depth: 0 }, - Network accessline 133
{ url: 'https://a.com/2', title: 'P2', markdown: 'B'.repeat(60000), depth: 1 }, - Network accessline 134
{ url: 'https://a.com/3', title: 'P3', markdown: 'C'.repeat(60000), depth: 1 }, - Network accessline 145
const router = mockRouter(); const input: CrawlInput = { url: 'https://a.com', max_total_chars: 100000 }; - Network accessline 146
const input: CrawlInput = { url: 'https://a.com', max_total_chars: 100000 }; - Network accessline 162
const router = mockRouter(); const input: CrawlInput = { url: 'https://example.com' }; - Network accessline 163
const input: CrawlInput = { url: 'https://example.com' }; - Network accessline 180
const mockCrawl = vi.fn().mockResolvedValue({ pages: [ { url: 'https://docs.example.com', title: 'Home', markdown: longMd, depth: 0 }, - Network accessline 181
pages: [ { url: 'https://docs.example.com', title: 'Home', markdown: longMd, depth: 0 }, { url: 'https://docs.example.com/intro', title: 'Intro', markdown: longMd, depth: 1 }, - Network accessline 182
{ url: 'https://docs.example.com', title: 'Home', markdown: longMd, depth: 0 }, - Network accessline 183
{ url: 'https://docs.example.com/intro', title: 'Intro', markdown: longMd, depth: 1 }, - Network accessline 198
const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 199
const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 222
const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com', - Network accessline 223
const input: CrawlInput = { url: 'https://docs.example.com', include_full_markdown: true, - Network accessline 224
url: 'https://docs.example.com', - Network accessline 248
const mockCrawl = vi.fn().mockResolvedValue({ pages: sentinels.map((s, i) => ({ url: `https://docs.example.com/${i}`, - Network accessline 249
pages: sentinels.map((s, i) => ({ url: `https://docs.example.com/${i}`, title: s, - Network accessline 250
url: `https://docs.example.com/${i}`, - Network accessline 263
const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 264
const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 290
const mockCrawl = vi.fn().mockResolvedValue({ pages: bodies.map((md, i) => ({ url: `https://docs.example.com/p${i}`, - Network accessline 291
pages: bodies.map((md, i) => ({ url: `https://docs.example.com/p${i}`, title: `Page ${i}`, - Network accessline 292
url: `https://docs.example.com/p${i}`, - Network accessline 305
const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com', max_tokens_out: 200 }; - Network accessline 306
const input: CrawlInput = { url: 'https://docs.example.com', max_tokens_out: 200 }; - Network accessline 318
const router = mockRouter(); const input: CrawlInput = { url: 'https://docs.example.com', - Network accessline 319
const input: CrawlInput = { url: 'https://docs.example.com', include_full_markdown: false, - Network accessline 320
url: 'https://docs.example.com', - Network accessline 331
it('uses default max_total_chars of 100000', async () => { const longPages = Array.from({ length: 5 }, (_, i) => ({ url: `https://a.com/${i}`, - Network accessline 332
const longPages = Array.from({ length: 5 }, (_, i) => ({ url: `https://a.com/${i}`, title: `Page ${i}`, - Network accessline 333
url: `https://a.com/${i}`, - Network accessline 344
const router = mockRouter(); const input: CrawlInput = { url: 'https://a.com' }; - Network accessline 345
const input: CrawlInput = { url: 'https://a.com' };
tests/unit/tools/diff.test.ts
- Executable scriptline 1
Executable file - Network accessline 199
it('reads cached markdown when old.url is supplied', async () => { vi.mocked(getCachedContent).mockImplementation((url: string) => { if (url === 'https://example.com/a') { - Network accessline 200
vi.mocked(getCachedContent).mockImplementation((url: string) => { if (url === 'https://example.com/a') { return { - Network accessline 201
if (url === 'https://example.com/a') { - Network accessline 203
id: 1, url, normalizedUrl: 'https://example.com/a', - Network accessline 204
url, normalizedUrl: 'https://example.com/a', title: 'a', - Network accessline 205
normalizedUrl: 'https://example.com/a', - Network accessline 223
const r = await handleDiff({ old: { url: 'https://example.com/a' }, - Network accessline 224
old: { url: 'https://example.com/a' }, - Network accessline 241
vi.mocked(getCachedContent).mockReturnValue(null); const r = await handleDiff({ old: { url: 'https://example.com/uncached' }, - Network accessline 242
const r = await handleDiff({ old: { url: 'https://example.com/uncached' }, new: { markdown: 'something\n' }, - Network accessline 243
old: { url: 'https://example.com/uncached' }, - Network accessline 248
if (!r.ok) { expect(r.error).toBe('cache_miss'); expect(r.error_reason).toContain('https://example.com/uncached'); - Network accessline 249
expect(r.error).toBe('cache_miss'); expect(r.error_reason).toContain('https://example.com/uncached'); } - Network accessline 250
expect(r.error_reason).toContain('https://example.com/uncached'); - Network accessline 290
vi.mocked(getCachedContent).mockReturnValue({ id: 1, url: 'https://example.com/stale', - Network accessline 291
id: 1, url: 'https://example.com/stale', normalizedUrl: 'https://example.com/stale', - Network accessline 292
url: 'https://example.com/stale', - Network accessline 293
normalizedUrl: 'https://example.com/stale', - Network accessline 306
vi.mocked(isExpired).mockReturnValue(true); const r = await handleDiff({ old: { url: 'https://example.com/stale' }, - Network accessline 307
const r = await handleDiff({ old: { url: 'https://example.com/stale' }, new: { markdown: 'something\n' }, - Network accessline 308
old: { url: 'https://example.com/stale' },
tests/unit/tools/extract.body-retained.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
return { fetch: async () => ({ url: 'https://example.com/article', - Network accessline 13
fetch: async () => ({ url: 'https://example.com/article', finalUrl: 'https://example.com/article', - Network accessline 14
url: 'https://example.com/article', - Network accessline 15
finalUrl: 'https://example.com/article', - Network accessline 45
const result = await handleExtract( { url: 'https://example.com/article', mode: 'schema', named_schema: 'Article', max_tokens_out: 400 }, - Network accessline 46
{ url: 'https://example.com/article', mode: 'schema', named_schema: 'Article', max_tokens_out: 400 },
tests/unit/tools/extract.test.ts
- Executable scriptline 1
Executable file - Network accessline 44
return { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 45
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 46
url: 'https://example.com', - Network accessline 47
finalUrl: 'https://example.com', - Network accessline 97
const __r_result = await handleExtract({ url: 'https://example.com' }, router);; - Network accessline 100
expect(router.fetch).toHaveBeenCalledWith('https://example.com', expect.any(Object)); - Network accessline 101
expect(result.source_url).toBe('https://example.com'); - Network accessline 122
await handleExtract( { url: 'https://example.com', html: '<html>ignored</html>' }, - Network accessline 123
{ url: 'https://example.com', html: '<html>ignored</html>' }, - Network accessline 131
vi.mocked(getCachedContent).mockReturnValue({ id: 1, url: 'https://example.com', - Network accessline 132
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 133
url: 'https://example.com', - Network accessline 134
normalizedUrl: 'https://example.com', - Network accessline 151
await handleExtract({ url: 'https://example.com' }, router); - Network accessline 160
vi.mocked(getCachedContent).mockReturnValue({ id: 1, url: 'https://example.com', - Network accessline 161
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 162
url: 'https://example.com', - Network accessline 163
normalizedUrl: 'https://example.com', - Network accessline 180
const __r_result = await handleExtract({ url: 'https://example.com' }, router);; - Network accessline 267
const __r_result = await handleExtract({ url: 'https://example.com/broken' }, router);; - Network accessline 338
const __r_output = await handleExtract({ url: 'https://example.com/product', - Network accessline 339
url: 'https://example.com/product', - Network accessline 345
expect(router.fetch).toHaveBeenCalledWith('https://example.com/product', expect.any(Object)); - Network accessline 346
expect(output.source_url).toBe('https://example.com'); - Network accessline 376
const router = mockRouter(); const __r_out = await handleExtract( { url: 'https://example.com', mode: 'tables' } as any, - Network accessline 377
const __r_out = await handleExtract( { url: 'https://example.com', mode: 'tables' } as any, router as any, - Network accessline 378
{ url: 'https://example.com', mode: 'tables' } as any, - Network accessline 406
const __r_out = await handleExtract( { url: 'https://js-page.test/', mode: 'tables', execution_mode: 'stealth' } as any, - Network accessline 407
{ url: 'https://js-page.test/', mode: 'tables', execution_mode: 'stealth' } as any, - Network accessline 412
expect(getCachedContent).not.toHaveBeenCalled(); expect(router.fetch).not.toHaveBeenCalled(); expect(fetchWithPlaywright).toHaveBeenCalledWith('https://js-page.test/'); - Network accessline 413
expect(router.fetch).not.toHaveBeenCalled(); expect(fetchWithPlaywright).toHaveBeenCalledWith('https://js-page.test/'); expect(Array.isArray(out.data)).toBe(true); - Network accessline 414
expect(fetchWithPlaywright).toHaveBeenCalledWith('https://js-page.test/');
tests/unit/tools/fetch-embedding.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', - Network accessline 54
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 55
url: 'https://example.com', - Network accessline 56
finalUrl: 'https://example.com', - Network accessline 76
await handleFetch({ url: 'https://example.com' }, mockRouter); - Network accessline 78
expect(embeddingService.embedAsync).toHaveBeenCalledWith( 'https://example.com', - Network accessline 79
'https://example.com', - Network accessline 88
await handleFetch({ url: 'https://example.com' }, mockRouter); - Network accessline 100
await handleFetch({ url: 'https://error.com' }, failRouter); - Network accessline 111
const start = Date.now(); await handleFetch({ url: 'https://example.com' }, mockRouter); - Network accessline 112
await handleFetch({ url: 'https://example.com' }, mockRouter); - Network accessline 121
vi.mocked(getCachedContent).mockReturnValue({ id: 1, url: 'https://cached.com', - Network accessline 122
id: 1, url: 'https://cached.com', normalizedUrl: 'https://cached.com', - Network accessline 123
url: 'https://cached.com', - Network accessline 124
normalizedUrl: 'https://cached.com', - Network accessline 140
await handleFetch({ url: 'https://cached.com' }, mockRouter);
tests/unit/tools/fetch-mode.test.ts
- Executable scriptline 1
Executable file - Network accessline 43
const router = { fetch: vi.fn() } as unknown as SmartRouter; await expect( handleFetch({ url: 'https://example.com', mode: 'turbo' as 'cache' }, router), - Network accessline 44
await expect( handleFetch({ url: 'https://example.com', mode: 'turbo' as 'cache' }, router), ).rejects.toThrow(/Invalid mode/i); - Network accessline 45
handleFetch({ url: 'https://example.com', mode: 'turbo' as 'cache' }, router), - Network accessline 57
const __r_out = await handleFetch({ url: 'https://example.com/', mode: 'fast' }, router);; - Network accessline 65
it('serves stale cache (within 24h window) without calling router and marks stale=true', async () => { cacheContent(makeRaw('https://stale.test/'), makeExtraction()); - Network accessline 66
cacheContent(makeRaw('https://stale.test/'), makeExtraction()); - Network accessline 69
const router = { fetch: vi.fn() } as unknown as SmartRouter; const __r_out = await handleFetch({ url: 'https://stale.test/', mode: 'fast' }, router);; - Network accessline 70
const __r_out = await handleFetch({ url: 'https://stale.test/', mode: 'fast' }, router);; - Network accessline 79
it('balanced mode rejects the same stale row and refetches via router', async () => { cacheContent(makeRaw('https://stale.test/'), makeExtraction()); - Network accessline 80
cacheContent(makeRaw('https://stale.test/'), makeExtraction()); - Network accessline 83
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://stale.test/', - Network accessline 84
fetch: vi.fn().mockResolvedValue({ url: 'https://stale.test/', finalUrl: 'https://stale.test/', - Network accessline 85
url: 'https://stale.test/', - Network accessline 86
finalUrl: 'https://stale.test/', - Network accessline 95
const __r_out = await handleFetch({ url: 'https://stale.test/', mode: 'balanced' }, router);; - Network accessline 109
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://spa.test/', - Network accessline 110
fetch: vi.fn().mockResolvedValue({ url: 'https://spa.test/', finalUrl: 'https://spa.test/', - Network accessline 111
url: 'https://spa.test/', - Network accessline 112
finalUrl: 'https://spa.test/', - Network accessline 119
}), } as unknown as SmartRouter; const __r_out = await handleFetch({ url: 'https://spa.test/' }, router);; - Network accessline 120
} as unknown as SmartRouter; const __r_out = await handleFetch({ url: 'https://spa.test/' }, router);; const out = __r_out.ok ? __r_out.data : ({ ...__r_out } as any); - Network accessline 121
const __r_out = await handleFetch({ url: 'https://spa.test/' }, router);;
tests/unit/tools/fetch.challenge-provenance.test.ts
- Executable scriptline 1
Executable file - Network accessline 47
solve_method: null, }; const res = await handleFetch({ url: 'https://blocked.example/x' }, routerReturning(blocked)); - Network accessline 48
}; const res = await handleFetch({ url: 'https://blocked.example/x' }, routerReturning(blocked)); expect(res.ok).toBe(false); - Network accessline 49
const res = await handleFetch({ url: 'https://blocked.example/x' }, routerReturning(blocked)); - Network accessline 58
it('cleared via auto-pass: challenge_class:interactive + solve_method:auto-pass on the success result', async () => { const cleared: RawFetchResult = { url: 'https://cleared.example/x', - Network accessline 59
const cleared: RawFetchResult = { url: 'https://cleared.example/x', finalUrl: 'https://cleared.example/x', - Network accessline 60
url: 'https://cleared.example/x', - Network accessline 61
finalUrl: 'https://cleared.example/x', - Network accessline 68
solve_method: 'auto-pass', }; const res = await handleFetch({ url: 'https://cleared.example/x' }, routerReturning(cleared)); - Network accessline 69
}; const res = await handleFetch({ url: 'https://cleared.example/x' }, routerReturning(cleared)); expect(res.ok).toBe(true); - Network accessline 70
const res = await handleFetch({ url: 'https://cleared.example/x' }, routerReturning(cleared)); - Network accessline 78
it('plain fetch (no challenge): challenge_class / solve_method absent', async () => { - Network accessline 79
const plain: RawFetchResult = { url: 'https://plain.example/x', finalUrl: 'https://plain.example/x', - Network accessline 80
url: 'https://plain.example/x', - Network accessline 81
finalUrl: 'https://plain.example/x', - Network accessline 86
headers: {}, }; const res = await handleFetch({ url: 'https://plain.example/x' }, routerReturning(plain)); - Network accessline 87
}; const res = await handleFetch({ url: 'https://plain.example/x' }, routerReturning(plain)); expect(res.ok).toBe(true); - Network accessline 88
const res = await handleFetch({ url: 'https://plain.example/x' }, routerReturning(plain));
tests/unit/tools/fetch.http-error.test.ts
- Executable scriptline 1
Executable file - Network accessline 13
return { fetch: async () => ({ url: 'https://raw.githubusercontent.com/foo/bar/main/README.md', - Network accessline 14
fetch: async () => ({ url: 'https://raw.githubusercontent.com/foo/bar/main/README.md', finalUrl: 'https://raw.githubusercontent.com/foo/bar/main/README.md', - Network accessline 15
url: 'https://raw.githubusercontent.com/foo/bar/main/README.md', - Network accessline 16
finalUrl: 'https://raw.githubusercontent.com/foo/bar/main/README.md', - Network accessline 32
}); const result = await handleFetch( { url: 'https://raw.githubusercontent.com/foo/bar/main/README.md', force_refresh: true }, - Network accessline 33
const result = await handleFetch( { url: 'https://raw.githubusercontent.com/foo/bar/main/README.md', force_refresh: true }, router, - Network accessline 34
{ url: 'https://raw.githubusercontent.com/foo/bar/main/README.md', force_refresh: true }, - Network accessline 49
}); const result = await handleFetch( { url: 'https://example.com/missing', force_refresh: true }, - Network accessline 50
const result = await handleFetch( { url: 'https://example.com/missing', force_refresh: true }, router, - Network accessline 51
{ url: 'https://example.com/missing', force_refresh: true },
tests/unit/tools/fetch.silent-failures.test.ts
- Executable scriptline 1
Executable file - Network accessline 34
function makeRouter(overrides: Partial<RawFetchResult> = {}): { fetch: ReturnType<typeof vi.fn> } { const defaults: RawFetchResult = { url: 'https://example.com', - Network accessline 35
const defaults: RawFetchResult = { url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 36
url: 'https://example.com', - Network accessline 37
finalUrl: 'https://example.com', - Network accessline 71
extractMock.mockResolvedValue(makeExtraction()); const router = makeRouter({ statusCode: 200 }); const input: FetchInput = { url: 'https://example.com', force_refresh: true }; - Network accessline 73
const input: FetchInput = { url: 'https://example.com', force_refresh: true }; - Network accessline 89
html: '<html><body><h1>Page not found</h1></body></html>', }); const input: FetchInput = { url: 'https://example.com/missing', force_refresh: true }; - Network accessline 91
const input: FetchInput = { url: 'https://example.com/missing', force_refresh: true }; - Network accessline 107
html: '<html><body><h1>Server error</h1></body></html>', }); const input: FetchInput = { url: 'https://example.com/oops', force_refresh: true }; - Network accessline 109
const input: FetchInput = { url: 'https://example.com/oops', force_refresh: true }; - Network accessline 136
}); const r = await handleFetch( { url: 'https://example.com/gone', force_refresh: true } as FetchInput, - Network accessline 137
const r = await handleFetch( { url: 'https://example.com/gone', force_refresh: true } as FetchInput, router as never, - Network accessline 138
{ url: 'https://example.com/gone', force_refresh: true } as FetchInput, - Network accessline 177
const r = await handleFetch( { url: 'https://blocked.example.com/x', force_refresh: true } as FetchInput, - Network accessline 178
{ url: 'https://blocked.example.com/x', force_refresh: true } as FetchInput, - Network accessline 197
const r = await handleFetch( { url: 'https://blocked.example.com/y', force_refresh: true } as FetchInput, - Network accessline 198
{ url: 'https://blocked.example.com/y', force_refresh: true } as FetchInput, - Network accessline 220
vi.mocked(getCachedContent).mockReturnValue({ id: 1, url: 'https://example.com', - Network accessline 221
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 222
url: 'https://example.com', - Network accessline 223
normalizedUrl: 'https://example.com', - Network accessline 238
const router = makeRouter(); const input: FetchInput = { url: 'https://example.com', - Network accessline 239
const input: FetchInput = { url: 'https://example.com', section: 'NoSuchSection', - Network accessline 240
url: 'https://example.com', - Network accessline 269
const router = makeRouter(); const input: FetchInput = { url: 'https://example.com', - Network accessline 270
const input: FetchInput = { url: 'https://example.com', section: 'Nope', - Network accessline 271
url: 'https://example.com',
tests/unit/tools/fetch.stealth-cache-bypass.test.ts
- Executable scriptline 1
Executable file - Network accessline 15
httpStatus: number; } = { url: 'https://blocked.test/', - Network accessline 16
} = { url: 'https://blocked.test/', title: 'Access Denied', - Network accessline 17
url: 'https://blocked.test/', - Network accessline 41
return { fetch: vi.fn().mockResolvedValue({ url: 'https://blocked.test/', - Network accessline 42
fetch: vi.fn().mockResolvedValue({ url: 'https://blocked.test/', finalUrl: 'https://blocked.test/', - Network accessline 43
url: 'https://blocked.test/', - Network accessline 44
finalUrl: 'https://blocked.test/', - Network accessline 64
it('does NOT serve the cached error body when mode=stealth — goes to live fetch', async () => { const router = liveRouter(); const result = await handleFetch({ url: 'https://blocked.test/', mode: 'stealth' }, router); - Network accessline 66
const result = await handleFetch({ url: 'https://blocked.test/', mode: 'stealth' }, router); - Network accessline 78
it('negative: stealth never surfaces the cached 403 title/body', async () => { const router = liveRouter(); const result = await handleFetch({ url: 'https://blocked.test/', mode: 'stealth' }, router); - Network accessline 79
const router = liveRouter(); const result = await handleFetch({ url: 'https://blocked.test/', mode: 'stealth' }, router); expect(result.ok).toBe(true); - Network accessline 80
const result = await handleFetch({ url: 'https://blocked.test/', mode: 'stealth' }, router); - Network accessline 88
it('no regression: mode=default (no force_refresh) STILL serves the same usable cached row', async () => { const router = liveRouter(); const result = await handleFetch({ url: 'https://blocked.test/', mode: 'default' }, router); - Network accessline 90
const result = await handleFetch({ url: 'https://blocked.test/', mode: 'default' }, router);
tests/unit/tools/fetch.test.ts
- Executable scriptline 1
Executable file - Network accessline 49
function mockRouter(result?: Partial<RawFetchResult>) { const defaults: RawFetchResult = { url: 'https://example.com', - Network accessline 50
const defaults: RawFetchResult = { url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 51
url: 'https://example.com', - Network accessline 52
finalUrl: 'https://example.com', - Network accessline 66
return { id: 1, url: 'https://example.com', - Network accessline 67
id: 1, url: 'https://example.com', normalizedUrl: 'https://example.com', - Network accessline 68
url: 'https://example.com', - Network accessline 69
normalizedUrl: 'https://example.com', - Network accessline 72
rawHtml: '<html></html>', metadata: JSON.stringify({ description: 'cached' }), links: JSON.stringify(['https://example.com/link']), - Network accessline 73
metadata: JSON.stringify({ description: 'cached' }), links: JSON.stringify(['https://example.com/link']), images: JSON.stringify(['https://example.com/img.png']), - Network accessline 74
links: JSON.stringify(['https://example.com/link']), - Network accessline 75
images: JSON.stringify(['https://example.com/img.png']), - Network accessline 88
markdown: '# Hello\n\nContent from extraction.', metadata: { description: 'test' }, links: ['https://example.com/link'], - Network accessline 89
metadata: { description: 'test' }, links: ['https://example.com/link'], images: ['https://example.com/img.png'], - Network accessline 90
links: ['https://example.com/link'], - Network accessline 91
images: ['https://example.com/img.png'], - Network accessline 107
it('rejects localhost URL with out-of-range port with an "invalid port" message', async () => { const router = mockRouter(); const r = await handleFetch({ url: 'http://localhost:99999/x' }, router); - Network accessline 108
const router = mockRouter(); const r = await handleFetch({ url: 'http://localhost:99999/x' }, router); expect(r.ok).toBe(false); - Network accessline 109
const r = await handleFetch({ url: 'http://localhost:99999/x' }, router); - Network accessline 117
it('rejects localhost URL with non-numeric port with an "invalid port" message', async () => { const router = mockRouter(); const r = await handleFetch({ url: 'http://localhost:abc/x' }, router); - Network accessline 118
const router = mockRouter(); const r = await handleFetch({ url: 'http://localhost:abc/x' }, router); expect(r.ok).toBe(false); - Network accessline 119
const r = await handleFetch({ url: 'http://localhost:abc/x' }, router); - Network accessline 127
const extraction = makeExtraction(); extractMock.mockResolvedValue(extraction); const router = mockRouter({ url: 'http://localhost:3000', finalUrl: 'http://localhost:3000' }); - Network accessline 129
const router = mockRouter({ url: 'http://localhost:3000', finalUrl: 'http://localhost:3000' }); - Network accessline 131
const r = await handleFetch({ url: 'http://localhost:3000/x' }, router); - Network accessline 149
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', include_full_markdown: true }; - Network accessline 150
const input: FetchInput = { url: 'https://example.com', include_full_markdown: true }; - Network accessline 155
expect(result.url).toBe('https://example.com'); - Network accessline 167
contentCompleteness: { level: 'shell', reason: 'app_shell', settled_by: 'budget' }, }); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 169
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 184
const router = mockRouter({ method: 'http' }); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 185
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 211
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', include_full_markdown: true }; - Network accessline 212
const input: FetchInput = { url: 'https://example.com', include_full_markdown: true }; - Network accessline 229
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 230
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 244
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', - Network accessline 245
const input: FetchInput = { url: 'https://example.com', section: 'Installation', - Network accessline 246
url: 'https://example.com', - Network accessline 272
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', section: 'Install', include_full_markdown: true }; - Network accessline 273
const input: FetchInput = { url: 'https://example.com', section: 'Install', include_full_markdown: true }; - Network accessline 288
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', max_chars: 100, include_full_markdown: true }; - Network accessline 289
const input: FetchInput = { url: 'https://example.com', max_chars: 100, include_full_markdown: true }; - Network accessline 307
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', max_chars: 50 }; - Network accessline 308
const input: FetchInput = { url: 'https://example.com', max_chars: 50 }; - Network accessline 320
const input: FetchInput = { url: 'https://example.com/broken' }; - Network accessline 334
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 349
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 350
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 362
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 363
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 382
const router = mockRouter(); const result = await handleFetch({ url: 'https://example.com', - Network accessline 383
const result = await handleFetch({ url: 'https://example.com', section: 'Per-server filtering', - Network accessline 384
url: 'https://example.com', - Network accessline 397
); expect(vi.mocked(detectChange)).toHaveBeenCalledWith( 'https://example.com', - Network accessline 398
expect(vi.mocked(detectChange)).toHaveBeenCalledWith( 'https://example.com', fullMarkdown, - Network accessline 399
'https://example.com', - Network accessline 420
it('caps links and images when max_content_chars is tight', async () => { const manyLinks = Array.from({ length: 500 }, (_, i) => `https://example.com/link-${i}`); - Network accessline 421
const manyLinks = Array.from({ length: 500 }, (_, i) => `https://example.com/link-${i}`); - Network accessline 422
const manyImages = Array.from({ length: 500 }, (_, i) => `https://example.com/img-${i}.png`); - Network accessline 429
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', max_content_chars: 1500 }; - Network accessline 430
const input: FetchInput = { url: 'https://example.com', max_content_chars: 1500 }; - Network accessline 439
it('also caps links/images on cached path when max_content_chars is set', async () => { const manyLinks = Array.from({ length: 500 }, (_, i) => `https://example.com/link-${i}`); - Network accessline 440
const manyLinks = Array.from({ length: 500 }, (_, i) => `https://example.com/link-${i}`); - Network accessline 448
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', max_content_chars: 1500 }; - Network accessline 449
const input: FetchInput = { url: 'https://example.com', max_content_chars: 1500 }; - Network accessline 458
it('leaves links/images alone when max_content_chars is not set', async () => { const manyLinks = Array.from({ length: 200 }, (_, i) => `https://example.com/link-${i}`); - Network accessline 459
const manyLinks = Array.from({ length: 200 }, (_, i) => `https://example.com/link-${i}`); - Network accessline 465
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 466
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 489
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', force_refresh: true, include_full_markdown: true }; - Network accessline 490
const input: FetchInput = { url: 'https://example.com', force_refresh: true, include_full_markdown: true }; - Network accessline 503
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', force_refresh: true }; - Network accessline 504
const input: FetchInput = { url: 'https://example.com', force_refresh: true }; - Network accessline 516
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', force_refresh: false }; - Network accessline 517
const input: FetchInput = { url: 'https://example.com', force_refresh: false }; - Network accessline 531
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 532
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 559
const router = mockRouter(); const r = await handleFetch({ url: 'https://example.com', include_full_markdown: true }, router); - Network accessline 560
const r = await handleFetch({ url: 'https://example.com', include_full_markdown: true }, router); - Network accessline 571
const router1 = mockRouter(); const withFull = await handleFetch( { url: 'https://example.com', include_full_markdown: true }, - Network accessline 572
const withFull = await handleFetch( { url: 'https://example.com', include_full_markdown: true }, router1, - Network accessline 573
{ url: 'https://example.com', include_full_markdown: true }, - Network accessline 576
const router2 = mockRouter(); const withoutFull = await handleFetch( { url: 'https://example.com', include_full_markdown: false }, - Network accessline 577
const withoutFull = await handleFetch( { url: 'https://example.com', include_full_markdown: false }, router2, - Network accessline 578
{ url: 'https://example.com', include_full_markdown: false }, - Network accessline 597
const routerA = mockRouter(); const budgeted = await handleFetch( { url: 'https://example.com', include_full_markdown: true, max_tokens_out: 50 }, - Network accessline 598
const budgeted = await handleFetch( { url: 'https://example.com', include_full_markdown: true, max_tokens_out: 50 }, routerA, - Network accessline 599
{ url: 'https://example.com', include_full_markdown: true, max_tokens_out: 50 }, - Network accessline 602
const routerB = mockRouter(); const unbudgeted = await handleFetch( { url: 'https://example.com', include_full_markdown: true }, - Network accessline 603
const unbudgeted = await handleFetch( { url: 'https://example.com', include_full_markdown: true }, routerB, - Network accessline 604
{ url: 'https://example.com', include_full_markdown: true }, - Network accessline 622
const router = mockRouter(); const r = await handleFetch({ url: 'https://example.com' }, router); - Network accessline 623
const r = await handleFetch({ url: 'https://example.com' }, router); - Network accessline 645
{ type: 'wait' as const, ms: 300 }, ]; const input: FetchInput = { url: 'https://example.com', actions }; - Network accessline 647
const input: FetchInput = { url: 'https://example.com', actions }; - Network accessline 651
expect(router.fetch).toHaveBeenCalledWith('https://example.com', expect.objectContaining({ actions })); - Network accessline 660
const router = mockRouter({ actionResults }); const input: FetchInput = { url: 'https://example.com', - Network accessline 661
const input: FetchInput = { url: 'https://example.com', actions: [{ type: 'click', selector: '.btn' }, { type: 'wait', ms: 100 }], - Network accessline 662
url: 'https://example.com', - Network accessline 675
extractMock.mockResolvedValue(makeExtraction()); const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 677
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 691
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', - Network accessline 692
const input: FetchInput = { url: 'https://example.com', actions: [{ type: 'click', selector: '.btn' }], - Network accessline 693
url: 'https://example.com', - Network accessline 708
const input: FetchInput = { url: 'https://example.com', - Network accessline 709
url: 'https://example.com', - Network accessline 725
const router = mockRouter({ actionResults }); const input: FetchInput = { url: 'https://example.com', - Network accessline 726
const input: FetchInput = { url: 'https://example.com', actions: [{ type: 'screenshot' }], - Network accessline 727
url: 'https://example.com', - Network accessline 739
extractMock.mockResolvedValue(makeExtraction()); const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', actions: [] }; - Network accessline 741
const input: FetchInput = { url: 'https://example.com', actions: [] }; - Network accessline 763
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com/page' }; - Network accessline 764
const input: FetchInput = { url: 'https://example.com/page' }; - Network accessline 785
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com/page' }; - Network accessline 786
const input: FetchInput = { url: 'https://example.com/page' }; - Network accessline 800
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com/page' }; - Network accessline 801
const input: FetchInput = { url: 'https://example.com/page' }; - Network accessline 816
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 817
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 830
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 831
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 852
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', include_full_markdown: true }; - Network accessline 853
const input: FetchInput = { url: 'https://example.com', include_full_markdown: true }; - Network accessline 877
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 878
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 888
it('returns changed=false for first-time fetch (no prior cache)', async () => { - Network accessline 892
const router = mockRouter(); const input: FetchInput = { url: 'https://brand-new-site.com' }; - Network accessline 893
const input: FetchInput = { url: 'https://brand-new-site.com' }; - Network accessline 917
extractMock.mockResolvedValue(makeExtraction({ markdown: longMarkdown })); const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 919
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 933
extractMock.mockResolvedValue(makeExtraction({ markdown: longMarkdown })); const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 935
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 945
extractMock.mockResolvedValue(makeExtraction({ markdown: longMarkdown })); const router = mockRouter(); const input: FetchInput = { url: 'https://example.com', include_full_markdown: false }; - Network accessline 947
const input: FetchInput = { url: 'https://example.com', include_full_markdown: false }; - Network accessline 960
const router = mockRouter(); const input: FetchInput = { url: 'https://example.com' }; - Network accessline 961
const input: FetchInput = { url: 'https://example.com' };
tests/unit/tools/find-similar.test.ts
- Executable scriptline 1
Executable file - Network accessline 33
{ title: 'Web Result', url: 'https://web.example.com/1', - Network accessline 34
title: 'Web Result', url: 'https://web.example.com/1', snippet: 'A web result', - Network accessline 35
url: 'https://web.example.com/1', - Network accessline 43
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/page', - Network accessline 44
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/page', finalUrl: 'https://example.com/page', - Network accessline 45
url: 'https://example.com/page', - Network accessline 46
finalUrl: 'https://example.com/page', - Network accessline 99
it('returns FindSimilarOutput shape for url input', async () => { const __r_result = await handleFindSimilar( { url: 'https://example.com/page' }, - Network accessline 100
const __r_result = await handleFindSimilar( { url: 'https://example.com/page' }, [mockEngine], - Network accessline 101
{ url: 'https://example.com/page' }, - Network accessline 217
const r = await handleFindSimilar( { url: 'http://169.254.169.254/latest/meta-data/' }, - Network accessline 218
{ url: 'http://169.254.169.254/latest/meta-data/' }, - Network accessline 277
cacheContent( { url: 'https://cached.example.com/page', - Network accessline 278
{ url: 'https://cached.example.com/page', finalUrl: 'https://cached.example.com/page', - Network accessline 279
url: 'https://cached.example.com/page', - Network accessline 280
finalUrl: 'https://cached.example.com/page', - Network accessline 326
cacheContent( { url: 'https://cached2.example.com/page', - Network accessline 327
{ url: 'https://cached2.example.com/page', finalUrl: 'https://cached2.example.com/page', - Network accessline 328
url: 'https://cached2.example.com/page', - Network accessline 329
finalUrl: 'https://cached2.example.com/page', - Network accessline 364
const handleSearchSpy = vi.spyOn(search, 'handleSearch').mockResolvedValue({ results: [ { url: 'https://a.example.com/1', title: 'A', snippet: 'aa', relevance_score: 1, engines: ['mock'] }, - Network accessline 365
results: [ { url: 'https://a.example.com/1', title: 'A', snippet: 'aa', relevance_score: 1, engines: ['mock'] }, { url: 'https://b.example.com/2', title: 'B', snippet: 'bb', relevance_score: 0.9, engines: ['mock'] }, - Network accessline 366
{ url: 'https://a.example.com/1', title: 'A', snippet: 'aa', relevance_score: 1, engines: ['mock'] }, - Network accessline 367
{ url: 'https://b.example.com/2', title: 'B', snippet: 'bb', relevance_score: 0.9, engines: ['mock'] }, - Network accessline 368
{ url: 'https://c.example.com/3', title: 'C', snippet: 'cc', relevance_score: 0.8, engines: ['mock'] }, - Network accessline 375
const __r_out = await handleFindSimilar( { url: 'https://example.com/post-title' }, - Network accessline 376
{ url: 'https://example.com/post-title' }, - Network accessline 395
const __r_out = await handleFindSimilar( { url: 'https://example.com/post-title' }, - Network accessline 396
{ url: 'https://example.com/post-title' },
tests/unit/tools/max-tokens-out.test.ts
- Executable scriptline 1
Executable file - Network accessline 101
{ title: 'Async Deep Dive', url: 'https://rust.example.com/async', - Network accessline 102
title: 'Async Deep Dive', url: 'https://rust.example.com/async', snippet: 'Async functions return lazy futures evaluated by an executor.', - Network accessline 103
url: 'https://rust.example.com/async', - Network accessline 108
{ title: 'Tokio Internals', url: 'https://tokio.example.com/internals', - Network accessline 109
title: 'Tokio Internals', url: 'https://tokio.example.com/internals', snippet: 'Tokio provides a multi-threaded scheduler for async tasks.', - Network accessline 110
url: 'https://tokio.example.com/internals', - Network accessline 154
it('fetch: max_tokens_out wins over max_chars when both set', async () => { const input: FetchInput = { url: 'https://example.com', - Network accessline 155
const input: FetchInput = { url: 'https://example.com', include_full_markdown: true, - Network accessline 156
url: 'https://example.com', - Network accessline 200
it('crawl: total page-body tokens stay under budget when include_full_markdown=true', async () => { const input: CrawlInput = { url: 'https://docs.example.com', - Network accessline 201
const input: CrawlInput = { url: 'https://docs.example.com', strategy: 'bfs', - Network accessline 202
url: 'https://docs.example.com',
tests/unit/tools/research.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
name: 'test-stub', search: vi.fn().mockResolvedValue([ { title: 'Article 1', url: 'https://example.com/1', snippet: 'Content 1', relevance_score: 0.9, engine: 'test-stub' }, - Network accessline 31
search: vi.fn().mockResolvedValue([ { title: 'Article 1', url: 'https://example.com/1', snippet: 'Content 1', relevance_score: 0.9, engine: 'test-stub' }, { title: 'Article 2', url: 'https://example.com/2', snippet: 'Content 2', rel - Network accessline 32
{ title: 'Article 1', url: 'https://example.com/1', snippet: 'Content 1', relevance_score: 0.9, engine: 'test-stub' }, - Network accessline 33
{ title: 'Article 2', url: 'https://example.com/2', snippet: 'Content 2', relevance_score: 0.8, engine: 'test-stub' }, - Network accessline 37
const stubRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', - Network accessline 38
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', finalUrl: 'https://example.com/1', - Network accessline 39
url: 'https://example.com/1', - Network accessline 40
finalUrl: 'https://example.com/1',
tests/unit/tools/search-answer.test.ts
- Executable scriptline 1
Executable file - Network accessline 53
{ title: 'React Hooks', url: 'https://react.dev/hooks', - Network accessline 54
title: 'React Hooks', url: 'https://react.dev/hooks', snippet: 'Hooks let you use state.', - Network accessline 55
url: 'https://react.dev/hooks', - Network accessline 60
{ title: 'Vue API', url: 'https://vuejs.org/api', - Network accessline 61
title: 'Vue API', url: 'https://vuejs.org/api', snippet: 'The Composition API.', - Network accessline 62
url: 'https://vuejs.org/api', - Network accessline 70
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev/hooks', - Network accessline 71
fetch: vi.fn().mockResolvedValue({ url: 'https://react.dev/hooks', finalUrl: 'https://react.dev/hooks', - Network accessline 72
url: 'https://react.dev/hooks', - Network accessline 73
finalUrl: 'https://react.dev/hooks',
tests/unit/tools/search-cache-embed.test.ts
- Executable scriptline 1
Executable file - Network accessline 51
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, - Network accessline 52
search: vi.fn().mockResolvedValue([ { title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, ] satisfies RawSearchResult[]), - Network accessline 53
{ title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, - Network accessline 57
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 58
fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', html: '<html></html>', contentType: 'text/html', statusCode: 200, - Network accessline 59
url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 90
await handleSearch(input, [engine], router); expect(embedAsyncMock).toHaveBeenCalledWith( 'https://e.com/1', - Network accessline 91
expect(embedAsyncMock).toHaveBeenCalledWith( 'https://e.com/1', expect.stringContaining('Topic'), - Network accessline 92
'https://e.com/1',
tests/unit/tools/search-filtering.test.ts
- Executable scriptline 1
Executable file - Network accessline 116
it('filters results by include_domains in pipeline', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/docs'), - Network accessline 117
const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/docs'), makeResult('bing', 'https://medium.com/react'), - Network accessline 118
makeResult('bing', 'https://react.dev/docs'), - Network accessline 119
makeResult('bing', 'https://medium.com/react'), - Network accessline 120
makeResult('bing', 'https://github.com/react'), - Network accessline 136
it('filters results by exclude_domains in pipeline', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/docs'), - Network accessline 137
const eng = makeEntry('bing', [ makeResult('bing', 'https://react.dev/docs'), makeResult('bing', 'https://medium.com/react'), - Network accessline 138
makeResult('bing', 'https://react.dev/docs'), - Network accessline 139
makeResult('bing', 'https://medium.com/react'), - Network accessline 164
const codeEng = makeEntry('github-code', [ makeResult('github-code', 'https://github.com/x/y'), - Network accessline 165
makeResult('github-code', 'https://github.com/x/y'), - Network accessline 166
makeResult('github-code', 'https://github.com/x/z'), - Network accessline 167
makeResult('github-code', 'https://github.com/x/w'), - Network accessline 168
makeResult('github-code', 'https://github.com/x/v'), - Network accessline 169
]); const generalEng = makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), - Network accessline 170
const generalEng = makeEntry('bing', [ makeResult('bing', 'https://example.com/a'), ]); - Network accessline 171
makeResult('bing', 'https://example.com/a'), - Network accessline 214
it('returns empty results when all filtered out (no error)', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://medium.com/a'), - Network accessline 215
const eng = makeEntry('bing', [ makeResult('bing', 'https://medium.com/a'), ]); - Network accessline 216
makeResult('bing', 'https://medium.com/a'), - Network accessline 254
it('injects a site: operator into the dispatched query for a small include_domains set', async () => { const eng = makeEntry('bing', [makeResult('bing', 'https://react.dev/learn')]); - Network accessline 255
const eng = makeEntry('bing', [makeResult('bing', 'https://react.dev/learn')]); - Network accessline 274
it('surfaces a starvation-merged general URL and engine_pool at the tool boundary', async () => { const codeThin = makeEntry('github-code', [ makeResult('github-code', 'https://github.com/x/only'), - Network accessline 275
const codeThin = makeEntry('github-code', [ makeResult('github-code', 'https://github.com/x/only'), ]); - Network accessline 276
makeResult('github-code', 'https://github.com/x/only'), - Network accessline 277
]); const generalRich = makeEntry('bing', [ makeResult('bing', 'https://example.com/g1'), - Network accessline 278
const generalRich = makeEntry('bing', [ makeResult('bing', 'https://example.com/g1'), makeResult('bing', 'https://example.com/g2'), - Network accessline 279
makeResult('bing', 'https://example.com/g1'), - Network accessline 280
makeResult('bing', 'https://example.com/g2'), - Network accessline 281
makeResult('bing', 'https://example.com/g3'), - Network accessline 292
if (!r.ok) return; const urls = r.data.results.map((x) => x.url); expect(urls).toContain('https://github.com/x/only'); - Network accessline 294
expect(urls).toContain('https://github.com/x/only'); - Network accessline 296
expect(urls.some((u) => u.startsWith('https://example.com/g'))).toBe(true); - Network accessline 329
it('passes max_results to engine options and caps the output', async () => { const eng = makeEntry('bing', [ makeResult('bing', 'https://a.example/1'), - Network accessline 330
const eng = makeEntry('bing', [ makeResult('bing', 'https://a.example/1'), makeResult('bing', 'https://b.example/2'), - Network accessline 331
makeResult('bing', 'https://a.example/1'), - Network accessline 332
makeResult('bing', 'https://b.example/2'), - Network accessline 333
makeResult('bing', 'https://c.example/3'), - Network accessline 334
makeResult('bing', 'https://d.example/4'), - Network accessline 335
makeResult('bing', 'https://e.example/5'),
tests/unit/tools/search-max-content-chars.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, - Network accessline 32
search: vi.fn().mockResolvedValue([ { title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, ] satisfies RawSearchResult[]), - Network accessline 33
{ title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, - Network accessline 37
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 38
fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', html: '<html></html>', contentType: 'text/html', statusCode: 200, - Network accessline 39
url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 82
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 83
fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', html: '<html></html>', contentType: 'text/html', statusCode: 200, - Network accessline 84
url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 106
extractor: 'defuddle' as const, }); const input: FetchInput = { url: 'https://e.com/1', max_content_chars: 2000, include_full_markdown: true }; - Network accessline 107
}); const input: FetchInput = { url: 'https://e.com/1', max_content_chars: 2000, include_full_markdown: true }; const __r_out = await handleFetch(input, router);; - Network accessline 108
const input: FetchInput = { url: 'https://e.com/1', max_content_chars: 2000, include_full_markdown: true };
tests/unit/tools/search-mode.test.ts
- Executable scriptline 1
Executable file - Network accessline 40
calls.push(name); return [{ title: name, url: `https://${name}.test/`, snippet: 's', - Network accessline 41
return [{ title: name, url: `https://${name}.test/`, snippet: 's', relevance_score: 0.5, engine: name, - Network accessline 42
title: name, url: `https://${name}.test/`, snippet: 's',
tests/unit/tools/search-multi-query.test.ts
- Executable scriptline 1
Executable file - Network accessline 37
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', - Network accessline 38
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', finalUrl: 'https://example.com/1', - Network accessline 39
url: 'https://example.com/1', - Network accessline 40
finalUrl: 'https://example.com/1', - Network accessline 62
it('accepts string[] query and returns queries_executed', async () => { const engine = makeMockEngine('mock', (query) => [ { title: `Result for ${query}`, url: `https://example.com/${query}`, snippet: query, relevance_score: 0.9, - Network accessline 63
const engine = makeMockEngine('mock', (query) => [ { title: `Result for ${query}`, url: `https://example.com/${query}`, snippet: query, relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 64
{ title: `Result for ${query}`, url: `https://example.com/${query}`, snippet: query, relevance_score: 0.9, engine: 'mock' }, - Network accessline 81
it('deduplicates results across queries', async () => { const engine = makeMockEngine('mock', () => [ { title: 'Same Page', url: 'https://example.com/same', snippet: 'Same', relevance_score: 0.9, engine: 'mock' }, - Network accessline 82
const engine = makeMockEngine('mock', () => [ { title: 'Same Page', url: 'https://example.com/same', snippet: 'Same', relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 83
{ title: 'Same Page', url: 'https://example.com/same', snippet: 'Same', relevance_score: 0.9, engine: 'mock' }, - Network accessline 99
it('normalizes duplicate queries in array', async () => { const engine = makeMockEngine('mock', (query) => [ { title: `Result for ${query}`, url: `https://example.com/${encodeURIComponent(query)}`, snippet: query, relevance_score: - Network accessline 100
const engine = makeMockEngine('mock', (query) => [ { title: `Result for ${query}`, url: `https://example.com/${encodeURIComponent(query)}`, snippet: query, relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 101
{ title: `Result for ${query}`, url: `https://example.com/${encodeURIComponent(query)}`, snippet: query, relevance_score: 0.9, engine: 'mock' }, - Network accessline 116
it('still works with single string query (backward compat)', async () => { const engine = makeMockEngine('mock', () => [ { title: 'Result', url: 'https://example.com', snippet: 'test', relevance_score: 0.9, engine: 'mock' }, - Network accessline 117
const engine = makeMockEngine('mock', () => [ { title: 'Result', url: 'https://example.com', snippet: 'test', relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 118
{ title: 'Result', url: 'https://example.com', snippet: 'test', relevance_score: 0.9, engine: 'mock' }, - Network accessline 150
it('populates query field with first query for display', async () => { const engine = makeMockEngine('mock', () => [ { title: 'R', url: 'https://r.com', snippet: 'r', relevance_score: 0.9, engine: 'mock' }, - Network accessline 151
const engine = makeMockEngine('mock', () => [ { title: 'R', url: 'https://r.com', snippet: 'r', relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 152
{ title: 'R', url: 'https://r.com', snippet: 'r', relevance_score: 0.9, engine: 'mock' }, - Network accessline 166
it('applies domain filters to multi-query results', async () => { const engine = makeMockEngine('mock', () => [ { title: 'Allowed', url: 'https://allowed.com/page', snippet: 'allowed', relevance_score: 0.9, engine: 'mock' }, - Network accessline 167
const engine = makeMockEngine('mock', () => [ { title: 'Allowed', url: 'https://allowed.com/page', snippet: 'allowed', relevance_score: 0.9, engine: 'mock' }, { title: 'Blocked', url: 'https://blocked.com/page', snippet: 'blocke - Network accessline 168
{ title: 'Allowed', url: 'https://allowed.com/page', snippet: 'allowed', relevance_score: 0.9, engine: 'mock' }, - Network accessline 169
{ title: 'Blocked', url: 'https://blocked.com/page', snippet: 'blocked', relevance_score: 0.8, engine: 'mock' }, - Network accessline 185
it('fetches content for multi-query results when include_content=true', async () => { const engine = makeMockEngine('mock', (query) => [ { title: `R ${query}`, url: `https://example.com/${query.replace(/\s/g, '-')}`, snippet: quer - Network accessline 186
const engine = makeMockEngine('mock', (query) => [ { title: `R ${query}`, url: `https://example.com/${query.replace(/\s/g, '-')}`, snippet: query, relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 187
{ title: `R ${query}`, url: `https://example.com/${query.replace(/\s/g, '-')}`, snippet: query, relevance_score: 0.9, engine: 'mock' }, - Network accessline 235
Array.from({ length: 10 }, (_, i) => ({ title: `R${i} ${query}`, url: `https://example.com/${query.replace(/\s/g, '-')}/${i}`, - Network accessline 236
title: `R${i} ${query}`, url: `https://example.com/${query.replace(/\s/g, '-')}/${i}`, snippet: `${query} ${i}`, - Network accessline 237
url: `https://example.com/${query.replace(/\s/g, '-')}/${i}`, - Network accessline 256
it('caches multi-query results', async () => { const engine = makeMockEngine('mock', () => [ { title: 'Cached', url: 'https://cached.com', snippet: 'cache me', relevance_score: 0.9, engine: 'mock' }, - Network accessline 257
const engine = makeMockEngine('mock', () => [ { title: 'Cached', url: 'https://cached.com', snippet: 'cache me', relevance_score: 0.9, engine: 'mock' }, ]); - Network accessline 258
{ title: 'Cached', url: 'https://cached.com', snippet: 'cache me', relevance_score: 0.9, engine: 'mock' }, - Network accessline 273
it('search_engines filter works with multi-query', async () => { const engine1 = { name: 'searxng', search: vi.fn().mockResolvedValue([ { title: 'SX', url: 'https://sx.com', snippet: 'sx', relevance_score: 0.9, engine: 'searxng' } - Network accessline 274
const engine1 = { name: 'searxng', search: vi.fn().mockResolvedValue([ { title: 'SX', url: 'https://sx.com', snippet: 'sx', relevance_score: 0.9, engine: 'searxng' }, ]) }; - Network accessline 275
{ title: 'SX', url: 'https://sx.com', snippet: 'sx', relevance_score: 0.9, engine: 'searxng' }, - Network accessline 276
]) }; const engine2 = { name: 'bing', search: vi.fn().mockResolvedValue([ { title: 'B', url: 'https://b.com', snippet: 'b', relevance_score: 0.8, engine: 'bing' }, - Network accessline 277
const engine2 = { name: 'bing', search: vi.fn().mockResolvedValue([ { title: 'B', url: 'https://b.com', snippet: 'b', relevance_score: 0.8, engine: 'bing' }, ]) }; - Network accessline 278
{ title: 'B', url: 'https://b.com', snippet: 'b', relevance_score: 0.8, engine: 'bing' },
tests/unit/tools/search-timing.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, - Network accessline 31
search: vi.fn().mockResolvedValue([ { title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, { title: 'R2', url: 'https://e.com/2', snippet: 's2', relevance_score: 0.8, engine: 'mock' }, - Network accessline 32
{ title: 'R1', url: 'https://e.com/1', snippet: 's1', relevance_score: 0.9, engine: 'mock' }, - Network accessline 33
{ title: 'R2', url: 'https://e.com/2', snippet: 's2', relevance_score: 0.8, engine: 'mock' }, - Network accessline 34
{ title: 'R3', url: 'https://e.com/3', snippet: 's3', relevance_score: 0.7, engine: 'mock' }, - Network accessline 35
{ title: 'R4', url: 'https://e.com/4', snippet: 's4', relevance_score: 0.6, engine: 'mock' }, - Network accessline 36
{ title: 'R5', url: 'https://e.com/5', snippet: 's5', relevance_score: 0.5, engine: 'mock' }, - Network accessline 54
const router = { fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 55
fetch: vi.fn().mockResolvedValue({ url: 'https://e.com/1', finalUrl: 'https://e.com/1', html: '<html></html>', contentType: 'text/html', statusCode: 200, - Network accessline 56
url: 'https://e.com/1', finalUrl: 'https://e.com/1', - Network accessline 86
await new Promise(r => setTimeout(r, 200)); return { url: 'https://e.com/x', finalUrl: 'https://e.com/x', - Network accessline 87
return { url: 'https://e.com/x', finalUrl: 'https://e.com/x', html: '<html></html>', contentType: 'text/html', statusCode: 200, - Network accessline 88
url: 'https://e.com/x', finalUrl: 'https://e.com/x', - Network accessline 130
const r1 = out.results.find(r => r.url === 'https://e.com/1'); - Network accessline 131
const r2 = out.results.find(r => r.url === 'https://e.com/2');
tests/unit/tools/search-warning.test.ts
- Executable scriptline 1
Executable file - Network accessline 12
name: 'stub', async search(): Promise<RawSearchResult[]> { return [{ title: 't', url: 'https://example.com', snippet: 's', relevance_score: 1, engine: 'stub' }]; - Network accessline 13
async search(): Promise<RawSearchResult[]> { return [{ title: 't', url: 'https://example.com', snippet: 's', relevance_score: 1, engine: 'stub' }]; }, - Network accessline 14
return [{ title: 't', url: 'https://example.com', snippet: 's', relevance_score: 1, engine: 'stub' }];
tests/unit/tools/search.engine-warnings.test.ts
- Executable scriptline 1
Executable file - Network accessline 123
it('search tool response carries engine_warnings array (empty when no engine errored)', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 124
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), ]; - Network accessline 125
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 138
it('search tool surfaces a 400-style engine failure in engine_warnings', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 139
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), makeFailingEntry('lobsters', 'Lobsters returned 400'), - Network accessline 140
makeEntry('bing', [makeResult('bing', 'https://a.com/x')]), - Network accessline 157
verticalState.code = [ makeFailingEntry('github-code', 'GitHub code returned 401'), makeEntry('mdn', [makeResult('mdn', 'https://developer.mozilla.org/x')]), - Network accessline 158
makeFailingEntry('github-code', 'GitHub code returned 401'), makeEntry('mdn', [makeResult('mdn', 'https://developer.mozilla.org/x')]), ]; - Network accessline 159
makeEntry('mdn', [makeResult('mdn', 'https://developer.mozilla.org/x')]),
tests/unit/tools/search.images.test.ts
- Executable scriptline 1
Executable file - Network accessline 144
verticalState.images = [ makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://example.com/cats', 'https://cdn.example.com/cat.jpg', { - Network accessline 145
makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://example.com/cats', 'https://cdn.example.com/cat.jpg', { title: 'A cat', - Network accessline 146
imageResult('ddg-image', 'https://example.com/cats', 'https://cdn.example.com/cat.jpg', { - Network accessline 147
title: 'A cat', thumb: 'https://cdn.example.com/cat-thumb.jpg', w: 1200, - Network accessline 148
thumb: 'https://cdn.example.com/cat-thumb.jpg', - Network accessline 171
expect(r.data.results[0].width).toBe(1200); expect(r.data.results[0].height).toBe(800); expect(r.data.results[0].thumbnail_url).toBe('https://cdn.example.com/cat-thumb.jpg'); - Network accessline 172
expect(r.data.results[0].height).toBe(800); expect(r.data.results[0].thumbnail_url).toBe('https://cdn.example.com/cat-thumb.jpg'); }); - Network accessline 173
expect(r.data.results[0].thumbnail_url).toBe('https://cdn.example.com/cat-thumb.jpg'); - Network accessline 177
verticalState.images = [ makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://a.example/p', 'https://cdn/a.jpg', { title: 'a' }), - Network accessline 178
makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://a.example/p', 'https://cdn/a.jpg', { title: 'a' }), imageResult('ddg-image', 'https://b.example/p', 'https://cdn/b.jpg', { title: 'b' }), - Network accessline 179
imageResult('ddg-image', 'https://a.example/p', 'https://cdn/a.jpg', { title: 'a' }), - Network accessline 180
imageResult('ddg-image', 'https://b.example/p', 'https://cdn/b.jpg', { title: 'b' }), - Access to secretsline 201
[Credential-related source omitted] - Network accessline 203
[Credential-related source omitted] - Access to secretsline 203
[Credential-related source omitted] - Network accessline 204
makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://example.com/p', 'https://cdn/x.jpg', { title: 'cat' }), ]), - Network accessline 205
imageResult('ddg-image', 'https://example.com/p', 'https://cdn/x.jpg', { title: 'cat' }), - Access to secretsline 222
[Credential-related source omitted] - Network accessline 226
verticalState.images = [ makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://example.com/p', 'https://cdn/a.jpg'), - Network accessline 227
makeImageEntry('ddg-image', [ imageResult('ddg-image', 'https://example.com/p', 'https://cdn/a.jpg'), ]), - Network accessline 228
imageResult('ddg-image', 'https://example.com/p', 'https://cdn/a.jpg'),
tests/unit/tools/search.long-tail-engines.test.ts
- Executable scriptline 1
Executable file - Network accessline 121
it('engine_telemetry lists mojeek when the general vertical includes it', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), - Network accessline 122
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), makeEntry('mojeek', [makeResult('mojeek', 'https://b.example/y')]), - Network accessline 123
makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), - Network accessline 124
makeEntry('mojeek', [makeResult('mojeek', 'https://b.example/y')]), - Network accessline 141
it('engine_telemetry lists marginalia when the general vertical includes it', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), - Network accessline 142
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), makeEntry('marginalia', [makeResult('marginalia', 'https://c.example/z')]), - Network accessline 143
makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), - Network accessline 144
makeEntry('marginalia', [makeResult('marginalia', 'https://c.example/z')]), - Network accessline 159
it('long-tail engine errors surface in engine_warnings without blocking the response', async () => { verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), - Network accessline 160
verticalState.general = [ makeEntry('bing', [makeResult('bing', 'https://a.example/x')]), { - Network accessline 161
makeEntry('bing', [makeResult('bing', 'https://a.example/x')]),
tests/unit/tools/search.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
name: 'mock', search: vi.fn().mockResolvedValue([ { title: 'Result 1', url: 'https://example.com/1', snippet: 'First result', relevance_score: 0.9, engine: 'mock' }, - Network accessline 40
search: vi.fn().mockResolvedValue([ { title: 'Result 1', url: 'https://example.com/1', snippet: 'First result', relevance_score: 0.9, engine: 'mock' }, { title: 'Result 2', url: 'https://example.com/2', snippet: 'Second result', - Network accessline 41
{ title: 'Result 1', url: 'https://example.com/1', snippet: 'First result', relevance_score: 0.9, engine: 'mock' }, - Network accessline 42
{ title: 'Result 2', url: 'https://example.com/2', snippet: 'Second result', relevance_score: 0.7, engine: 'mock' }, - Network accessline 43
{ title: 'Result 3', url: 'https://example.com/3', snippet: 'Third result', relevance_score: 0.5, engine: 'mock' }, - Network accessline 47
const mockRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', - Network accessline 48
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', finalUrl: 'https://example.com/1', - Network accessline 49
url: 'https://example.com/1', - Network accessline 50
finalUrl: 'https://example.com/1', - Network accessline 118
const bigContentRouter = { fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', - Network accessline 119
fetch: vi.fn().mockResolvedValue({ url: 'https://example.com/1', finalUrl: 'https://example.com/1', - Network accessline 120
url: 'https://example.com/1', - Network accessline 121
finalUrl: 'https://example.com/1', - Network accessline 166
name: 'engine2', search: vi.fn().mockResolvedValue([ { title: 'E2 Result', url: 'https://other.com', snippet: 'Different', relevance_score: 0.95, engine: 'engine2' }, - Network accessline 167
search: vi.fn().mockResolvedValue([ { title: 'E2 Result', url: 'https://other.com', snippet: 'Different', relevance_score: 0.95, engine: 'engine2' }, ]), - Network accessline 168
{ title: 'E2 Result', url: 'https://other.com', snippet: 'Different', relevance_score: 0.95, engine: 'engine2' }, - Network accessline 183
name: 'searxng', search: vi.fn().mockResolvedValue([ { title: 'SearXNG Result', url: 'https://searxng.com', snippet: 'From SearXNG', relevance_score: 0.9, engine: 'searxng' }, - Network accessline 184
search: vi.fn().mockResolvedValue([ { title: 'SearXNG Result', url: 'https://searxng.com', snippet: 'From SearXNG', relevance_score: 0.9, engine: 'searxng' }, ]), - Network accessline 185
{ title: 'SearXNG Result', url: 'https://searxng.com', snippet: 'From SearXNG', relevance_score: 0.9, engine: 'searxng' }, - Network accessline 189
name: 'duckduckgo', search: vi.fn().mockResolvedValue([ { title: 'DDG Result', url: 'https://ddg.com', snippet: 'From DDG', relevance_score: 0.8, engine: 'duckduckgo' }, - Network accessline 190
search: vi.fn().mockResolvedValue([ { title: 'DDG Result', url: 'https://ddg.com', snippet: 'From DDG', relevance_score: 0.8, engine: 'duckduckgo' }, ]), - Network accessline 191
{ title: 'DDG Result', url: 'https://ddg.com', snippet: 'From DDG', relevance_score: 0.8, engine: 'duckduckgo' }, - Network accessline 206
it('bypasses search cache when force_refresh is true', async () => { cacheSearchResults('test', [ { title: 'Stale', url: 'https://cached.example/1', snippet: 'stale snippet', relevance_score: 0.9 }, - Network accessline 207
cacheSearchResults('test', [ { title: 'Stale', url: 'https://cached.example/1', snippet: 'stale snippet', relevance_score: 0.9 }, ], ['cached-engine']); - Network accessline 208
{ title: 'Stale', url: 'https://cached.example/1', snippet: 'stale snippet', relevance_score: 0.9 }, - Network accessline 222
const expandedKey = expandIfSingle('test').join(' | '); cacheSearchResults(expandedKey, [ { title: 'Stale', url: 'https://cached.example/1', snippet: 'stale snippet', relevance_score: 0.9 }, - Network accessline 223
cacheSearchResults(expandedKey, [ { title: 'Stale', url: 'https://cached.example/1', snippet: 'stale snippet', relevance_score: 0.9 }, ], ['cached-engine']); - Network accessline 224
{ title: 'Stale', url: 'https://cached.example/1', snippet: 'stale snippet', relevance_score: 0.9 }, - Network accessline 254
it('bypasses multi-query search cache when force_refresh is true', async () => { cacheSearchResults('test a | test b', [ { title: 'Stale Multi', url: 'https://cached.example/2', snippet: 'stale', relevance_score: 0.9 }, - Network accessline 255
cacheSearchResults('test a | test b', [ { title: 'Stale Multi', url: 'https://cached.example/2', snippet: 'stale', relevance_score: 0.9 }, ], ['multi-cached']); - Network accessline 256
{ title: 'Stale Multi', url: 'https://cached.example/2', snippet: 'stale', relevance_score: 0.9 }, - Network accessline 270
name: 'bing', search: vi.fn().mockResolvedValue([ { title: 'Bing Result', url: 'https://bing.com', snippet: 'From Bing', relevance_score: 0.9, engine: 'bing' }, - Network accessline 271
search: vi.fn().mockResolvedValue([ { title: 'Bing Result', url: 'https://bing.com', snippet: 'From Bing', relevance_score: 0.9, engine: 'bing' }, ]), - Network accessline 272
{ title: 'Bing Result', url: 'https://bing.com', snippet: 'From Bing', relevance_score: 0.9, engine: 'bing' }, - Network accessline 302
mockRunV1Search.mockResolvedValue({ results: [ { title: 'A', url: 'https://a.example/1', snippet: 'Alpha evidence snippet', relevance_score: 0.9, engine: 'e1' }, - Network accessline 303
results: [ { title: 'A', url: 'https://a.example/1', snippet: 'Alpha evidence snippet', relevance_score: 0.9, engine: 'e1' }, { title: 'B', url: 'https://b.example/2', snippet: 'Beta evidence snippet', relevance_score: 0.8, - Network accessline 304
{ title: 'A', url: 'https://a.example/1', snippet: 'Alpha evidence snippet', relevance_score: 0.9, engine: 'e1' }, - Network accessline 305
{ title: 'B', url: 'https://b.example/2', snippet: 'Beta evidence snippet', relevance_score: 0.8, engine: 'e1' },
tests/unit/tui/verify-e2e.test.ts
tests/unit/types-multi-query.test.ts
- Executable scriptline 1
Executable file
tests/unit/types.test.ts
- Executable scriptline 1
Executable file - Network accessline 15
describe('types', () => { it('FetchInput accepts minimal input', () => { const input: FetchInput = { url: 'https://example.com' }; - Network accessline 16
it('FetchInput accepts minimal input', () => { const input: FetchInput = { url: 'https://example.com' }; expect(input.url).toBe('https://example.com'); - Network accessline 17
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 18
expect(input.url).toBe('https://example.com'); - Network accessline 22
it('FetchOutput has required fields', () => { const output: FetchOutput = { url: 'https://example.com', - Network accessline 23
const output: FetchOutput = { url: 'https://example.com', title: 'Example', - Network accessline 24
url: 'https://example.com', - Network accessline 56
const item: SearchResultItem = { title: 'Example', url: 'https://example.com', - Network accessline 57
title: 'Example', url: 'https://example.com', snippet: 'An example page', - Network accessline 58
url: 'https://example.com', - Network accessline 68
const raw: RawSearchResult = { title: 'Result', url: 'https://example.com', - Network accessline 69
title: 'Result', url: 'https://example.com', snippet: 'Snippet', - Network accessline 70
url: 'https://example.com', - Network accessline 79
describe('crawl types', () => { it('CrawlInput accepts minimal input', () => { const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 80
it('CrawlInput accepts minimal input', () => { const input: CrawlInput = { url: 'https://docs.example.com' }; expect(input.url).toBe('https://docs.example.com'); - Network accessline 81
const input: CrawlInput = { url: 'https://docs.example.com' }; - Network accessline 82
expect(input.url).toBe('https://docs.example.com'); - Network accessline 87
it('CrawlInput accepts all options', () => { const input: CrawlInput = { url: 'https://docs.example.com', - Network accessline 88
const input: CrawlInput = { url: 'https://docs.example.com', max_depth: 3, - Network accessline 89
url: 'https://docs.example.com', - Network accessline 103
it('CrawlResultItem has required fields', () => { const item: CrawlResultItem = { url: 'https://docs.example.com/intro', - Network accessline 104
const item: CrawlResultItem = { url: 'https://docs.example.com/intro', title: 'Intro', - Network accessline 105
url: 'https://docs.example.com/intro', - Network accessline 124
it('LinkEdge represents a directed link', () => { const edge: LinkEdge = { from: 'https://a.com', to: 'https://a.com/page' }; - Network accessline 125
const edge: LinkEdge = { from: 'https://a.com', to: 'https://a.com/page' }; - Network accessline 126
expect(edge.from).toBe('https://a.com'); - Network accessline 211
describe('FetchInput.actions field', () => { it('accepts undefined actions (backwards compatible)', () => { const input: FetchInput = { url: 'https://example.com' }; - Network accessline 212
it('accepts undefined actions (backwards compatible)', () => { const input: FetchInput = { url: 'https://example.com' }; expect(input.actions).toBeUndefined(); - Network accessline 213
const input: FetchInput = { url: 'https://example.com' }; - Network accessline 217
it('accepts an array of BrowserActions', () => { const input: FetchInput = { url: 'https://example.com', - Network accessline 218
const input: FetchInput = { url: 'https://example.com', actions: [ - Network accessline 219
url: 'https://example.com', - Network accessline 229
it('accepts an empty actions array', () => { const input: FetchInput = { url: 'https://example.com', actions: [] }; - Network accessline 230
const input: FetchInput = { url: 'https://example.com', actions: [] }; - Network accessline 236
it('is optional (backwards compatible)', () => { const output: FetchOutput = { url: 'https://example.com', - Network accessline 237
const output: FetchOutput = { url: 'https://example.com', title: 'Test', - Network accessline 238
url: 'https://example.com', - Network accessline 249
it('accepts an array of ActionResults', () => { const output: FetchOutput = { url: 'https://example.com', - Network accessline 250
const output: FetchOutput = { url: 'https://example.com', title: 'Test', - Network accessline 251
url: 'https://example.com',
tests/unit/types/solve-provenance.test.ts
- Executable scriptline 1
Executable file - Network accessline 30
it('RawFetchResult compiles WITHOUT the new optional fields (existing sites unchanged)', () => { const r: RawFetchResult = { url: 'https://example.com', - Network accessline 31
const r: RawFetchResult = { url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 32
url: 'https://example.com', - Network accessline 33
finalUrl: 'https://example.com', - Network accessline 44
it('RawFetchResult accepts challenge_class + solve_method when present', () => { const r: RawFetchResult = { url: 'https://example.com', - Network accessline 45
const r: RawFetchResult = { url: 'https://example.com', finalUrl: 'https://example.com', - Network accessline 46
url: 'https://example.com', - Network accessline 47
finalUrl: 'https://example.com',
tests/unit/types/stage-result.test.ts
- Executable scriptline 1
Executable file
tests/unit/util/abort.test.ts
- Executable scriptline 1
Executable file
tests/unit/util/child-env.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 11
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Network accessline 22
it('preserves unrelated env vars like PATH', () => { process.env.PATH = '/usr/bin:/bin'; process.env.SOME_PROXY = 'http://proxy'; - Network accessline 23
process.env.PATH = '/usr/bin:/bin'; process.env.SOME_PROXY = 'http://proxy'; const env = sanitizedChildEnv(); - Network accessline 24
process.env.SOME_PROXY = 'http://proxy'; - Network accessline 25
const env = sanitizedChildEnv(); expect(env.PATH).toBe('/usr/bin:/bin'); expect(env.SOME_PROXY).toBe('http://proxy'); - Network accessline 26
expect(env.PATH).toBe('/usr/bin:/bin'); expect(env.SOME_PROXY).toBe('http://proxy'); }); - Network accessline 27
expect(env.SOME_PROXY).toBe('http://proxy'); - Network accessline 37
it('preserves *_PROXY vars by default (searxng child needs them)', () => { process.env.HTTP_PROXY = 'http://p:1'; - Network accessline 38
process.env.HTTP_PROXY = 'http://p:1'; - Network accessline 39
process.env.HTTPS_PROXY = 'http://p:2'; - Network accessline 40
process.env.http_proxy = 'http://p:3'; - Network accessline 41
process.env.https_proxy = 'http://p:4'; - Network accessline 43
process.env.all_proxy = 'socks5://p:6'; const env = sanitizedChildEnv(); expect(env.HTTP_PROXY).toBe('http://p:1'); - Network accessline 44
const env = sanitizedChildEnv(); expect(env.HTTP_PROXY).toBe('http://p:1'); expect(env.HTTPS_PROXY).toBe('http://p:2'); - Network accessline 45
expect(env.HTTP_PROXY).toBe('http://p:1'); - Network accessline 46
expect(env.HTTPS_PROXY).toBe('http://p:2'); - Network accessline 47
expect(env.http_proxy).toBe('http://p:3'); - Network accessline 48
expect(env.https_proxy).toBe('http://p:4'); - Network accessline 53
it('strips ALL *_PROXY vars when stripProxy is set (browser child)', () => { process.env.HTTP_PROXY = 'http://p:1'; - Network accessline 54
process.env.HTTP_PROXY = 'http://p:1'; - Network accessline 55
process.env.HTTPS_PROXY = 'http://p:2'; - Network accessline 56
process.env.http_proxy = 'http://p:3'; - Network accessline 57
process.env.https_proxy = 'http://p:4'; - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted]
tests/unit/util/mode.test.ts
- Executable scriptline 1
Executable file
tests/unit/util/native-abi.test.ts
- Executable scriptline 1
Executable file
tests/unit/util/redact-url.test.ts
- Executable scriptline 1
Executable file - Network accessline 4
describe('redactUrl', () => { it('strips inline userinfo (user:pass@)', () => { const out = redactUrl('https://alice:s3cret@proxy.example.com:8080/path'); - Network accessline 5
it('strips inline userinfo (user:pass@)', () => { const out = redactUrl('https://alice:s3cret@proxy.example.com:8080/path'); expect(out).not.toContain('alice'); - Network accessline 6
const out = redactUrl('https://alice:s3cret@proxy.example.com:8080/path'); - Network accessline 12
[Credential-related source omitted] - Network accessline 13
[Credential-related source omitted] - Network accessline 19
it('preserves scheme, host, port and path', () => { expect(redactUrl('http://host.example:9000/a/b')).toBe('http://host.example:9000/a/b'); - Network accessline 20
expect(redactUrl('http://host.example:9000/a/b')).toBe('http://host.example:9000/a/b'); - Network accessline 30
it('handles a bare userinfo with no password', () => { const out = redactUrl('https://tokenonly@sidecar.local/'); - Network accessline 31
const out = redactUrl('https://tokenonly@sidecar.local/');
tests/unit/watch/ssrf.test.ts
- Executable scriptline 1
Executable file - Network accessline 31
it('link-local metadata IP → ssrf_metadata', () => { const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url'); - Network accessline 32
const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url'); - Network accessline 37
it('metadata hostname → ssrf_metadata', () => { const r = guardFetchUrl('http://metadata.google.internal/', 'url'); - Network accessline 38
const r = guardFetchUrl('http://metadata.google.internal/', 'url'); - Network accessline 43
it('private RFC1918 IP → ssrf_private_target', () => { const r = guardFetchUrl('http://10.0.0.5/', 'url'); - Network accessline 44
const r = guardFetchUrl('http://10.0.0.5/', 'url'); - Network accessline 49
it('loopback via guardUrl (strict) → ssrf_private_target', () => { const r = guardUrl('http://127.0.0.1/', 'url'); - Network accessline 50
const r = guardUrl('http://127.0.0.1/', 'url'); - Network accessline 57
'not-a-url', 'file:///etc/passwd', 'http://169.254.169.254/', - Network accessline 58
'file:///etc/passwd', 'http://169.254.169.254/', 'http://10.0.0.5/', - Network accessline 59
'http://169.254.169.254/', - Network accessline 60
'http://10.0.0.5/', - Network accessline 61
'http://metadata.google.internal/', - Network accessline 78
* * These tests pin the explicit reject list called out in the slice spec: * - http://localhost / 127.0.0.1 / ::1 / 0.0.0.0 - Network accessline 79
* These tests pin the explicit reject list called out in the slice spec: * - http://localhost / 127.0.0.1 / ::1 / 0.0.0.0 * - RFC 1918 private ranges (10/8, 172.16/12, 192.168/16) - Network accessline 80
* - http://localhost / 127.0.0.1 / ::1 / 0.0.0.0 - Network accessline 86
describe('accepts public http(s) URLs', () => { it('accepts a vanilla https URL', () => { const r = guardUrl('https://example.com/path', 'url'); - Network accessline 87
it('accepts a vanilla https URL', () => { const r = guardUrl('https://example.com/path', 'url'); expect(r.ok).toBe(true); - Network accessline 88
const r = guardUrl('https://example.com/path', 'url'); - Network accessline 92
it('accepts a vanilla http URL', () => { const r = guardUrl('http://example.com/', 'url'); - Network accessline 93
const r = guardUrl('http://example.com/', 'url'); - Network accessline 97
it('accepts a public IPv4 hostname', () => { const r = guardUrl('https://8.8.8.8/', 'url'); - Network accessline 98
const r = guardUrl('https://8.8.8.8/', 'url'); - Network accessline 102
it('accepts a query string and fragment', () => { const r = guardUrl('https://example.com/page?q=1#frag', 'url'); - Network accessline 103
const r = guardUrl('https://example.com/page?q=1#frag', 'url'); - Network accessline 108
describe('rejects loopback hostnames', () => { it('rejects http://localhost', () => { - Network accessline 109
it('rejects http://localhost', () => { - Network accessline 110
const r = guardUrl('http://localhost', 'url'); - Network accessline 115
it('rejects http://localhost:3000', () => { - Network accessline 116
const r = guardUrl('http://localhost:3000/api', 'url'); - Network accessline 120
it('rejects http://127.0.0.1', () => { - Network accessline 121
const r = guardUrl('http://127.0.0.1/', 'url'); - Network accessline 125
it('rejects http://127.1.2.3 (still in 127/8)', () => { - Network accessline 126
const r = guardUrl('http://127.1.2.3/', 'url'); - Network accessline 130
it('rejects http://[::1]/', () => { - Network accessline 131
const r = guardUrl('http://[::1]/', 'url'); - Network accessline 135
it('rejects http://0.0.0.0/', () => { - Network accessline 136
const r = guardUrl('http://0.0.0.0/', 'url'); - Network accessline 141
describe('rejects RFC 1918 private ranges', () => { it('rejects 10.x.x.x', () => { const r = guardUrl('http://10.0.0.5/', 'url'); - Network accessline 142
it('rejects 10.x.x.x', () => { const r = guardUrl('http://10.0.0.5/', 'url'); expect(r.ok).toBe(false); - Network accessline 143
const r = guardUrl('http://10.0.0.5/', 'url'); - Network accessline 147
it('rejects 172.16.x.x', () => { const r = guardUrl('http://172.16.0.1/', 'url'); - Network accessline 148
const r = guardUrl('http://172.16.0.1/', 'url'); - Network accessline 152
it('rejects 172.31.x.x (top of 172.16/12)', () => { const r = guardUrl('http://172.31.255.255/', 'url'); - Network accessline 153
const r = guardUrl('http://172.31.255.255/', 'url'); - Network accessline 157
it('accepts 172.15.x.x (just outside 172.16/12)', () => { const r = guardUrl('http://172.15.0.1/', 'url'); - Network accessline 158
const r = guardUrl('http://172.15.0.1/', 'url'); - Network accessline 162
it('accepts 172.32.x.x (just outside 172.16/12)', () => { const r = guardUrl('http://172.32.0.1/', 'url'); - Network accessline 163
const r = guardUrl('http://172.32.0.1/', 'url'); - Network accessline 167
it('rejects 192.168.x.x', () => { const r = guardUrl('http://192.168.1.1/', 'url'); - Network accessline 168
const r = guardUrl('http://192.168.1.1/', 'url'); - Network accessline 173
describe('rejects link-local 169.254/16', () => { it('rejects 169.254.169.254 (AWS metadata)', () => { const r = guardUrl('http://169.254.169.254/latest/meta-data/', 'url'); - Network accessline 174
it('rejects 169.254.169.254 (AWS metadata)', () => { const r = guardUrl('http://169.254.169.254/latest/meta-data/', 'url'); expect(r.ok).toBe(false); - Network accessline 175
const r = guardUrl('http://169.254.169.254/latest/meta-data/', 'url'); - Network accessline 208
describe('rejects IPv6 private ranges', () => { it('rejects link-local fe80::', () => { const r = guardUrl('http://[fe80::1]/', 'url'); - Network accessline 209
it('rejects link-local fe80::', () => { const r = guardUrl('http://[fe80::1]/', 'url'); expect(r.ok).toBe(false); - Network accessline 210
const r = guardUrl('http://[fe80::1]/', 'url'); - Network accessline 214
it('rejects unique-local fc00::', () => { const r = guardUrl('http://[fc00::1]/', 'url'); - Network accessline 215
const r = guardUrl('http://[fc00::1]/', 'url'); - Network accessline 219
it('rejects fd00:: (also unique-local)', () => { const r = guardUrl('http://[fd12:3456:789a::1]/', 'url'); - Network accessline 220
const r = guardUrl('http://[fd12:3456:789a::1]/', 'url'); - Network accessline 224
it('rejects IPv4-mapped loopback ::ffff:127.0.0.1', () => { const r = guardUrl('http://[::ffff:127.0.0.1]/', 'url'); - Network accessline 225
const r = guardUrl('http://[::ffff:127.0.0.1]/', 'url'); - Network accessline 235
const r = guardUrl('http://[::127.0.0.1]/', 'url'); - Network accessline 243
const r = guardUrl('http://[::7f00:1]/', 'url'); - Network accessline 250
const r = guardUrl('http://[::a00:1]/', 'url'); - Network accessline 256
const r = guardUrl('http://[::a9fe:a9fe]/', 'url'); - Network accessline 264
const r = guardUrl('http://[::808:808]/', 'url'); - Network accessline 286
describe('field label is reflected in the error', () => { it('uses the supplied label so the caller knows which field failed', () => { const r = guardUrl('http://localhost', 'notification'); - Network accessline 287
it('uses the supplied label so the caller knows which field failed', () => { const r = guardUrl('http://localhost', 'notification'); expect(r.ok).toBe(false); - Network accessline 288
const r = guardUrl('http://localhost', 'notification'); - Network accessline 304
describe('guardFetchUrl SSRF', () => { describe('loopback is allowed by default', () => { it('accepts http://localhost:3000', () => { - Network accessline 305
describe('loopback is allowed by default', () => { it('accepts http://localhost:3000', () => { const r = guardFetchUrl('http://localhost:3000/', 'url'); - Network accessline 306
it('accepts http://localhost:3000', () => { - Network accessline 307
const r = guardFetchUrl('http://localhost:3000/', 'url'); - Network accessline 311
it('accepts http://127.0.0.1:8080', () => { - Network accessline 312
const r = guardFetchUrl('http://127.0.0.1:8080/health', 'url'); - Network accessline 316
it('accepts http://127.5.4.3 (loopback, weird octet)', () => { - Network accessline 317
const r = guardFetchUrl('http://127.5.4.3/', 'url'); - Network accessline 321
it('blocks 0.0.0.0 (unspecified address)', () => { const r = guardFetchUrl('http://0.0.0.0:8080/', 'url'); - Network accessline 322
const r = guardFetchUrl('http://0.0.0.0:8080/', 'url'); - Network accessline 327
describe('link-local is ALWAYS blocked (even with allowPrivate)', () => { it('rejects 169.254.169.254 (cloud metadata) by default', () => { const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url'); - Network accessline 328
it('rejects 169.254.169.254 (cloud metadata) by default', () => { const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url'); expect(r.ok).toBe(false); - Network accessline 329
const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url'); - Network accessline 333
it('rejects 169.254.169.254 even when allowPrivate=true', () => { const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url', { - Network accessline 334
const r = guardFetchUrl('http://169.254.169.254/latest/meta-data/', 'url', { - Network accessline 340
it('rejects metadata.google.internal by name', () => { const r = guardFetchUrl('http://metadata.google.internal/computeMetadata/v1/', 'url'); - Network accessline 341
const r = guardFetchUrl('http://metadata.google.internal/computeMetadata/v1/', 'url'); - Network accessline 346
describe('private LAN ranges are blocked by default', () => { it('rejects 10.x.x.x', () => { expect(guardFetchUrl('http://10.0.0.1/admin', 'url').ok).toBe(false); - Network accessline 347
it('rejects 10.x.x.x', () => { expect(guardFetchUrl('http://10.0.0.1/admin', 'url').ok).toBe(false); }); - Network accessline 348
expect(guardFetchUrl('http://10.0.0.1/admin', 'url').ok).toBe(false); - Network accessline 351
it('rejects 192.168.x.x', () => { expect(guardFetchUrl('http://192.168.1.1/admin', 'url').ok).toBe(false); - Network accessline 352
expect(guardFetchUrl('http://192.168.1.1/admin', 'url').ok).toBe(false); - Network accessline 355
it('rejects 172.16-31.x.x', () => { expect(guardFetchUrl('http://172.20.5.10/', 'url').ok).toBe(false); - Network accessline 356
expect(guardFetchUrl('http://172.20.5.10/', 'url').ok).toBe(false); - Network accessline 359
it('rejects CGN (100.64-127.x.x)', () => { expect(guardFetchUrl('http://100.70.1.1/', 'url').ok).toBe(false); - Network accessline 360
expect(guardFetchUrl('http://100.70.1.1/', 'url').ok).toBe(false); - Network accessline 364
describe('allowPrivate=true lifts LAN blocks', () => { it('accepts 192.168.x.x when allowPrivate=true', () => { const r = guardFetchUrl('http://192.168.1.1/admin', 'url', { allowPrivate: true }); - Network accessline 365
it('accepts 192.168.x.x when allowPrivate=true', () => { const r = guardFetchUrl('http://192.168.1.1/admin', 'url', { allowPrivate: true }); expect(r.ok).toBe(true); - Network accessline 366
const r = guardFetchUrl('http://192.168.1.1/admin', 'url', { allowPrivate: true }); - Network accessline 370
it('accepts 10.x.x.x when allowPrivate=true', () => { const r = guardFetchUrl('http://10.0.0.1/', 'url', { allowPrivate: true }); - Network accessline 371
const r = guardFetchUrl('http://10.0.0.1/', 'url', { allowPrivate: true }); - Network accessline 376
describe('public addresses always pass', () => { it('accepts a public IPv4', () => { expect(guardFetchUrl('https://1.1.1.1/', 'url').ok).toBe(true); - Network accessline 377
it('accepts a public IPv4', () => { expect(guardFetchUrl('https://1.1.1.1/', 'url').ok).toBe(true); }); - Network accessline 378
expect(guardFetchUrl('https://1.1.1.1/', 'url').ok).toBe(true); - Network accessline 381
it('accepts a public hostname', () => { expect(guardFetchUrl('https://news.ycombinator.com/', 'url').ok).toBe(true); - Network accessline 382
expect(guardFetchUrl('https://news.ycombinator.com/', 'url').ok).toBe(true);
tests/unit/watch/store.test.ts
- Executable scriptline 1
Executable file - Network accessline 39
it('persists a job with the documented columns', () => { const job = createJob({ url: 'https://example.com/page', - Network accessline 40
const job = createJob({ url: 'https://example.com/page', intervalSeconds: 60, - Network accessline 41
url: 'https://example.com/page', - Network accessline 44
}); expect(job.id).toBeTruthy(); expect(job.url).toBe('https://example.com/page'); - Network accessline 45
expect(job.id).toBeTruthy(); expect(job.url).toBe('https://example.com/page'); expect(job.interval_seconds).toBe(60); - Network accessline 46
expect(job.url).toBe('https://example.com/page'); - Network accessline 55
it('is idempotent on identical url + interval + selector — returns existing id', () => { const a = createJob({ url: 'https://example.com/p', - Network accessline 56
const a = createJob({ url: 'https://example.com/p', intervalSeconds: 60, - Network accessline 57
url: 'https://example.com/p', - Network accessline 61
}); const b = createJob({ url: 'https://example.com/p', - Network accessline 62
const b = createJob({ url: 'https://example.com/p', intervalSeconds: 60, - Network accessline 63
url: 'https://example.com/p', - Network accessline 72
it('treats a different interval as a different job', () => { createJob({ url: 'https://example.com/q', intervalSeconds: 60, notification: 'inline' }); - Network accessline 73
createJob({ url: 'https://example.com/q', intervalSeconds: 60, notification: 'inline' }); - Network accessline 74
createJob({ url: 'https://example.com/q', intervalSeconds: 120, notification: 'inline' }); - Network accessline 78
it('treats a different selector as a different job', () => { createJob({ url: 'https://example.com/r', intervalSeconds: 60, selector: '.a', notification: 'inline' }); - Network accessline 79
createJob({ url: 'https://example.com/r', intervalSeconds: 60, selector: '.a', notification: 'inline' }); - Network accessline 80
createJob({ url: 'https://example.com/r', intervalSeconds: 60, selector: '.b', notification: 'inline' }); - Network accessline 85
describe('listJobs / getJob / deleteJob', () => { it('lists jobs in creation order', () => { const j1 = createJob({ url: 'https://a.example/', intervalSeconds: 60, notification: 'inline' }); - Network accessline 86
it('lists jobs in creation order', () => { const j1 = createJob({ url: 'https://a.example/', intervalSeconds: 60, notification: 'inline' }); const j2 = createJob({ url: 'https://b.example/', intervalSeconds: 60, notification: 'i - Network accessline 87
const j1 = createJob({ url: 'https://a.example/', intervalSeconds: 60, notification: 'inline' }); - Network accessline 88
const j2 = createJob({ url: 'https://b.example/', intervalSeconds: 60, notification: 'inline' }); - Network accessline 98
it('deleteJob removes the row and reports true; subsequent delete reports false', () => { const j = createJob({ url: 'https://example.com/x', intervalSeconds: 60, notification: 'inline' }); - Network accessline 99
const j = createJob({ url: 'https://example.com/x', intervalSeconds: 60, notification: 'inline' }); - Network accessline 106
describe('pause / resume', () => { it('setJobStatus transitions active -> paused -> active', () => { const j = createJob({ url: 'https://example.com/y', intervalSeconds: 60, notification: 'inline' }); - Network accessline 107
it('setJobStatus transitions active -> paused -> active', () => { const j = createJob({ url: 'https://example.com/y', intervalSeconds: 60, notification: 'inline' }); const paused = setJobStatus(j.id, 'paused'); - Network accessline 108
const j = createJob({ url: 'https://example.com/y', intervalSeconds: 60, notification: 'inline' }); - Network accessline 120
describe('recordCheck', () => { it('updates last_check_at and last_content_hash on the row', () => { const j = createJob({ url: 'https://example.com/z', intervalSeconds: 60, notification: 'inline' }); - Network accessline 121
it('updates last_check_at and last_content_hash on the row', () => { const j = createJob({ url: 'https://example.com/z', intervalSeconds: 60, notification: 'inline' }); const at = Date.now(); - Network accessline 122
const j = createJob({ url: 'https://example.com/z', intervalSeconds: 60, notification: 'inline' }); - Network accessline 130
describe('staleness_seconds', () => { it('is approximately -interval just after create (next check still in the future)', () => { const j = createJob({ url: 'https://example.com/s', intervalSeconds: 300, notification: 'inline' }); - Network accessline 132
const j = createJob({ url: 'https://example.com/s', intervalSeconds: 300, notification: 'inline' }); - Network accessline 139
it('is positive once the interval has elapsed past last_check_at', () => { const j = createJob({ url: 'https://example.com/o', intervalSeconds: 60, notification: 'inline' }); - Network accessline 140
const j = createJob({ url: 'https://example.com/o', intervalSeconds: 60, notification: 'inline' }); - Network accessline 148
describe('getOverdueJobs', () => { it('returns active jobs whose next check is due', () => { const j = createJob({ url: 'https://example.com/due', intervalSeconds: 60, notification: 'inline' }); - Network accessline 150
const j = createJob({ url: 'https://example.com/due', intervalSeconds: 60, notification: 'inline' }); - Network accessline 157
it('excludes paused jobs even when overdue', () => { const j = createJob({ url: 'https://example.com/paused', intervalSeconds: 60, notification: 'inline' }); - Network accessline 158
const j = createJob({ url: 'https://example.com/paused', intervalSeconds: 60, notification: 'inline' }); - Network accessline 165
it('excludes brand-new jobs whose interval has not yet elapsed', () => { const j = createJob({ url: 'https://example.com/new', intervalSeconds: 3600, notification: 'inline' }); - Network accessline 166
const j = createJob({ url: 'https://example.com/new', intervalSeconds: 3600, notification: 'inline' });
tests/unit/wizard-setup-complete.test.tsx
- Executable scriptline 1
Executable file
tests/watch/ssrf-resolved-host.test.ts
- Executable scriptline 1
Executable file
tests/watch/ssrf-resolved-serve-target.test.ts
- Executable scriptline 1
Executable file
tsup.config.ts
- Executable scriptline 1
Executable file
vitest.config.ts
- Executable scriptline 1
Executable file
vitest.perf.config.ts
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 2 facts
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentionassets/brand/generate.cjs:17High confidence
- Contacts sqlite.org, which SKILL.md, the README and the plugin manifest do not mentionexamples/sdk-python-agent/gather.py:35High confidence
Signal confidence: 498 facts
- Network access in prose of documentation.github/PULL_REQUEST_TEMPLATE.md:20Low confidence
- Network access in prose of documentationADOPTERS.md:9Low confidence
- Network access in prose of documentationADOPTERS.md:10Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueCHANGELOG.md:21Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueCHANGELOG.md:41Low confidence
- Network access in prose of documentationCHANGELOG.md:67Low confidence
- Dangerous shell operation in prose of documentationCHANGELOG.md:68Low confidence
- Network access in prose of documentationCHANGELOG.md:68Low confidence
- Access to secrets in prose of documentationCHANGELOG.md:92Low confidence
- Access to secrets in prose of documentationCHANGELOG.md:136Low confidence
- Network access in prose of documentationCHANGELOG.md:203Low confidence
- Network access in prose of documentationCHANGELOG.md:204Low confidence
- Network access in prose of documentationCHANGELOG.md:205Low confidence
- Access to secrets in prose of documentationCHANGELOG.md:239Low confidence
- Access to secrets in prose of documentationCHANGELOG.md:240Low confidence
- Network access in prose of documentationCODE_OF_CONDUCT.md:68Low confidence
- Network access in prose of documentationCODE_OF_CONDUCT.md:70Low confidence
- Network access in prose of documentationCODE_OF_CONDUCT.md:72Low confidence
- Network access in prose of documentationCONTRIBUTING.md:22Low confidence
- Network access in prose of documentationCONTRIBUTING.md:23Low confidence
- Network access in prose of documentationCONTRIBUTING.md:24Low confidence
- Executable script in a comment of a file that runsDockerfile:1Low confidence
- Dangerous shell operation in a comment of a file that runsDockerfile:38Low confidence
- Dangerous shell operation in code of a file that runsDockerfile:59High confidence
- Dangerous shell operation in code of a file that runsDockerfile:60High confidence
- Network access in code of a file that runsDockerfile:76High confidence
- Network access in code of a file that runsDockerfile:77High confidence
- Network access in code of a file that runsDockerfile:78High confidence
- Network access in code of a file that runsDockerfile:83High confidence
- Network access in code of a file that runsDockerfile:85High confidence
- Executable script in code of a file that runsMakefile:1High confidence
- Dangerous shell operation in code of a file that runsMakefile:63High confidence
- Network access in prose of documentationREADME.md:11Low confidence
- Network access in prose of documentationREADME.md:12Low confidence
- Network access in prose of documentationREADME.md:13Low confidence
- Network access in prose of documentationREADME.md:14Low confidence
- Network access in prose of documentationREADME.md:15Low confidence
- Network access in prose of documentationREADME.md:16Low confidence
- Network access in prose of documentationREADME.md:17Low confidence
- Network access in prose of documentationREADME.md:18Low confidence
- Network access in prose of documentationREADME.md:19Low confidence
- Network access in prose of documentationREADME.md:20Low confidence
- Network access in prose of documentationREADME.md:22Low confidence
- Network access in prose of documentationREADME.md:23Low confidence
- Network access in prose of documentationREADME.md:25Low confidence
- Network access in prose of documentationREADME.md:26Low confidence
- Network access in prose of documentationREADME.md:28Low confidence
- Network access in prose of documentationREADME.md:30Low confidence
- Network access in prose of documentationREADME.md:32Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueREADME.md:75Low confidence
and 448 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest site/AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/knockoutez-wigolo/)