#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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
5.5kGitHub stars
23stars in 7 days
12skills in this repository
88commits in 30 days

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

Aug 2, 2026Nov 6, 20265,531

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

5,382 tokens

When the skill is activated

Reference documents

106,807 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Host-LLM synthesis (read me first)
  2. Quick Setup
  3. Tools
  4. Workflow Patterns
  5. Parameter Cheat Sheet
  6. Anti-Patterns
  7. CLI Commands
  8. Configuration
  9. Links

Scripts executed separately

  • Dockerfile
  • Makefile
  • assets/brand/generate.cjs
  • benchmarks/agent/evaluator.ts
  • benchmarks/agent/metrics.ts
  • benchmarks/agent/report.ts
  • benchmarks/agent/runner.ts
  • benchmarks/agent/task-executor.ts
  • benchmarks/agent/types.ts
  • benchmarks/embedding/runner.ts
  • benchmarks/extraction/metrics.ts
  • benchmarks/extraction/per-category.ts
  • benchmarks/extraction/report.ts
  • benchmarks/extraction/runner.ts
  • benchmarks/extraction/tokenizer.ts
  • benchmarks/extraction/types.ts
  • benchmarks/perf/tool-latency.ts
  • benchmarks/search/metrics.ts
  • benchmarks/search/mock-engine.ts
  • benchmarks/search/report.ts
  • benchmarks/search/rerank-quality.ts
  • benchmarks/search/runner.ts
  • benchmarks/search/types.ts
  • examples/one-shot-cli/run.sh
  • examples/plugin-search-engine/index.mjs
  • examples/plugin-search-engine/package.json
  • examples/rest-curl/demo.sh
  • examples/sdk-python-agent/gather.py
  • examples/sdk-typescript-research/package.json
  • examples/sdk-typescript-research/research.mjs
  • examples/shell-ndjson-pipeline/pipeline.sh
  • examples/vercel-ai-sdk-tools/package.json
  • examples/vercel-ai-sdk-tools/tools.ts
  • examples/watch-changelog-webhook/watch.sh
  • mcpb/server/index.cjs
  • package.json
  • packages/wigolo-crewai/tests/__init__.py
  • packages/wigolo-crewai/tests/conftest.py
  • packages/wigolo-crewai/tests/test_core.py
  • packages/wigolo-crewai/tests/test_tools.py
  • packages/wigolo-crewai/wigolo_crewai/__init__.py
  • packages/wigolo-crewai/wigolo_crewai/_core.py
  • packages/wigolo-crewai/wigolo_crewai/tools.py
  • packages/wigolo-crewai/wigolo_crewai/types.py
  • packages/wigolo-langchain/tests/__init__.py
  • packages/wigolo-langchain/tests/conftest.py
  • packages/wigolo-langchain/tests/test_client.py
  • packages/wigolo-langchain/tests/test_retrievers.py
  • packages/wigolo-langchain/tests/test_tools.py
  • packages/wigolo-langchain/wigolo_langchain/__init__.py
  • packages/wigolo-langchain/wigolo_langchain/client.py
  • packages/wigolo-langchain/wigolo_langchain/retrievers.py
  • packages/wigolo-langchain/wigolo_langchain/tools.py
  • packages/wigolo-langchain/wigolo_langchain/types.py
  • packages/wigolo-llamaindex/tests/__init__.py
  • packages/wigolo-llamaindex/tests/conftest.py
  • packages/wigolo-llamaindex/tests/test_client.py
  • packages/wigolo-llamaindex/tests/test_reader.py
  • packages/wigolo-llamaindex/wigolo_llamaindex/__init__.py
  • packages/wigolo-llamaindex/wigolo_llamaindex/client.py
  • packages/wigolo-llamaindex/wigolo_llamaindex/reader.py
  • packages/wigolo-llamaindex/wigolo_llamaindex/types.py
  • packages/wigolo-vercel-ai-sdk/package.json
  • packages/wigolo-vercel-ai-sdk/src/client.ts
  • packages/wigolo-vercel-ai-sdk/src/index.ts
  • packages/wigolo-vercel-ai-sdk/src/tools.ts
  • packages/wigolo-vercel-ai-sdk/src/types.ts
  • packages/wigolo-vercel-ai-sdk/tests/client.test.ts
  • packages/wigolo-vercel-ai-sdk/tests/tools.test.ts
  • packages/wigolo-vercel-ai-sdk/vitest.config.ts
  • packaging/binary/bundle.mjs
  • packaging/binary/pack.sh
  • packaging/binary/react-devtools-core-stub.mjs
  • packaging/homebrew/wigolo.rb
  • packaging/install.sh
  • scripts/gen-legacy-skill-hashes.mjs
  • scripts/release-sponsor-notes.ts
  • scripts/run-sdk-py-tests.mjs
  • scripts/star-chart.mjs
  • scripts/verify-channel-binary.sh
  • scripts/verify-channel-brew.sh
  • scripts/verify-channel-docker.sh
  • scripts/verify-channel-npm.sh
  • scripts/verify-channel-rest.sh
  • scripts/verify-channel-sh.sh
  • scripts/verify-sdks.sh
  • sdks/python/conftest.py
  • sdks/python/src/wigolo/__init__.py
  • sdks/python/src/wigolo/_aio.py
  • sdks/python/src/wigolo/_client.py
  • sdks/python/src/wigolo/_errors.py
  • sdks/python/src/wigolo/_local.py
  • sdks/python/src/wigolo/_manifest.py
  • sdks/python/tests/_fake_serve.py
  • sdks/python/tests/conftest.py
  • sdks/python/tests/test_integration.py
  • sdks/python/tests/test_integration_local.py
  • sdks/python/tests/test_package_build.py
  • sdks/python/tests/test_runtime_drift.py
  • sdks/python/tests/test_unit_async.py
  • sdks/python/tests/test_unit_env_and_surface.py
  • sdks/python/tests/test_unit_local.py
  • sdks/python/tests/test_unit_transport.py
  • sdks/typescript/package.json
  • sdks/typescript/src/client.ts
  • sdks/typescript/src/errors.ts
  • sdks/typescript/src/index.ts
  • sdks/typescript/src/local.ts
  • sdks/typescript/src/manifest.ts
  • sdks/typescript/src/node-shims.d.ts
  • sdks/typescript/src/types.ts
  • sdks/typescript/tests/client.unit.test.ts
  • sdks/typescript/tests/drift.type-test.ts
  • sdks/typescript/tests/embedded.test.ts
  • sdks/typescript/tests/helpers.ts
  • sdks/typescript/tests/integration.test.ts
  • sdks/typescript/tests/local.unit.test.ts
  • sdks/typescript/tests/runtime-drift.test.ts
  • sdks/typescript/tests/serve-harness.ts
  • sdks/typescript/vitest.config.ts
  • site/eslint.config.mjs
  • site/next.config.mjs
  • site/package.json
  • site/postcss.config.mjs
  • site/scripts/indexnow.mjs
  • site/scripts/logo-wall/fetch-logos.mjs
  • site/scripts/logo-wall/mine.mjs
  • site/scripts/logo-wall/normalize.mjs
  • site/scripts/logo-wall/normalize.test.mjs
  • site/scripts/logo-wall/silhouette.mjs
  • site/scripts/logo-wall/silhouette.test.mjs
  • site/scripts/sync-content.mjs
  • site/scripts/sync-content.test.mjs
  • site/src/app/alternatives/[slug]/page.tsx
  • site/src/app/alternatives/page.tsx
  • site/src/app/docs/[[...slug]]/page.tsx
  • site/src/app/docs/layout.tsx
  • site/src/app/go/[slug]/SponsorCard.tsx
  • site/src/app/go/[slug]/SponsorRedirect.tsx
  • site/src/app/go/[slug]/page.tsx
  • site/src/app/layout.tsx
  • site/src/app/llms-full.txt/route.ts
  • site/src/app/llms.txt/route.ts
  • site/src/app/logo-wall.svg/route.ts
  • site/src/app/page.tsx
  • site/src/app/robots.ts
  • site/src/app/search.json/route.ts
  • site/src/app/sitemap.ts
  • site/src/app/sponsors/page.tsx
  • site/src/components/Analytics.tsx
  • site/src/components/AnnouncementBar.tsx
  • site/src/components/FeatureMarquee.tsx
  • site/src/components/Feedback.tsx
  • site/src/components/Footer.tsx
  • site/src/components/Hero.tsx
  • site/src/components/HowItWorks.tsx
  • site/src/components/LogoWall.tsx
  • site/src/components/Nav.tsx
  • site/src/components/OpenSource.tsx
  • site/src/components/Parity.tsx
  • site/src/components/Quickstart.tsx
  • site/src/components/Reveal.tsx
  • site/src/components/SponsorStrip.tsx
  • site/src/components/Sponsors.tsx
  • site/src/components/StartShipping.tsx
  • site/src/components/Stats.tsx
  • site/src/components/Testimonials.tsx
  • site/src/components/Tools.tsx
  • site/src/components/TrustedBy.tsx
  • site/src/components/alternatives/Inline.tsx
  • site/src/components/docs/SearchDialog.tsx
  • site/src/content/alternatives.ts
  • site/src/lib/analytics.ts
  • site/src/lib/jsonld.ts
  • site/src/lib/lastmod.ts
  • site/src/lib/llms.ts
  • site/src/lib/logo-wall.ts
  • site/src/lib/site.ts
  • site/src/lib/source.ts
  • site/src/lib/sponsors.ts
  • site/src/lib/stats.ts
  • site/tests/alternatives.test.ts
  • site/tests/analytics.test.ts
  • site/tests/logo-wall.test.ts
  • site/vitest.config.mts
  • src/agent/executor.ts
  • src/agent/pipeline.ts
  • src/agent/planner.ts
  • src/agent/rank.ts
  • src/agent/relevance.ts
  • src/cache/backfill-embeddings.ts
  • src/cache/change-detector.ts
  • src/cache/db.ts
  • src/cache/diff-engine.ts
  • src/cache/diff-summary.ts
  • src/cache/lcs.ts
  • src/cache/migrations/runner.ts
  • src/cache/sqlite-vec-store.ts
  • src/cache/store.ts
  • src/cli/agents/antigravity.ts
  • src/cli/agents/claude-code.ts
  • src/cli/agents/cline.ts
  • src/cli/agents/codex.ts
  • src/cli/agents/cursor.ts
  • src/cli/agents/gemini-cli.ts
  • src/cli/agents/opencode.ts
  • src/cli/agents/registry.ts
  • src/cli/agents/skills/catalog.ts
  • src/cli/agents/skills/executor.ts
  • src/cli/agents/skills/index.ts
  • src/cli/agents/skills/planner.ts
  • src/cli/agents/skills/receipts.ts
  • src/cli/agents/skills/snapshot.ts
  • src/cli/agents/skills/targets.ts
  • src/cli/agents/skills/types.ts
  • src/cli/agents/utils.ts
  • src/cli/agents/vscode.ts
  • src/cli/agents/windsurf.ts
  • src/cli/agents/zed.ts
  • src/cli/auth.ts
  • src/cli/backfill.ts
  • src/cli/config.ts
  • src/cli/daemon.ts
  • src/cli/doctor.ts
  • src/cli/flag-bridge.ts
  • src/cli/health.ts
  • src/cli/help.ts
  • src/cli/index.ts
  • src/cli/init.ts
  • src/cli/mcp.ts
  • src/cli/ollama-probe.ts
  • src/cli/plugin.ts
  • src/cli/setup-mcp.ts
  • src/cli/shell.ts
  • src/cli/shutdown.ts
  • src/cli/skills.ts
  • src/cli/status.ts
  • src/cli/telemetry.ts
  • src/cli/tool-run.ts
  • src/cli/tui/actions/cache-stats.ts
  • src/cli/tui/actions/cleanup.ts
  • src/cli/tui/actions/compute-storage.ts
  • src/cli/tui/actions/detect-system.ts
  • src/cli/tui/actions/export-import-config.ts
  • src/cli/tui/actions/headless-set.ts
  • src/cli/tui/actions/index.ts
  • src/cli/tui/actions/provider-keys.ts
  • src/cli/tui/actions/setup-status.ts
  • src/cli/tui/actions/types.ts
  • src/cli/tui/actions/uninstall.ts
  • src/cli/tui/actions/verify-e2e.ts
  • src/cli/tui/actions/verify-router.ts
  • src/cli/tui/actions/write-config.ts
  • src/cli/tui/agents-types.ts
  • src/cli/tui/agents.ts
  • src/cli/tui/banner.ts
  • src/cli/tui/components/ActionBar.tsx
  • src/cli/tui/components/Banner.tsx
  • src/cli/tui/components/CategoryScreen.tsx
  • src/cli/tui/components/DashboardExport.tsx
  • src/cli/tui/components/DashboardUninstall.tsx
  • src/cli/tui/components/DoctorScreen.tsx
  • src/cli/tui/components/FieldRenderer.tsx
  • src/cli/tui/components/ImportScreen.tsx
  • src/cli/tui/components/SettingsHome.tsx
  • src/cli/tui/components/Verification.tsx
  • src/cli/tui/components/VerifyScreen.tsx
  • src/cli/tui/components/WizardSteps.tsx
  • src/cli/tui/config-writer-cli.ts
  • src/cli/tui/config-writer-json.ts
  • src/cli/tui/config-writer-toml.ts
  • src/cli/tui/config-writer.ts
  • src/cli/tui/detect-helpers.ts
  • src/cli/tui/entry.ts
  • src/cli/tui/extras-prompt.ts
  • src/cli/tui/flags-types.ts
  • src/cli/tui/flags.ts
  • src/cli/tui/format.ts
  • src/cli/tui/hooks/useVerify.ts
  • src/cli/tui/reporter-auto.ts
  • src/cli/tui/reporter.ts
  • src/cli/tui/router/ink.tsx
  • src/cli/tui/run-command.ts
  • src/cli/tui/schema/advanced.ts
  • src/cli/tui/schema/agents.ts
  • src/cli/tui/schema/browser.ts
  • src/cli/tui/schema/cache.ts
  • src/cli/tui/schema/catalog.ts
  • src/cli/tui/schema/llm.ts
  • src/cli/tui/schema/migrate.ts
  • src/cli/tui/schema/search.ts
  • src/cli/tui/schema/types.ts
  • src/cli/tui/select-agents.ts
  • src/cli/tui/shell/App.tsx
  • src/cli/tui/shell/CommandPalette.tsx
  • src/cli/tui/shell/Footer.tsx
  • src/cli/tui/shell/Header.tsx
  • src/cli/tui/shell/HelpOverlay.tsx
  • src/cli/tui/shell/MainPane.tsx
  • src/cli/tui/shell/Sidebar.tsx
  • src/cli/tui/shell/Spinner.tsx
  • src/cli/tui/shell/palette-index.ts
  • src/cli/tui/shell/width.ts
  • src/cli/tui/state/activity-store-instance.ts
  • src/cli/tui/state/activity-store.ts
  • src/cli/tui/state/agent-install-hints.ts
  • src/cli/tui/state/agent-targets.ts
  • src/cli/tui/state/propagation.ts
  • src/cli/tui/state/required-fields.ts
  • src/cli/tui/state/secret-store.ts
  • src/cli/tui/state/settings-store.ts
  • src/cli/tui/state/toast-store-instance.ts
  • src/cli/tui/state/toast-store.ts
  • src/cli/tui/state/uninstall-signal.ts
  • src/cli/tui/status-agents.ts
  • src/cli/tui/status-cache.ts
  • src/cli/tui/status-format.ts
  • src/cli/tui/status-python.ts
  • src/cli/tui/system-check.ts
  • src/cli/tui/theme/borders.ts
  • src/cli/tui/theme/motion-guard.ts
  • src/cli/tui/theme/motion.ts
  • src/cli/tui/theme/palette.ts
  • src/cli/tui/tui-reporter.ts
  • src/cli/tui/utils/config-writer.ts
  • src/cli/tui/utils/suppress-logs.ts
  • src/cli/tui/verify-suggestions.ts
  • src/cli/tui/verify.ts
  • src/cli/tui/version.ts
  • src/cli/tune.ts
  • src/cli/uninstall.ts
  • src/cli/verify.ts
  • src/cli/warmup.ts
  • src/config.ts
  • src/crawl/crawler.ts
  • src/crawl/dedup.ts
  • src/crawl/etag-incremental.ts
  • src/crawl/index-to-vec.ts
  • src/crawl/mapper.ts
  • src/crawl/rate-limiter.ts
  • src/crawl/robots.ts
  • src/crawl/sitemap-first.ts
  • src/crawl/sitemap.ts
  • src/crawl/url-utils.ts
  • src/daemon/admin-token.ts
  • src/daemon/health-check.ts
  • src/daemon/http-server.ts
  • src/daemon/proxy.ts
  • src/daemon/rest/auth.ts
  • src/daemon/rest/dispatch.ts
  • src/daemon/rest/errors.ts
  • src/daemon/rest/firecrawl-compat.ts
  • src/daemon/rest/limits.ts
  • src/daemon/rest/openapi.ts
  • src/daemon/rest/router.ts
  • src/daemon/rest/target-guard.ts
  • src/daemon/rest/validate.ts
  • src/embedding/background-queue.ts
  • src/embedding/embed.ts
  • src/embedding/fastembed-provider.ts
  • src/embedding/key-terms.ts
  • src/extraction/boilerplate.ts
  • src/extraction/brand-palette.ts
  • src/extraction/brand-provenance.ts
  • src/extraction/brand.ts
  • src/extraction/defuddle.ts
  • src/extraction/div-grid.ts
  • src/extraction/extract.ts
  • src/extraction/jsonld.ts
  • src/extraction/lang-hints.ts
  • src/extraction/list.ts
  • src/extraction/llm-fallback.ts
  • src/extraction/markdown-sanitize.ts
  • src/extraction/markdown.ts
  • src/extraction/metadata.ts
  • src/extraction/pipeline.ts
  • src/extraction/readability.ts
  • src/extraction/schema-truth.ts
  • src/extraction/schema.ts
  • src/extraction/site-extractors/amazon.ts
  • src/extraction/site-extractors/docs-generic.ts
  • src/extraction/site-extractors/github.ts
  • src/extraction/site-extractors/mdn.ts
  • src/extraction/site-extractors/reddit.ts
  • src/extraction/site-extractors/stackoverflow.ts
  • src/extraction/site-extractors/youtube.ts
  • src/extraction/structured-data.ts
  • src/extraction/structured.ts
  • src/extraction/v1/classifier.ts
  • src/extraction/v1/content-root.ts
  • src/extraction/v1/extract-provider.ts
  • src/extraction/v1/local-llm.ts
  • src/extraction/v1/news.ts
  • src/extraction/v1/product.ts
  • src/extraction/v1/recipe.ts
  • src/extraction/v1/routed.ts
  • src/extraction/v1/schemas/Article.ts
  • src/extraction/v1/schemas/CodeSnippet.ts
  • src/extraction/v1/schemas/EventListing.ts
  • src/extraction/v1/schemas/JobPosting.ts
  • src/extraction/v1/schemas/Paper.ts
  • src/extraction/v1/schemas/Product.ts
  • src/extraction/v1/schemas/Recipe.ts
  • src/extraction/v1/schemas/index.ts
  • src/extraction/v1/site-extractors.ts
  • src/fetch/action-executor.ts
  • src/fetch/ai-solve.ts
  • src/fetch/auth.ts
  • src/fetch/auto-pass.ts
  • src/fetch/behavior.ts
  • src/fetch/browser-acquire.ts
  • src/fetch/browser-pool.ts
  • src/fetch/browser-probe.ts
  • src/fetch/browser-selector.ts
  • src/fetch/browser-types.ts
  • src/fetch/cdp-client.ts
  • src/fetch/cdp-direct.ts
  • src/fetch/challenge-classify.ts
  • src/fetch/challenge-completion.ts
  • src/fetch/clearance-reuse.ts
  • src/fetch/content-check.ts
  • src/fetch/error-describe.ts
  • src/fetch/escape-hatch.ts
  • src/fetch/http-client.ts
  • src/fetch/human-solve.ts
  • src/fetch/hydration-probe.ts
  • src/fetch/pinned-dispatcher.ts
  • src/fetch/playwright-tier.ts
  • src/fetch/politeness.ts
  • src/fetch/proxy-credentials.ts
  • src/fetch/reddit-api.ts
  • src/fetch/router.ts
  • src/fetch/scraping-browser.ts
  • src/fetch/settle.ts
  • src/fetch/solve-ladder.ts
  • src/fetch/stealth.ts
  • src/fetch/tls-tier.ts
  • src/index.ts
  • src/instructions.ts
  • src/integrations/cloud/llm/anthropic.ts
  • src/integrations/cloud/llm/cache.ts
  • src/integrations/cloud/llm/custom-backend.ts
  • src/integrations/cloud/llm/gemini.ts
  • src/integrations/cloud/llm/groq.ts
  • src/integrations/cloud/llm/hash.ts
  • src/integrations/cloud/llm/local-tier.ts
  • src/integrations/cloud/llm/model-select.ts
  • src/integrations/cloud/llm/openai.ts
  • src/integrations/cloud/llm/run.ts
  • src/integrations/cloud/llm/select.ts
  • src/integrations/cloud/llm/text-adapters.ts
  • src/integrations/cloud/llm/types.ts
  • src/integrations/cloud/llm/validate.ts
  • src/logger.ts
  • src/pdf-parse.d.ts
  • src/persisted-config.ts
  • src/plugins/loader.ts
  • src/plugins/registry.ts
  • src/plugins/validate.ts
  • src/providers/embed-provider.ts
  • src/providers/extract-provider.ts
  • src/providers/idle-unload.ts
  • src/providers/rerank-provider.ts
  • src/providers/search-provider.ts
  • src/providers/vector-store.ts
  • src/python-env.ts
  • src/repl/commands/agent.ts
  • src/repl/commands/cache.ts
  • src/repl/commands/crawl.ts
  • src/repl/commands/diff.ts
  • src/repl/commands/extract.ts
  • src/repl/commands/fetch.ts
  • src/repl/commands/find-similar.ts
  • src/repl/commands/research.ts
  • src/repl/commands/search.ts
  • src/repl/commands/types.ts
  • src/repl/commands/watch.ts
  • src/repl/completer.ts
  • src/repl/formatters.ts
  • src/repl/parser.ts
  • src/repl/shell.ts
  • src/research/branch-exploration.ts
  • src/research/brief.ts
  • src/research/citation-graph.ts
  • src/research/decompose.ts
  • src/research/entity-extractor.ts
  • src/research/pipeline.ts
  • src/research/render-brief.ts
  • src/research/source-validation.ts
  • src/research/synthesis-local.ts
  • src/research/synthesize.ts
  • src/search/answer-synthesis.ts
  • src/search/content-fetch.ts
  • src/search/context-formatter.ts
  • src/search/core/brand-collision.ts
  • src/search/core/canonical-url.ts
  • src/search/core/context-rank.ts
  • src/search/core/core-provider.ts
  • src/search/core/domain-quality.ts
  • src/search/core/engine-base.ts
  • src/search/core/engine-health.ts
  • src/search/core/engine-quality.ts
  • src/search/core/engine-warnings.ts
  • src/search/core/error-intent.ts
  • src/search/core/favicon.ts
  • src/search/core/freshness.ts
  • src/search/core/intent-router.ts
  • src/search/core/lexical-alignment.ts
  • src/search/core/orchestrator.ts
  • src/search/core/query-expansion.ts
  • src/search/core/query-understanding.ts
  • src/search/core/rare-terms.ts
  • src/search/core/recency-boost.ts
  • src/search/core/recent-cache-dedup.ts
  • src/search/core/rerank-fold.ts
  • src/search/core/rss/feed-config.ts
  • src/search/core/rss/feed-parser.ts
  • src/search/core/rss/feed-poller.ts
  • src/search/core/rss/feed-store.ts
  • src/search/core/rss/rss-engine.ts
  • src/search/core/score-floor.ts
  • src/search/core/text-tokenizer.ts
  • src/search/core/time-range.ts
  • src/search/core/verticals/code.ts
  • src/search/core/verticals/docs.ts
  • src/search/core/verticals/general.ts
  • src/search/core/verticals/images.ts
  • src/search/core/verticals/news.ts
  • src/search/core/verticals/papers.ts
  • src/search/dedup.ts
  • src/search/engines/arxiv.ts
  • src/search/engines/bing-news.ts
  • src/search/engines/bing.ts
  • src/search/engines/brave-image.ts
  • src/search/engines/brave.ts
  • src/search/engines/crates-io.ts
  • src/search/engines/dblp.ts
  • src/search/engines/ddg-image.ts
  • src/search/engines/devdocs.ts
  • src/search/engines/duckduckgo.ts
  • src/search/engines/github-code.ts
  • src/search/engines/hn-algolia.ts
  • src/search/engines/lobsters.ts
  • src/search/engines/marginalia.ts
  • src/search/engines/mdn.ts
  • src/search/engines/mojeek.ts
  • src/search/engines/openalex.ts
  • src/search/engines/openreview.ts
  • src/search/engines/semantic-scholar.ts
  • src/search/engines/stackoverflow.ts
  • src/search/engines/user-agents.ts
  • src/search/engines/wikipedia.ts
  • src/search/evidence.ts
  • src/search/filters.ts
  • src/search/find-similar.ts
  • src/search/find-similar/crawl-rank.ts
  • src/search/find-similar/mode.ts
  • src/search/highlights.ts
  • src/search/hybrid/common-nouns.ts
  • src/search/hybrid/merge.ts
  • src/search/hybrid/router.ts
  • src/search/hybrid/signals.ts
  • src/search/language-filter.ts
  • src/search/legacy/searxng-orchestrator.ts
  • src/search/legacy/searxng-provider.ts
  • src/search/multi-query.ts
  • src/search/query.ts
  • src/search/rerank.ts
  • src/search/reranker/authority-boost.ts
  • src/search/reranker/consensus-boost.ts
  • src/search/reranker/recency-boost.ts
  • src/search/reranker/recency.ts
  • src/search/reranker/remote-rerank-provider.ts
  • src/search/reranker/transformers-rerank-provider.ts
  • src/search/rrf.ts
  • src/search/sampling.ts
  • src/search/searxng.ts
  • src/search/tokens.ts
  • src/search/truncate.ts
  • src/search/url-unwrap.ts
  • src/search/validator.ts
  • src/searxng/bootstrap.ts
  • src/searxng/docker.ts
  • src/searxng/enabled.ts
  • src/searxng/process.ts
  • src/security/key-crypto.ts
  • src/security/key-store.ts
  • src/security/keychain.ts
  • src/server.ts
  • src/server/backend-status.ts
  • src/server/search-response.ts
  • src/server/tool-schemas.ts
  • src/server/warmup-on-start.ts
  • src/tools/agent.ts
  • src/tools/cache.ts
  • src/tools/crawl.ts
  • src/tools/diff.ts
  • src/tools/extract.ts
  • src/tools/fetch.ts
  • src/tools/find-similar.ts
  • src/tools/research.ts
  • src/tools/search.ts
  • src/tools/watch.ts
  • src/types.ts
  • src/util/abort.ts
  • src/util/child-env.ts
  • src/util/engine-list.ts
  • src/util/mode.ts
  • src/util/native-abi.ts
  • src/util/packaged.ts
  • src/util/redact-url.ts
  • src/watch/scheduler.ts
  • src/watch/ssrf.ts
  • src/watch/store.ts
  • tests/e2e/doctor-clean-exit.e2e.test.ts
  • tests/e2e/fetch-tool.test.ts
  • tests/e2e/init-command.e2e.test.ts
  • tests/e2e/mcp-startup.test.ts
  • tests/e2e/search-tool.test.ts
  • tests/e2e/searxng-cold-bootstrap.e2e.test.ts
  • tests/fetch/pinned-dispatcher.test.ts
  • tests/fetch/pinned-e2e.test.ts
  • tests/fetch/pinned-failclosed.test.ts
  • tests/fetch/pinned-rebind.test.ts
  • tests/fetch/pinned-redirect-body.test.ts
  • tests/fetch/pinned-redirect.test.ts
  • tests/fixtures/dump_tokens.py
  • tests/fixtures/plugins/bad-json/package.json
  • tests/fixtures/plugins/invalid-shape/index.mjs
  • tests/fixtures/plugins/invalid-shape/package.json
  • tests/fixtures/plugins/no-main/package.json
  • tests/fixtures/plugins/throws-on-load/index.mjs
  • tests/fixtures/plugins/throws-on-load/package.json
  • tests/fixtures/plugins/valid-both/index.mjs
  • tests/fixtures/plugins/valid-both/package.json
  • tests/fixtures/plugins/valid-extractor/index.mjs
  • tests/fixtures/plugins/valid-extractor/package.json
  • tests/fixtures/plugins/valid-search-engine/index.mjs
  • tests/fixtures/plugins/valid-search-engine/package.json
  • tests/helpers/wait-for.ts
  • tests/integration/agent-defaults-token-discipline.test.ts
  • tests/integration/agent-local-tier.test.ts
  • tests/integration/agent-top-mcp-servers.test.ts
  • tests/integration/agent.test.ts
  • tests/integration/browser-actions.test.ts
  • tests/integration/build-output.test.ts
  • tests/integration/cache-defaults-token-discipline.test.ts
  • tests/integration/cache-tool.test.ts
  • tests/integration/cdp-discovery.test.ts
  • tests/integration/change-detection.test.ts
  • tests/integration/citation-id-stability.test.ts
  • tests/integration/config-writer-fs.test.ts
  • tests/integration/crawl-index-latency.test.ts
  • tests/integration/crawl-pipeline.test.ts
  • tests/integration/crawl/nav-dedupe.test.ts
  • tests/integration/daemon-mode.test.ts
  • tests/integration/embedding-cache-fastembed.test.ts
  • tests/integration/embedding.test.ts
  • tests/integration/extract-pipeline-v1.test.ts
  • tests/integration/extract-pipeline.test.ts
  • tests/integration/extract-schema-evidence-only.test.ts
  • tests/integration/extract-structured.test.ts
  • tests/integration/extract-tables-truncation.test.ts
  • tests/integration/extract-wikipedia-chrome.test.ts
  • tests/integration/extraction-pipeline-structured-data.test.ts
  • tests/integration/extraction/markdown-post-process.test.ts
  • tests/integration/extras-prompt-roundtrip.test.ts
  • tests/integration/fetch-cache-completeness-gate.test.ts
  • tests/integration/fetch-cache-miss.test.ts
  • tests/integration/fetch-method-visibility.test.ts
  • tests/integration/fetch-pdf.test.ts
  • tests/integration/fetch-pipeline.test.ts
  • tests/integration/fetch-router-tuning.test.ts
  • tests/integration/fetch-site-data.test.ts
  • tests/integration/fetch-vs-extract-metadata.test.ts
  • tests/integration/fetch/browser-pool.test.ts
  • tests/integration/fetch/no-lightpanda.test.ts
  • tests/integration/fetch/playwright-tier.test.ts
  • tests/integration/fetch/spa-settle-corpus.test.ts
  • tests/integration/fetch/spa-settle-corpus/fixtures.ts
  • tests/integration/fetch/spa-settle-corpus/server.ts
  • tests/integration/filter-enforcement.test.ts
  • tests/integration/find-similar.test.ts
  • tests/integration/hybrid-mode.test.ts
  • tests/integration/instructions-v3.test.ts
  • tests/integration/llm-fallback-e2e.test.ts
  • tests/integration/llm-fallback-schema.test.ts
  • tests/integration/map-mode.test.ts
  • tests/integration/mode-deep.test.ts
  • tests/integration/multi-browser.test.ts
  • tests/integration/multi-query.test.ts
  • tests/integration/onnx-rerank-e2e.test.ts
  • tests/integration/pipeline-success-criteria.test.ts
  • tests/integration/plugins/plugin-lifecycle.test.ts
  • tests/integration/remote-rerank-pipeline.test.ts
  • tests/integration/repl-e2e.test.ts
  • tests/integration/rerank-pipeline.test.ts
  • tests/integration/research-local-tier.test.ts
  • tests/integration/research.test.ts
  • tests/integration/rest-api.test.ts
  • tests/integration/rest-firecrawl-compat.test.ts
  • tests/integration/rest-tools.test.ts
  • tests/integration/router-stealth.test.ts
  • tests/integration/schema-extract-pipeline.test.ts
  • tests/integration/search-adapter-quality.test.ts
  • tests/integration/search-answer.test.ts
  • tests/integration/search-depth.test.ts
  • tests/integration/search-evidence-default.test.ts
  • tests/integration/search-filtering-pipeline.test.ts
  • tests/integration/search-format-answer-empty.test.ts
  • tests/integration/search-format-answer-slim.test.ts
  • tests/integration/search-language-filter.test.ts
  • tests/integration/search-legacy-parity.test.ts
  • tests/integration/search-pipeline.test.ts
  • tests/integration/search-rerank-fold.test.ts
  • tests/integration/search-rerank-pipeline.test.ts
  • tests/integration/search-s11c-ranking.test.ts
  • tests/integration/search-v1-context.test.ts
  • tests/integration/search-v1-pipeline.test.ts
  • tests/integration/searxng-retry.test.ts
  • tests/integration/setup-roundtrip.test.ts
  • tests/integration/skills-install.test.ts
  • tests/integration/tui-autosave-roundtrip.test.ts
  • tests/integration/tui-narrow-terminal.test.ts
  • tests/integration/tui-shell-integration.test.ts
  • tests/integration/warmup-force.test.ts
  • tests/integration/warmup-tui.test.ts
  • tests/integration/watch/watch-handler.test.ts
  • tests/integration/zero-touch-just-works.test.ts
  • tests/perf/embedding.bench.ts
  • tests/perf/rerank.bench.ts
  • tests/perf/search-v1.bench.ts
  • tests/perf/vector-search.bench.ts
  • tests/setup.ts
  • tests/unit/agent/agent-defaults.test.ts
  • tests/unit/agent/executor.test.ts
  • tests/unit/agent/pipeline.llm-gate-keystore.test.ts
  • tests/unit/agent/pipeline.local-tier.test.ts
  • tests/unit/agent/pipeline.provider-priority.test.ts
  • tests/unit/agent/pipeline.test.ts
  • tests/unit/agent/planner.test.ts
  • tests/unit/agent/rank.test.ts
  • tests/unit/agent/relevance.test.ts
  • tests/unit/benchmarks/agent/evaluator.test.ts
  • tests/unit/benchmarks/agent/metrics.test.ts
  • tests/unit/benchmarks/agent/report.test.ts
  • tests/unit/benchmarks/agent/runner.test.ts
  • tests/unit/benchmarks/agent/task-executor.test.ts
  • tests/unit/benchmarks/extraction/metrics.test.ts
  • tests/unit/benchmarks/extraction/report.test.ts
  • tests/unit/benchmarks/extraction/runner.test.ts
  • tests/unit/benchmarks/extraction/tokenizer.test.ts
  • tests/unit/benchmarks/search/metrics.test.ts
  • tests/unit/benchmarks/search/mock-engine.test.ts
  • tests/unit/benchmarks/search/report.test.ts
  • tests/unit/benchmarks/search/runner.test.ts
  • tests/unit/cache/antibot-clearance.test.ts
  • tests/unit/cache/backfill-embeddings.test.ts
  • tests/unit/cache/change-detector.test.ts
  • tests/unit/cache/clearance-route-secret.test.ts
  • tests/unit/cache/db-embedding.test.ts
  • tests/unit/cache/db-exit-hook.test.ts
  • tests/unit/cache/db-vec-packaged.test.ts
  • tests/unit/cache/db.test.ts
  • tests/unit/cache/diff-engine.test.ts
  • tests/unit/cache/diff-summary.test.ts
  • tests/unit/cache/domain-routing-admin.test.ts
  • tests/unit/cache/lcs.test.ts
  • tests/unit/cache/migrations-runner.test.ts
  • tests/unit/cache/sanitize-fts-query.test.ts
  • tests/unit/cache/sqlite-vec-store.test.ts
  • tests/unit/cache/stale-window.test.ts
  • tests/unit/cache/store-embedding.test.ts
  • tests/unit/cache/store-search-key.test.ts
  • tests/unit/cache/store.test.ts
  • tests/unit/cache/tls-routing.test.ts
  • tests/unit/cli/agents/agent-support-consistency.test.ts
  • tests/unit/cli/agents/claude-code.test.ts
  • tests/unit/cli/agents/cline.test.ts
  • tests/unit/cli/agents/codex.test.ts
  • tests/unit/cli/agents/opencode.test.ts
  • tests/unit/cli/agents/registry.test.ts
  • tests/unit/cli/agents/skills-content.test.ts
  • tests/unit/cli/agents/skills/catalog.test.ts
  • tests/unit/cli/agents/skills/executor.test.ts
  • tests/unit/cli/agents/skills/planner.test.ts
  • tests/unit/cli/agents/skills/receipts.test.ts
  • tests/unit/cli/agents/skills/targets.test.ts
  • tests/unit/cli/agents/utils.test.ts
  • tests/unit/cli/agents/vscode.test.ts
  • tests/unit/cli/agents/windsurf.test.ts
  • tests/unit/cli/agents/zed.test.ts
  • tests/unit/cli/auth.test.ts
  • tests/unit/cli/config-dispatch.test.ts
  • tests/unit/cli/config.test.ts
  • tests/unit/cli/daemon.test.ts
  • tests/unit/cli/doctor-engine-health.test.ts
  • tests/unit/cli/doctor-fixes.test.ts
  • tests/unit/cli/doctor-isolated.test.ts
  • tests/unit/cli/doctor-lazy.test.ts
  • tests/unit/cli/doctor-ollama.test.ts
  • tests/unit/cli/doctor-provider.test.ts
  • tests/unit/cli/doctor-tls-tier.test.ts
  • tests/unit/cli/doctor.test.ts
  • tests/unit/cli/flag-bridge.test.ts
  • tests/unit/cli/health.test.ts
  • tests/unit/cli/help-completeness.test.ts
  • tests/unit/cli/help.test.ts
  • tests/unit/cli/index.test.ts
  • tests/unit/cli/init-non-interactive.test.ts
  • tests/unit/cli/init-ollama-hint.test.ts
  • tests/unit/cli/init-packaged-binary.test.ts
  • tests/unit/cli/init.test.ts
  • tests/unit/cli/json-contracts.test.ts
  • tests/unit/cli/ollama-probe.test.ts
  • tests/unit/cli/plugin.test.ts
  • tests/unit/cli/router-config.test.ts
  • tests/unit/cli/setup-mcp-integration.test.ts
  • tests/unit/cli/setup-mcp-non-interactive.test.ts
  • tests/unit/cli/setup-mcp.test.ts
  • tests/unit/cli/shell.test.ts
  • tests/unit/cli/skills-command.test.ts
  • tests/unit/cli/status.test.ts
  • tests/unit/cli/telemetry.test.ts
  • tests/unit/cli/tool-flag-parity.test.ts
  • tests/unit/cli/tool-run.test.ts
  • tests/unit/cli/tui/actions/cache-stats.test.ts
  • tests/unit/cli/tui/actions/cleanup.test.ts
  • tests/unit/cli/tui/actions/compute-storage.test.ts
  • tests/unit/cli/tui/actions/detect-system.test.ts
  • tests/unit/cli/tui/actions/export-import-config.test.ts
  • tests/unit/cli/tui/actions/headless-set.test.ts
  • tests/unit/cli/tui/actions/mcp-stdio-no-ink.test.ts
  • tests/unit/cli/tui/actions/provider-actions.test.ts
  • tests/unit/cli/tui/actions/uninstall.test.ts
  • tests/unit/cli/tui/actions/write-config-no-silent.test.ts
  • tests/unit/cli/tui/actions/write-config.test.ts
  • tests/unit/cli/tui/agents.test.ts
  • tests/unit/cli/tui/banner.test.ts
  • tests/unit/cli/tui/banner.test.tsx
  • tests/unit/cli/tui/components/ActionBar.test.tsx
  • tests/unit/cli/tui/components/CategoryScreen.blur.test.tsx
  • tests/unit/cli/tui/components/CategoryScreen.test.tsx
  • tests/unit/cli/tui/components/DoctorScreen.test.tsx
  • tests/unit/cli/tui/components/FieldRenderer.enter-select.test.tsx
  • tests/unit/cli/tui/components/FieldRenderer.saved-check.test.tsx
  • tests/unit/cli/tui/components/FieldRenderer.test.tsx
  • tests/unit/cli/tui/components/ImportScreen.test.tsx
  • tests/unit/cli/tui/components/SettingsHome.multiselect-preview.test.tsx
  • tests/unit/cli/tui/components/SettingsHome.quit.test.tsx
  • tests/unit/cli/tui/components/SettingsHome.test.tsx
  • tests/unit/cli/tui/components/SettingsHome.threeway.test.tsx
  • tests/unit/cli/tui/components/VerifyScreen.test.tsx
  • tests/unit/cli/tui/components/WizardSteps.ceremony.test.tsx
  • tests/unit/cli/tui/components/WizardSteps.continue-quit.test.tsx
  • tests/unit/cli/tui/components/WizardSteps.test.tsx
  • tests/unit/cli/tui/config-force-wizard.test.ts
  • tests/unit/cli/tui/config-writer-cli.test.ts
  • tests/unit/cli/tui/config-writer-json.test.ts
  • tests/unit/cli/tui/config-writer-toml.test.ts
  • tests/unit/cli/tui/config-writer.test.ts
  • tests/unit/cli/tui/dashboard-screens.test.tsx
  • tests/unit/cli/tui/detect-helpers.test.ts
  • tests/unit/cli/tui/entry-required-fields.test.ts
  • tests/unit/cli/tui/entry.test.ts
  • tests/unit/cli/tui/extras-prompt.test.ts
  • tests/unit/cli/tui/flags.test.ts
  • tests/unit/cli/tui/format.test.ts
  • tests/unit/cli/tui/init-config-writer.test.ts
  • tests/unit/cli/tui/mount-root-phase-sync.test.tsx
  • tests/unit/cli/tui/plain-override.test.ts
  • tests/unit/cli/tui/reporter-auto.test.ts
  • tests/unit/cli/tui/reporter.test.ts
  • tests/unit/cli/tui/router/entry-wire.test.tsx
  • tests/unit/cli/tui/router/ink-root.apply-verify.test.tsx
  • tests/unit/cli/tui/router/ink-root.phase3-integration.test.tsx
  • tests/unit/cli/tui/router/ink-root.save-state.test.tsx
  • tests/unit/cli/tui/router/ink-root.test.tsx
  • tests/unit/cli/tui/run-command.test.ts
  • tests/unit/cli/tui/schema/advanced.test.ts
  • tests/unit/cli/tui/schema/agents.test.ts
  • tests/unit/cli/tui/schema/browser.test.ts
  • tests/unit/cli/tui/schema/cache.test.ts
  • tests/unit/cli/tui/schema/catalog.test.ts
  • tests/unit/cli/tui/schema/llm-no-custom.test.ts
  • tests/unit/cli/tui/schema/llm.test.ts
  • tests/unit/cli/tui/schema/migrate.test.ts
  • tests/unit/cli/tui/schema/search.test.ts
  • tests/unit/cli/tui/schema/types.test.ts
  • tests/unit/cli/tui/select-agents.test.ts
  • tests/unit/cli/tui/shell/App.test.tsx
  • tests/unit/cli/tui/shell/CommandPalette.test.tsx
  • tests/unit/cli/tui/shell/CommandPalette.width.test.tsx
  • tests/unit/cli/tui/shell/Footer.test.tsx
  • tests/unit/cli/tui/shell/Header.liveness.test.tsx
  • tests/unit/cli/tui/shell/Header.test.tsx
  • tests/unit/cli/tui/shell/HelpOverlay.test.tsx
  • tests/unit/cli/tui/shell/HelpOverlay.width.test.tsx
  • tests/unit/cli/tui/shell/MainPane.test.tsx
  • tests/unit/cli/tui/shell/MainPane.transition.test.tsx
  • tests/unit/cli/tui/shell/Sidebar.pulse.test.tsx
  • tests/unit/cli/tui/shell/Sidebar.quit.test.tsx
  • tests/unit/cli/tui/shell/Sidebar.test.tsx
  • tests/unit/cli/tui/shell/Spinner.test.tsx
  • tests/unit/cli/tui/shell/palette-index.test.ts
  • tests/unit/cli/tui/shell/width.test.ts
  • tests/unit/cli/tui/state/activity-store.test.ts
  • tests/unit/cli/tui/state/agent-install-hints.test.ts
  • tests/unit/cli/tui/state/agent-targets.test.ts
  • 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
  • tests/unit/cli/tui/state/settings-store.blur.test.ts
  • tests/unit/cli/tui/state/settings-store.test.ts
  • tests/unit/cli/tui/state/settings-store.toast.test.ts
  • tests/unit/cli/tui/state/toast-store.action.test.ts
  • tests/unit/cli/tui/state/toast-store.test.ts
  • tests/unit/cli/tui/state/uninstall-signal.test.ts
  • tests/unit/cli/tui/status-agents.test.ts
  • tests/unit/cli/tui/status-cache.test.ts
  • tests/unit/cli/tui/status-format.test.ts
  • tests/unit/cli/tui/status-python.test.ts
  • tests/unit/cli/tui/system-check.test.ts
  • tests/unit/cli/tui/theme/borders.test.ts
  • tests/unit/cli/tui/theme/motion-guard.test.ts
  • tests/unit/cli/tui/theme/motion.test.ts
  • tests/unit/cli/tui/theme/palette.test.ts
  • tests/unit/cli/tui/tui-reporter.test.ts
  • tests/unit/cli/tui/verification.test.tsx
  • tests/unit/cli/tui/verify-suggestions.test.ts
  • tests/unit/cli/tui/verify.test.ts
  • tests/unit/cli/tui/version.test.ts
  • tests/unit/cli/tune.test.ts
  • tests/unit/cli/uninstall.test.ts
  • tests/unit/cli/verify-command.test.ts
  • tests/unit/cli/warmup-browser-deps.test.ts
  • tests/unit/cli/warmup-embedding.test.ts
  • tests/unit/cli/warmup-firefox.test.ts
  • tests/unit/cli/warmup-force.test.ts
  • tests/unit/cli/warmup-local-llm.test.ts
  • tests/unit/cli/warmup-python-env.test.ts
  • tests/unit/cli/warmup-setup-json-contract.test.ts
  • tests/unit/cli/warmup-verify.test.ts
  • tests/unit/cli/warmup.test.ts
  • tests/unit/config-persistence.test.ts
  • tests/unit/config-search-budgets.test.ts
  • tests/unit/config.test.ts
  • tests/unit/config/crawl-pacing.test.ts
  • tests/unit/config/hardcore-mode.test.ts
  • tests/unit/config/proxy-credential-persistence.test.ts
  • tests/unit/config/proxy-credential-resolve.test.ts
  • tests/unit/config/reddit-credentials.test.ts
  • tests/unit/crawl/crawler.test.ts
  • tests/unit/crawl/dedup.test.ts
  • tests/unit/crawl/etag-incremental.test.ts
  • tests/unit/crawl/index-to-vec.test.ts
  • tests/unit/crawl/mapper.test.ts
  • tests/unit/crawl/rate-limiter.test.ts
  • tests/unit/crawl/robots.test.ts
  • tests/unit/crawl/sitemap-first.test.ts
  • tests/unit/crawl/sitemap.test.ts
  • tests/unit/crawl/url-utils.test.ts
  • tests/unit/daemon/admin-reset-integration.test.ts
  • tests/unit/daemon/admin-token.test.ts
  • tests/unit/daemon/firecrawl-compat.test.ts
  • tests/unit/daemon/health-check.test.ts
  • tests/unit/daemon/http-server.test.ts
  • tests/unit/daemon/proxy.test.ts
  • tests/unit/daemon/rest-auth.test.ts
  • tests/unit/daemon/rest-dispatch.test.ts
  • tests/unit/daemon/rest-errors.test.ts
  • tests/unit/daemon/rest-limits.test.ts
  • tests/unit/daemon/rest-openapi.test.ts
  • tests/unit/daemon/rest-router.test.ts
  • tests/unit/daemon/rest-target-guard.test.ts
  • tests/unit/daemon/rest-validate.test.ts
  • tests/unit/documentation/docker-image-tags.test.ts
  • tests/unit/embedding/background-queue.test.ts
  • tests/unit/embedding/embed-provider-resolution.test.ts
  • tests/unit/embedding/embed.test.ts
  • tests/unit/embedding/fastembed-provider-dispose.test.ts
  • tests/unit/embedding/fastembed-provider.test.ts
  • tests/unit/embedding/key-terms.test.ts
  • tests/unit/extraction/boilerplate.test.ts
  • tests/unit/extraction/brand-async.test.ts
  • tests/unit/extraction/brand-fixtures.test.ts
  • tests/unit/extraction/brand-fonts-acceptance.test.ts
  • tests/unit/extraction/brand-honesty.test.ts
  • tests/unit/extraction/brand-palette.test.ts
  • tests/unit/extraction/brand.test.ts
  • tests/unit/extraction/content-root.test.ts
  • tests/unit/extraction/defuddle.test.ts
  • tests/unit/extraction/extract.test.ts
  • tests/unit/extraction/interleaved-binding.test.ts
  • tests/unit/extraction/jsonld.test.ts
  • tests/unit/extraction/lang-hints.test.ts
  • tests/unit/extraction/list-detector.test.ts
  • tests/unit/extraction/listing-vs-grid-regression.test.ts
  • tests/unit/extraction/llm-fallback.test.ts
  • tests/unit/extraction/llm/anthropic.test.ts
  • tests/unit/extraction/llm/cache.test.ts
  • tests/unit/extraction/llm/gemini.test.ts
  • tests/unit/extraction/llm/groq.test.ts
  • tests/unit/extraction/llm/hash.test.ts
  • tests/unit/extraction/llm/openai.test.ts
  • tests/unit/extraction/llm/select.test.ts
  • tests/unit/extraction/llm/types.test.ts
  • tests/unit/extraction/markdown-sanitize.test.ts
  • tests/unit/extraction/markdown.test.ts
  • tests/unit/extraction/readability.test.ts
  • tests/unit/extraction/schema-confidence.test.ts
  • tests/unit/extraction/schema-evidence-only.test.ts
  • tests/unit/extraction/schema-truth-perf.test.ts
  • tests/unit/extraction/schema.test.ts
  • tests/unit/extraction/site-extractors/amazon.test.ts
  • tests/unit/extraction/site-extractors/docs-generic.test.ts
  • tests/unit/extraction/site-extractors/github.test.ts
  • tests/unit/extraction/site-extractors/mdn.test.ts
  • tests/unit/extraction/site-extractors/reddit.test.ts
  • tests/unit/extraction/site-extractors/stackoverflow.test.ts
  • tests/unit/extraction/site-extractors/youtube.test.ts
  • tests/unit/extraction/structured-data-logging.test.ts
  • tests/unit/extraction/structured-data.test.ts
  • tests/unit/extraction/structured.test.ts
  • tests/unit/extraction/v1/classifier.test.ts
  • tests/unit/extraction/v1/news.test.ts
  • tests/unit/extraction/v1/pdf.test.ts
  • tests/unit/extraction/v1/product.test.ts
  • tests/unit/extraction/v1/recipe.test.ts
  • tests/unit/extraction/v1/routed.test.ts
  • tests/unit/extraction/v1/schemas/Article.test.ts
  • tests/unit/extraction/v1/schemas/CodeSnippet.test.ts
  • tests/unit/extraction/v1/schemas/EventListing.test.ts
  • tests/unit/extraction/v1/schemas/JobPosting.test.ts
  • tests/unit/extraction/v1/schemas/Paper.test.ts
  • tests/unit/extraction/v1/schemas/Product.test.ts
  • tests/unit/extraction/v1/schemas/Recipe.test.ts
  • tests/unit/extraction/v1/schemas/index.test.ts
  • tests/unit/extraction/v1/schemas/local-llm.test.ts
  • tests/unit/fetch/action-executor.test.ts
  • tests/unit/fetch/ai-solve.test.ts
  • tests/unit/fetch/auth.test.ts
  • tests/unit/fetch/auto-pass.test.ts
  • tests/unit/fetch/behavior-slow-runner.test.ts
  • tests/unit/fetch/behavior.test.ts
  • tests/unit/fetch/browser-acquire.test.ts
  • tests/unit/fetch/browser-pool-multi.test.ts
  • tests/unit/fetch/browser-pool.abort.test.ts
  • tests/unit/fetch/browser-pool.cdp-direct.test.ts
  • tests/unit/fetch/browser-pool.challenge.test.ts
  • tests/unit/fetch/browser-pool.channel.test.ts
  • tests/unit/fetch/browser-pool.clearance.test.ts
  • tests/unit/fetch/browser-pool.download.test.ts
  • tests/unit/fetch/browser-pool.driver-fallback.test.ts
  • tests/unit/fetch/browser-pool.humanize.test.ts
  • tests/unit/fetch/browser-pool.hydration.test.ts
  • tests/unit/fetch/browser-pool.image-subtype.test.ts
  • tests/unit/fetch/browser-pool.navigating.test.ts
  • tests/unit/fetch/browser-pool.proxy.test.ts
  • tests/unit/fetch/browser-pool.scraping-browser.test.ts
  • tests/unit/fetch/browser-pool.stealth.test.ts
  • tests/unit/fetch/browser-pool.timeout.test.ts
  • tests/unit/fetch/browser-pool.widget-locate-budget.test.ts
  • tests/unit/fetch/browser-probe.test.ts
  • tests/unit/fetch/browser-selector.test.ts
  • tests/unit/fetch/browser-types.test.ts
  • tests/unit/fetch/cdp-client.test.ts
  • tests/unit/fetch/cdp-direct-discover-retry.test.ts
  • tests/unit/fetch/cdp-direct-egress-policy.test.ts
  • tests/unit/fetch/cdp-direct-fetch.test.ts
  • tests/unit/fetch/cdp-direct-identity.test.ts
  • tests/unit/fetch/cdp-direct.test.ts
  • tests/unit/fetch/challenge-classify.test.ts
  • tests/unit/fetch/challenge-completion.test.ts
  • tests/unit/fetch/challenge-status-distinguishable.test.ts
  • tests/unit/fetch/clearance-major-drift.test.ts
  • tests/unit/fetch/clearance-reuse.test.ts
  • tests/unit/fetch/content-check.test.ts
  • tests/unit/fetch/error-describe.test.ts
  • tests/unit/fetch/escape-hatch.test.ts
  • tests/unit/fetch/http-client.test.ts
  • tests/unit/fetch/human-solve.test.ts
  • tests/unit/fetch/hydration-probe.test.ts
  • tests/unit/fetch/playwright-tier.hydration-gate.test.ts
  • tests/unit/fetch/politeness.test.ts
  • tests/unit/fetch/proxy-credentials.test.ts
  • tests/unit/fetch/reddit-api.test.ts
  • tests/unit/fetch/reddit-url-fidelity.test.ts
  • tests/unit/fetch/redirect-guard.test.ts
  • tests/unit/fetch/resource-leak-guards.test.ts
  • tests/unit/fetch/router-antibot-domains.test.ts
  • tests/unit/fetch/router-browser-acquire.test.ts
  • tests/unit/fetch/router-challenge-status.test.ts
  • tests/unit/fetch/router-clearance-route-gate.test.ts
  • tests/unit/fetch/router-clearance.test.ts
  • tests/unit/fetch/router-escalation-tuning.test.ts
  • tests/unit/fetch/router-escape-hatch.test.ts
  • tests/unit/fetch/router-mode.test.ts
  • tests/unit/fetch/router-politeness.test.ts
  • tests/unit/fetch/router-reddit-api.test.ts
  • tests/unit/fetch/router-stealth.test.ts
  • tests/unit/fetch/router-tls.test.ts
  • tests/unit/fetch/router.test.ts
  • tests/unit/fetch/scraping-browser.test.ts
  • tests/unit/fetch/settle.test.ts
  • tests/unit/fetch/solve-ladder.test.ts
  • tests/unit/fetch/stealth-driver-test-isolation.test.ts
  • tests/unit/fetch/stealth-driver.test.ts
  • tests/unit/fetch/stealth.test.ts
  • tests/unit/fetch/tls-tier.test.ts
  • tests/unit/help-overlay.test.tsx
  • tests/unit/helpers/wait-for.test.ts
  • tests/unit/init-flags.test.ts
  • tests/unit/instructions-v3.test.ts
  • tests/unit/instructions.test.ts
  • tests/unit/integrations/cloud/llm/text-adapters-vision.test.ts
  • tests/unit/integrations/custom-backend.test.ts
  • tests/unit/integrations/llm-retry.test.ts
  • tests/unit/integrations/llm-runner.test.ts
  • tests/unit/integrations/llm-select-seam.test.ts
  • tests/unit/integrations/local-tier.test.ts
  • tests/unit/logger-suppression.test.ts
  • tests/unit/logger.test.ts
  • tests/unit/mcp-description-budget.test.ts
  • tests/unit/package-deps.test.ts
  • tests/unit/package-metadata.test.ts
  • tests/unit/persisted-config.test.ts
  • tests/unit/plugins/example-search-engine.test.ts
  • tests/unit/plugins/loader.test.ts
  • tests/unit/plugins/registry.test.ts
  • tests/unit/plugins/validate.test.ts
  • tests/unit/providers/embed-provider-factory.test.ts
  • tests/unit/providers/extract-provider-factory.test.ts
  • tests/unit/providers/idle-unload.test.ts
  • tests/unit/providers/provider-idle-unload.test.ts
  • tests/unit/providers/rerank-provider-factory.test.ts
  • tests/unit/providers/search-provider-factory.test.ts
  • tests/unit/providers/vector-store-factory.test.ts
  • tests/unit/python-env-resolve.test.ts
  • tests/unit/python-env-venv.test.ts
  • tests/unit/python-env.test.ts
  • tests/unit/repl/commands/agent.test.ts
  • tests/unit/repl/commands/cache.test.ts
  • tests/unit/repl/commands/crawl.test.ts
  • tests/unit/repl/commands/diff.test.ts
  • tests/unit/repl/commands/extract.test.ts
  • tests/unit/repl/commands/fetch.test.ts
  • tests/unit/repl/commands/find-similar.test.ts
  • tests/unit/repl/commands/research.test.ts
  • tests/unit/repl/commands/search.test.ts
  • tests/unit/repl/commands/watch.test.ts
  • tests/unit/repl/completer.test.ts
  • tests/unit/repl/formatters.test.ts
  • tests/unit/repl/parser.test.ts
  • tests/unit/repl/shell-history-mode.test.ts
  • tests/unit/repl/shell.test.ts
  • tests/unit/research/branch-exploration.test.ts
  • tests/unit/research/brief.test.ts
  • tests/unit/research/citation-graph.test.ts
  • tests/unit/research/decompose.test.ts
  • tests/unit/research/entity-extractor.test.ts
  • tests/unit/research/gap-detection.test.ts
  • tests/unit/research/pipeline-breadth.test.ts
  • tests/unit/research/pipeline-budget.test.ts
  • tests/unit/research/pipeline-score-floor.test.ts
  • tests/unit/research/pipeline-shell-completeness.test.ts
  • tests/unit/research/pipeline-source-validation.test.ts
  • tests/unit/research/pipeline.llm-gate-keystore.test.ts
  • tests/unit/research/pipeline.local-tier.test.ts
  • tests/unit/research/pipeline.test.ts
  • tests/unit/research/render-brief.test.ts
  • tests/unit/research/source-validation.test.ts
  • tests/unit/research/synthesis-local.test.ts
  • tests/unit/research/synthesize.test.ts
  • tests/unit/response-time.test.ts
  • tests/unit/search/answer-fallback.test.ts
  • tests/unit/search/answer-synthesis-quota.test.ts
  • tests/unit/search/answer-synthesis.provider-priority.test.ts
  • tests/unit/search/answer-synthesis.test.ts
  • tests/unit/search/authority-boost.aliases.test.ts
  • tests/unit/search/authority-boost.cap.test.ts
  • tests/unit/search/brand-collision-warning.test.ts
  • tests/unit/search/burst-cascade.test.ts
  • tests/unit/search/content-fetch.test.ts
  • tests/unit/search/context-formatter.test.ts
  • tests/unit/search/core/canonical-url.test.ts
  • tests/unit/search/core/code-routing.test.ts
  • tests/unit/search/core/core-provider-collision-dispatch.test.ts
  • tests/unit/search/core/core-provider-error-intent.test.ts
  • tests/unit/search/core/core-provider-kept-zero.test.ts
  • tests/unit/search/core/core-provider-rare-variant.test.ts
  • tests/unit/search/core/core-provider-recency-backfill.test.ts
  • tests/unit/search/core/core-provider-score-floor.test.ts
  • tests/unit/search/core/core-provider-tier-budgets.test.ts
  • tests/unit/search/core/date-window.test.ts
  • tests/unit/search/core/domain-quality.test.ts
  • tests/unit/search/core/engine-quality.test.ts
  • tests/unit/search/core/error-intent.test.ts
  • tests/unit/search/core/lexical-alignment.test.ts
  • tests/unit/search/core/orchestrator-cache.test.ts
  • tests/unit/search/core/orchestrator-rank.test.ts
  • tests/unit/search/core/query-expansion.test.ts
  • tests/unit/search/core/rare-terms.test.ts
  • tests/unit/search/core/rerank-fold.test.ts
  • tests/unit/search/core/score-floor-per-engine.test.ts
  • tests/unit/search/core/score-floor.test.ts
  • tests/unit/search/core/text-tokenizer.test.ts
  • tests/unit/search/country.test.ts
  • tests/unit/search/dedup.test.ts
  • tests/unit/search/degraded-recovery.test.ts
  • tests/unit/search/engine-breaker.test.ts
  • tests/unit/search/engine-health.test.ts
  • tests/unit/search/engine-quality.test.ts
  • tests/unit/search/engine-soft-deadline.test.ts
  • tests/unit/search/engine-telemetry.test.ts
  • tests/unit/search/engine-throttle.test.ts
  • tests/unit/search/engine-warnings.test.ts
  • tests/unit/search/engines-used-semantics.test.ts
  • tests/unit/search/engines/arxiv.test.ts
  • tests/unit/search/engines/bing-decoder.test.ts
  • tests/unit/search/engines/bing-news.test.ts
  • tests/unit/search/engines/bing.test.ts
  • tests/unit/search/engines/brave-image.test.ts
  • tests/unit/search/engines/brave.test.ts
  • tests/unit/search/engines/crates-io.test.ts
  • tests/unit/search/engines/date-parsing.test.ts
  • tests/unit/search/engines/dblp.test.ts
  • tests/unit/search/engines/ddg-image.test.ts
  • tests/unit/search/engines/devdocs.test.ts
  • tests/unit/search/engines/duckduckgo.test.ts
  • tests/unit/search/engines/github-code.test.ts
  • tests/unit/search/engines/hn-algolia.test.ts
  • tests/unit/search/engines/lobsters.test.ts
  • tests/unit/search/engines/marginalia.test.ts
  • tests/unit/search/engines/mdn.test.ts
  • tests/unit/search/engines/mojeek.test.ts
  • tests/unit/search/engines/openalex.test.ts
  • tests/unit/search/engines/openreview.test.ts
  • tests/unit/search/engines/semantic-scholar.test.ts
  • tests/unit/search/engines/stackoverflow.test.ts
  • tests/unit/search/engines/wikipedia.test.ts
  • tests/unit/search/evidence-default.test.ts
  • tests/unit/search/evidence-score.test.ts
  • tests/unit/search/evidence-token-discipline.test.ts
  • tests/unit/search/evidence.test.ts
  • tests/unit/search/exact-match-pre-dedup.test.ts
  • tests/unit/search/exact-match.test.ts
  • tests/unit/search/exclude-domains.test.ts
  • tests/unit/search/expand-query.test.ts
  • tests/unit/search/favicon.test.ts
  • tests/unit/search/filters.test.ts
  • tests/unit/search/find-similar-embedding.test.ts
  • tests/unit/search/find-similar-threshold.test.ts
  • tests/unit/search/find-similar.test.ts
  • tests/unit/search/find-similar/crawl-rank.test.ts
  • tests/unit/search/find-similar/generate-search-queries.test.ts
  • tests/unit/search/find-similar/mode.test.ts
  • tests/unit/search/format-rename.test.ts
  • tests/unit/search/freshness.test.ts
  • tests/unit/search/highlights-evidence.test.ts
  • tests/unit/search/highlights.test.ts
  • tests/unit/search/hybrid/merge.test.ts
  • tests/unit/search/hybrid/router.test.ts
  • tests/unit/search/hybrid/signals.test.ts
  • tests/unit/search/include-domains-hard-filter.test.ts
  • tests/unit/search/include-images.test.ts
  • tests/unit/search/language-filter.test.ts
  • tests/unit/search/mojeek-probe-only.test.ts
  • tests/unit/search/multi-query.decompose.test.ts
  • tests/unit/search/multi-query.test.ts
  • tests/unit/search/passage-spans.test.ts
  • tests/unit/search/query-understanding.test.ts
  • tests/unit/search/query.test.ts
  • tests/unit/search/remote-rerank-provider.test.ts
  • tests/unit/search/rerank-recency.test.ts
  • tests/unit/search/rerank.test.ts
  • tests/unit/search/reranker/consensus-boost.test.ts
  • tests/unit/search/reranker/recency.test.ts
  • tests/unit/search/reranker/transformers-rerank-provider-errors.test.ts
  • tests/unit/search/rrf.test.ts
  • tests/unit/search/sampling.test.ts
  • tests/unit/search/searxng-filtering.test.ts
  • tests/unit/search/searxng-orchestrator-strip.test.ts
  • tests/unit/search/searxng.test.ts
  • tests/unit/search/time-range.test.ts
  • tests/unit/search/tokens.test.ts
  • tests/unit/search/transformers-rerank-provider.test.ts
  • tests/unit/search/truncate.test.ts
  • tests/unit/search/url-unwrap.test.ts
  • tests/unit/search/v1/context-rank.test.ts
  • tests/unit/search/v1/engine-base.test.ts
  • tests/unit/search/v1/intent-router.test.ts
  • tests/unit/search/v1/orchestrator.test.ts
  • tests/unit/search/v1/recency-boost.test.ts
  • tests/unit/search/v1/recent-cache-dedup.test.ts
  • tests/unit/search/v1/rss/feed-config.test.ts
  • tests/unit/search/v1/rss/feed-parser.test.ts
  • tests/unit/search/v1/rss/feed-poller.test.ts
  • tests/unit/search/v1/rss/feed-store.test.ts
  • tests/unit/search/v1/rss/rss-engine.test.ts
  • tests/unit/search/v1/v1-provider.test.ts
  • tests/unit/search/v1/verticals/code.test.ts
  • tests/unit/search/v1/verticals/docs.test.ts
  • tests/unit/search/v1/verticals/general.test.ts
  • tests/unit/search/v1/verticals/news.test.ts
  • tests/unit/search/v1/verticals/papers.test.ts
  • tests/unit/search/validator.test.ts
  • tests/unit/searxng/bootstrap-lock.test.ts
  • tests/unit/searxng/bootstrap-retry.test.ts
  • tests/unit/searxng/bootstrap.test.ts
  • tests/unit/searxng/docker.test.ts
  • tests/unit/searxng/enabled.test.ts
  • tests/unit/searxng/process-health.test.ts
  • tests/unit/searxng/process-lock.test.ts
  • tests/unit/searxng/process.test.ts
  • tests/unit/security/key-crypto.test.ts
  • tests/unit/security/key-store.test.ts
  • tests/unit/server/backend-status-bootstrapping.test.ts
  • tests/unit/server/backend-status.test.ts
  • tests/unit/server/format-schema.test.ts
  • tests/unit/server/instructions.test.ts
  • tests/unit/server/schema-registration.test.ts
  • tests/unit/server/search-response.test.ts
  • tests/unit/server/server-factory.test.ts
  • tests/unit/server/tool-annotations.test.ts
  • tests/unit/server/tool-schemas.test.ts
  • tests/unit/server/warmup-on-start.test.ts
  • tests/unit/setup-status.test.ts
  • tests/unit/skill-md.test.ts
  • tests/unit/sponsors-links.test.ts
  • tests/unit/tools/agent.test.ts
  • tests/unit/tools/cache-hybrid.test.ts
  • tests/unit/tools/cache.test.ts
  • tests/unit/tools/crawl-map-routing.test.ts
  • tests/unit/tools/crawl.test.ts
  • tests/unit/tools/diff.test.ts
  • tests/unit/tools/extract.body-retained.test.ts
  • tests/unit/tools/extract.test.ts
  • tests/unit/tools/fetch-embedding.test.ts
  • tests/unit/tools/fetch-mode.test.ts
  • tests/unit/tools/fetch.challenge-provenance.test.ts
  • tests/unit/tools/fetch.http-error.test.ts
  • tests/unit/tools/fetch.silent-failures.test.ts
  • tests/unit/tools/fetch.stealth-cache-bypass.test.ts
  • tests/unit/tools/fetch.test.ts
  • tests/unit/tools/find-similar.test.ts
  • tests/unit/tools/max-tokens-out.test.ts
  • tests/unit/tools/research.test.ts
  • tests/unit/tools/search-answer.test.ts
  • tests/unit/tools/search-cache-embed.test.ts
  • tests/unit/tools/search-filtering.test.ts
  • tests/unit/tools/search-max-content-chars.test.ts
  • tests/unit/tools/search-mode.test.ts
  • tests/unit/tools/search-multi-query.test.ts
  • tests/unit/tools/search-timing.test.ts
  • tests/unit/tools/search-warning.test.ts
  • tests/unit/tools/search.engine-warnings.test.ts
  • tests/unit/tools/search.images.test.ts
  • tests/unit/tools/search.long-tail-engines.test.ts
  • tests/unit/tools/search.test.ts
  • tests/unit/tui/verify-e2e.test.ts
  • tests/unit/types-multi-query.test.ts
  • tests/unit/types.test.ts
  • tests/unit/types/solve-provenance.test.ts
  • tests/unit/types/stage-result.test.ts
  • tests/unit/util/abort.test.ts
  • tests/unit/util/child-env.test.ts
  • tests/unit/util/mode.test.ts
  • tests/unit/util/native-abi.test.ts
  • tests/unit/util/redact-url.test.ts
  • tests/unit/watch/ssrf.test.ts
  • tests/unit/watch/store.test.ts
  • tests/unit/wizard-setup-complete.test.tsx
  • tests/watch/ssrf-resolved-host.test.ts
  • tests/watch/ssrf-resolved-serve-target.test.ts
  • tsup.config.ts
  • vitest.config.ts
  • vitest.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 bytes
  • ADOPTERS.mddoc651 bytes
  • CHANGELOG.mddoc21,978 bytes
  • CODE_OF_CONDUCT.mddoc2,904 bytes
  • CONTRIBUTING.mddoc2,471 bytes
  • Dockerfileruns4,865 bytes
  • LICENSEasset35,314 bytes
  • LICENSING.mddoc1,901 bytes
  • Makefileruns3,029 bytes
  • README.mddoc29,812 bytes
  • SECURITY.mddoc1,185 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SKILL.mdcore20,703 bytes
  • SPONSORS.mddoc6,583 bytes
  • TRADEMARK.mddoc1,351 bytes
  • assets/blocks/claude-code/CLAUDE.md.blockasset3,724 bytes
  • assets/blocks/claude-code/wigolo-command.mddoc2,057 bytes
  • assets/blocks/codex/AGENTS.md.blockasset1,933 bytes
  • assets/blocks/cursor/wigolo.mdcasset3,131 bytes
  • assets/blocks/gemini-cli/GEMINI.md.blockasset2,361 bytes
  • assets/blocks/vscode/copilot-instructions.md.blockasset1,795 bytes
  • assets/blocks/windsurf/mcp_config.json.blockasset1,933 bytes
  • assets/blocks/windsurf/rules-global.mddoc1,813 bytes
  • assets/blocks/windsurf/rules-project.mddoc6,398 bytes
  • assets/blocks/zed/settings.json.blockasset1,933 bytes
  • assets/brand/README.mddoc1,611 bytes
  • assets/brand/generate.cjsruns5,399 bytes
  • assets/brand/wigolo-400.pngasset18,383 bytes
  • assets/brand/wigolo-banner.pngasset49,924 bytes
  • assets/brand/wigolo-icon.pngasset44,039 bytes
  • assets/brand/wigolo-social.pngasset83,695 bytes
  • assets/brand/wigolo-wordmark-dark.pngasset67,060 bytes
  • assets/brand/wigolo-wordmark-light.pngasset64,593 bytes
  • assets/legacy-skill-hashes.jsonasset5,307 bytes
  • assets/promo/anatomy-dark.svgasset7,593 bytes
  • assets/promo/anatomy.svgasset7,593 bytes
  • assets/promo/ask-twice-dark.svgasset4,939 bytes
  • assets/promo/ask-twice.svgasset4,939 bytes
  • assets/promo/fusion-dark.svgasset8,397 bytes
  • assets/promo/fusion.svgasset8,397 bytes
  • assets/promo/ladder-dark.svgasset4,755 bytes
  • assets/promo/ladder.svgasset4,755 bytes
  • assets/promo/meter-dark.svgasset5,113 bytes
  • assets/promo/meter.svgasset5,113 bytes
  • assets/promo/social/ask-twice.gifasset590,190 bytes
  • assets/promo/social/ask-twice.mp4asset175,111 bytes
  • assets/promo/social/meter.gifasset403,787 bytes
  • assets/promo/social/meter.mp4asset72,588 bytes
  • assets/promo/social/wigolo-launch-60s.mp4asset642,356 bytes
  • assets/promo/stars-dark.svgasset4,602 bytes
  • assets/promo/stars.svgasset4,606 bytes
  • assets/sponsors/testmu-ai-dark.svgasset8,347 bytes
  • assets/sponsors/testmu-ai.svgasset8,307 bytes
  • assets/wigolo-demo-poster.pngasset270,584 bytes
  • assets/wigolo-demo.gifasset526,295 bytes
  • assets/wigolo-demo.mp4asset244,443 bytes
  • assets/wigolo-demo.webmasset319,226 bytes
  • assets/wigolo-vs-poster.pngasset883,954 bytes
  • assets/wigolo-vs.gifasset1,293,685 bytes
  • assets/wigolo-vs.mp4asset2,286,091 bytes
  • assets/wigolo-vs.webmasset3,650,776 bytes
  • benchmarks/agent/evaluator.tsruns6,047 bytes
  • benchmarks/agent/fixtures/expected.jsonasset3,139 bytes
  • benchmarks/agent/fixtures/tasks.jsonasset2,647 bytes
  • benchmarks/agent/metrics.tsruns3,426 bytes
  • benchmarks/agent/report.tsruns3,292 bytes
  • benchmarks/agent/runner.tsruns5,407 bytes
  • benchmarks/agent/task-executor.tsruns4,649 bytes
  • benchmarks/agent/types.tsruns2,446 bytes
  • benchmarks/baselines/_skip-reasons.mddoc3,339 bytes
  • benchmarks/baselines/extraction-pre-v1.txtdoc888 bytes
  • benchmarks/baselines/search-pre-v1.txtdoc973 bytes
  • benchmarks/baselines/v1-dependency-checks.jsonasset3,319 bytes
  • benchmarks/embedding/runner.tsruns9,033 bytes
  • benchmarks/extraction/fixtures/golden/api-001.mddoc8,052 bytes
  • benchmarks/extraction/fixtures/golden/article-001.mddoc5,572 bytes
  • benchmarks/extraction/fixtures/golden/article-002.mddoc5,995 bytes
  • benchmarks/extraction/fixtures/golden/article-003.mddoc6,204 bytes
  • benchmarks/extraction/fixtures/golden/blog-001.mddoc9,548 bytes
  • benchmarks/extraction/fixtures/golden/changelog-001.mddoc10,470 bytes
  • benchmarks/extraction/fixtures/golden/code-001.mddoc8,569 bytes
  • benchmarks/extraction/fixtures/golden/docs-001.mddoc5,166 bytes
  • benchmarks/extraction/fixtures/golden/docs-002.mddoc6,139 bytes
  • benchmarks/extraction/fixtures/golden/docs-003.mddoc5,873 bytes
  • benchmarks/extraction/fixtures/golden/example-article.mddoc445 bytes
  • benchmarks/extraction/fixtures/golden/github-001.mddoc4,860 bytes
  • benchmarks/extraction/fixtures/golden/github-002.mddoc4,337 bytes
  • benchmarks/extraction/fixtures/golden/github-003.mddoc5,496 bytes
  • benchmarks/extraction/fixtures/golden/reference-001.mddoc8,708 bytes
  • benchmarks/extraction/fixtures/golden/so-001.mddoc4,922 bytes
  • benchmarks/extraction/fixtures/golden/so-002.mddoc6,085 bytes
  • benchmarks/extraction/fixtures/golden/spa-001.mddoc3,226 bytes
  • benchmarks/extraction/fixtures/golden/table-001.mddoc5,715 bytes
  • benchmarks/extraction/fixtures/golden/tutorial-001.mddoc12,008 bytes
  • benchmarks/extraction/fixtures/golden/wiki-001.mddoc10,556 bytes
  • benchmarks/extraction/fixtures/manifest.jsonasset6,213 bytes
  • benchmarks/extraction/metrics.tsruns3,887 bytes
  • benchmarks/extraction/per-category.tsruns7,157 bytes
  • benchmarks/extraction/report.tsruns7,627 bytes
  • benchmarks/extraction/runner.tsruns6,931 bytes
  • benchmarks/extraction/tokenizer.tsruns3,923 bytes
  • benchmarks/extraction/types.tsruns1,981 bytes
  • benchmarks/perf/tool-latency.tsruns7,011 bytes
  • benchmarks/search/fixtures/queries.jsonasset4,001 bytes
  • benchmarks/search/fixtures/relevance.jsonasset6,079 bytes
  • benchmarks/search/metrics.tsruns5,398 bytes
  • benchmarks/search/mock-engine.tsruns2,826 bytes
  • benchmarks/search/report.tsruns6,900 bytes
  • benchmarks/search/rerank-quality.tsruns7,797 bytes
  • benchmarks/search/runner.tsruns6,026 bytes
  • benchmarks/search/types.tsruns1,954 bytes
  • docs/README.mddoc2,750 bytes
  • docs/cli.mddoc7,702 bytes
  • docs/configuration.mddoc12,547 bytes
  • docs/getting-started.mddoc3,719 bytes
  • docs/installation.mddoc5,377 bytes
  • docs/plugins.mddoc3,376 bytes
  • docs/privacy-security.mddoc5,009 bytes
  • docs/rest-api.mddoc6,213 bytes
  • docs/sdks.mddoc6,363 bytes
  • docs/self-hosting.mddoc6,571 bytes
  • docs/skills.mddoc4,202 bytes
  • docs/tools.mddoc13,883 bytes
  • docs/troubleshooting.mddoc13,087 bytes
  • examples/README.mddoc2,783 bytes
  • examples/n8n-remote-mcp/README.mddoc4,642 bytes
  • examples/n8n-remote-mcp/workflow.jsonasset1,458 bytes
  • examples/one-shot-cli/README.mddoc3,089 bytes
  • examples/one-shot-cli/demo.gifasset217,199 bytes
  • examples/one-shot-cli/demo.tapeasset1,150 bytes
  • examples/one-shot-cli/run.shruns875 bytes
  • examples/plugin-search-engine/README.mddoc273 bytes
  • examples/plugin-search-engine/index.mjsruns363 bytes
  • examples/plugin-search-engine/package.jsonruns109 bytes
  • examples/quickstart-claude-code/README.mddoc2,155 bytes
  • examples/quickstart-claude-code/demo.gifasset367,433 bytes
  • examples/quickstart-claude-code/demo.tapeasset1,104 bytes
  • examples/rest-curl/README.mddoc2,949 bytes
  • examples/rest-curl/demo.shruns1,963 bytes
  • examples/sdk-python-agent/README.mddoc2,607 bytes
  • examples/sdk-python-agent/gather.pyruns1,857 bytes
  • examples/sdk-typescript-research/README.mddoc2,848 bytes
  • examples/sdk-typescript-research/package-lock.jsonasset583 bytes
  • examples/sdk-typescript-research/package.jsonruns188 bytes
  • examples/sdk-typescript-research/research.mjsruns1,237 bytes
  • examples/shell-ndjson-pipeline/README.mddoc2,555 bytes
  • examples/shell-ndjson-pipeline/demo.gifasset105,221 bytes
  • examples/shell-ndjson-pipeline/demo.tapeasset1,062 bytes
  • examples/shell-ndjson-pipeline/pipeline.shruns1,306 bytes
  • examples/vercel-ai-sdk-tools/README.mddoc2,919 bytes
  • examples/vercel-ai-sdk-tools/package-lock.jsonasset11,019 bytes
  • examples/vercel-ai-sdk-tools/package.jsonruns333 bytes
  • examples/vercel-ai-sdk-tools/tools.tsruns2,067 bytes
  • examples/vercel-ai-sdk-tools/tsconfig.jsonasset211 bytes
  • examples/watch-changelog-webhook/README.mddoc3,213 bytes
  • examples/watch-changelog-webhook/watch.shruns1,749 bytes
  • glama.jsonasset101 bytes
  • llms.txtdoc2,860 bytes
  • mcp.jsonasset103 bytes
  • mcpb/manifest.jsonasset1,189 bytes
  • mcpb/server/index.cjsruns518 bytes
  • package-lock.jsonasset354,976 bytes
  • package.jsonruns4,038 bytes
  • packages/wigolo-crewai/README.mddoc2,526 bytes
  • packages/wigolo-crewai/pyproject.tomlasset1,298 bytes
  • packages/wigolo-crewai/tests/__init__.pyruns0 bytes
  • packages/wigolo-crewai/tests/conftest.pyruns1,792 bytes
  • packages/wigolo-crewai/tests/test_core.pyruns4,095 bytes
  • packages/wigolo-crewai/tests/test_tools.pyruns2,409 bytes
  • packages/wigolo-crewai/wigolo_crewai/__init__.pyruns1,889 bytes
  • packages/wigolo-crewai/wigolo_crewai/_core.pyruns5,134 bytes
  • packages/wigolo-crewai/wigolo_crewai/tools.pyruns4,449 bytes
  • packages/wigolo-crewai/wigolo_crewai/types.pyruns4,194 bytes
  • packages/wigolo-langchain/README.mddoc2,437 bytes
  • packages/wigolo-langchain/pyproject.tomlasset1,283 bytes
  • packages/wigolo-langchain/tests/__init__.pyruns0 bytes
  • packages/wigolo-langchain/tests/conftest.pyruns4,505 bytes
  • packages/wigolo-langchain/tests/test_client.pyruns8,335 bytes
  • packages/wigolo-langchain/tests/test_retrievers.pyruns6,179 bytes
  • packages/wigolo-langchain/tests/test_tools.pyruns7,759 bytes
  • packages/wigolo-langchain/wigolo_langchain/__init__.pyruns538 bytes
  • packages/wigolo-langchain/wigolo_langchain/client.pyruns8,266 bytes
  • packages/wigolo-langchain/wigolo_langchain/retrievers.pyruns4,162 bytes
  • packages/wigolo-langchain/wigolo_langchain/tools.pyruns7,865 bytes
  • packages/wigolo-langchain/wigolo_langchain/types.pyruns3,827 bytes
  • packages/wigolo-llamaindex/README.mddoc3,253 bytes
  • packages/wigolo-llamaindex/pyproject.tomlasset1,289 bytes
  • packages/wigolo-llamaindex/tests/__init__.pyruns1 bytes
  • packages/wigolo-llamaindex/tests/conftest.pyruns4,458 bytes
  • packages/wigolo-llamaindex/tests/test_client.pyruns6,501 bytes
  • packages/wigolo-llamaindex/tests/test_reader.pyruns11,060 bytes
  • packages/wigolo-llamaindex/wigolo_llamaindex/__init__.pyruns288 bytes
  • packages/wigolo-llamaindex/wigolo_llamaindex/client.pyruns7,961 bytes
  • packages/wigolo-llamaindex/wigolo_llamaindex/reader.pyruns7,601 bytes
  • packages/wigolo-llamaindex/wigolo_llamaindex/types.pyruns1,396 bytes
  • packages/wigolo-vercel-ai-sdk/README.mddoc2,683 bytes
  • packages/wigolo-vercel-ai-sdk/package-lock.jsonasset23,040 bytes
  • packages/wigolo-vercel-ai-sdk/package.jsonruns1,056 bytes
  • packages/wigolo-vercel-ai-sdk/src/client.tsruns6,338 bytes
  • packages/wigolo-vercel-ai-sdk/src/index.tsruns659 bytes
  • packages/wigolo-vercel-ai-sdk/src/tools.tsruns8,650 bytes
  • packages/wigolo-vercel-ai-sdk/src/types.tsruns1,794 bytes
  • packages/wigolo-vercel-ai-sdk/tests/client.test.tsruns9,871 bytes
  • packages/wigolo-vercel-ai-sdk/tests/tools.test.tsruns7,713 bytes
  • packages/wigolo-vercel-ai-sdk/tsconfig.jsonasset487 bytes
  • packages/wigolo-vercel-ai-sdk/vitest.config.tsruns153 bytes
  • packaging/RELEASE-RUNBOOK.mddoc4,240 bytes
  • packaging/binary/bundle.mjsruns3,094 bytes
  • packaging/binary/pack.shruns2,653 bytes
  • packaging/binary/pkg.config.jsonasset1,762 bytes
  • packaging/binary/react-devtools-core-stub.mjsruns489 bytes
  • packaging/compose.serve.ymlasset2,872 bytes
  • packaging/homebrew/wigolo.rbruns2,639 bytes
  • packaging/install.shruns13,578 bytes
  • packaging/verification/binary.mddoc7,316 bytes
  • packaging/verification/brew.mddoc4,688 bytes
  • packaging/verification/docker.mddoc6,104 bytes
  • packaging/verification/npm.mddoc3,292 bytes
  • packaging/verification/sh.mddoc3,481 bytes
  • scripts/gen-legacy-skill-hashes.mjsruns3,186 bytes
  • scripts/release-sponsor-notes.tsruns355 bytes
  • scripts/run-sdk-py-tests.mjsruns813 bytes
  • scripts/star-chart.mjsruns9,750 bytes
  • scripts/verify-channel-binary.shruns7,634 bytes
  • scripts/verify-channel-brew.shruns3,905 bytes
  • scripts/verify-channel-docker.shruns11,264 bytes
  • scripts/verify-channel-npm.shruns2,986 bytes
  • scripts/verify-channel-rest.shruns14,302 bytes
  • scripts/verify-channel-sh.shruns3,772 bytes
  • scripts/verify-sdks.shruns873 bytes
  • sdks/python/.gitignoreasset52 bytes
  • sdks/python/LICENSEasset35,314 bytes
  • sdks/python/README.mddoc6,068 bytes
  • sdks/python/conftest.pyruns342 bytes
  • sdks/python/pyproject.tomlasset646 bytes
  • sdks/python/src/wigolo/__init__.pyruns692 bytes
  • sdks/python/src/wigolo/_aio.pyruns15,668 bytes
  • sdks/python/src/wigolo/_client.pyruns24,566 bytes
  • sdks/python/src/wigolo/_errors.pyruns1,757 bytes
  • sdks/python/src/wigolo/_local.pyruns15,512 bytes
  • sdks/python/src/wigolo/_manifest.pyruns7,751 bytes
  • sdks/python/src/wigolo/py.typedasset0 bytes
  • sdks/python/tests/_fake_serve.pyruns3,282 bytes
  • sdks/python/tests/conftest.pyruns4,323 bytes
  • sdks/python/tests/test_integration.pyruns8,129 bytes
  • sdks/python/tests/test_integration_local.pyruns5,545 bytes
  • sdks/python/tests/test_package_build.pyruns1,648 bytes
  • sdks/python/tests/test_runtime_drift.pyruns3,933 bytes
  • sdks/python/tests/test_unit_async.pyruns2,675 bytes
  • sdks/python/tests/test_unit_env_and_surface.pyruns3,682 bytes
  • sdks/python/tests/test_unit_local.pyruns5,931 bytes
  • sdks/python/tests/test_unit_transport.pyruns9,676 bytes
  • sdks/typescript/.gitignoreasset26 bytes
  • sdks/typescript/LICENSEasset35,314 bytes
  • sdks/typescript/README.mddoc5,526 bytes
  • sdks/typescript/package-lock.jsonasset42,089 bytes
  • sdks/typescript/package.jsonruns943 bytes
  • sdks/typescript/src/client.tsruns11,807 bytes
  • sdks/typescript/src/errors.tsruns2,222 bytes
  • sdks/typescript/src/index.tsruns651 bytes
  • sdks/typescript/src/local.tsruns15,455 bytes
  • sdks/typescript/src/manifest.tsruns5,733 bytes
  • sdks/typescript/src/node-shims.d.tsruns1,812 bytes
  • sdks/typescript/src/types.tsruns8,417 bytes
  • sdks/typescript/tests/client.unit.test.tsruns8,369 bytes
  • sdks/typescript/tests/drift.type-test.tsruns4,075 bytes
  • sdks/typescript/tests/embedded.test.tsruns4,003 bytes
  • sdks/typescript/tests/helpers.tsruns1,609 bytes
  • sdks/typescript/tests/integration.test.tsruns7,000 bytes
  • sdks/typescript/tests/local.unit.test.tsruns8,343 bytes
  • sdks/typescript/tests/runtime-drift.test.tsruns4,347 bytes
  • sdks/typescript/tests/serve-harness.tsruns4,991 bytes
  • sdks/typescript/tsconfig.base.jsonasset343 bytes
  • sdks/typescript/tsconfig.jsonasset133 bytes
  • sdks/typescript/tsconfig.test.jsonasset179 bytes
  • sdks/typescript/vitest.config.tsruns445 bytes
  • site/.gitignoreasset566 bytes
  • site/AGENTS.mddoc327 bytes
  • site/README.mddoc4,522 bytes
  • site/eslint.config.mjsruns465 bytes
  • site/next.config.mjsruns714 bytes
  • site/package-lock.jsonasset433,764 bytes
  • site/package.jsonruns1,216 bytes
  • site/postcss.config.mjsruns411 bytes
  • site/public/30849d3da27331f132af2733fb7a845b.txtdoc32 bytes
  • site/public/CNAMEasset11 bytes
  • site/public/googlecee3369f8bd7780f.htmlasset53 bytes
  • site/public/logos/aws.pngasset1,985 bytes
  • site/public/logos/capgemini.pngasset1,761 bytes
  • site/public/logos/didi.pngasset887 bytes
  • site/public/logos/microsoft.pngasset426 bytes
  • site/public/logos/oracle.pngasset1,659 bytes
  • site/public/logos/tencent.pngasset1,541 bytes
  • site/public/promo/anatomy-dark.svgasset7,593 bytes
  • site/public/promo/anatomy.svgasset7,593 bytes
  • site/public/promo/ask-twice-dark.svgasset4,939 bytes
  • site/public/promo/ask-twice.svgasset4,939 bytes
  • site/public/promo/fusion-dark.svgasset8,397 bytes
  • site/public/promo/fusion.svgasset8,397 bytes
  • site/public/promo/ladder-dark.svgasset4,755 bytes
  • site/public/promo/ladder.svgasset4,755 bytes
  • site/public/promo/meter-dark.svgasset5,113 bytes
  • site/public/promo/meter.svgasset5,113 bytes
  • site/public/sponsors/testmu-ai-dark.svgasset8,347 bytes
  • site/public/sponsors/testmu-ai.svgasset8,307 bytes
  • site/public/wigolo/wigolo-demo-poster.pngasset270,584 bytes
  • site/public/wigolo/wigolo-demo.mp4asset244,443 bytes
  • site/public/wigolo/wigolo-demo.webmasset319,226 bytes
  • site/public/wigolo/wigolo-icon.pngasset44,039 bytes
  • site/public/wigolo/wigolo-social.pngasset83,695 bytes
  • site/public/wigolo/wigolo-wordmark-dark.pngasset67,060 bytes
  • site/public/wigolo/wigolo-wordmark-light.pngasset64,593 bytes
  • site/scripts/indexnow.mjsruns1,713 bytes
  • site/scripts/logo-wall/fetch-logos.mjsruns5,506 bytes
  • site/scripts/logo-wall/mine.mjsruns7,733 bytes
  • site/scripts/logo-wall/normalize.mjsruns4,128 bytes
  • site/scripts/logo-wall/normalize.test.mjsruns2,402 bytes
  • site/scripts/logo-wall/silhouette.mjsruns2,606 bytes
  • site/scripts/logo-wall/silhouette.test.mjsruns1,969 bytes
  • site/scripts/sync-content.mjsruns9,623 bytes
  • site/scripts/sync-content.test.mjsruns4,206 bytes
  • site/src/app/alternatives/[slug]/page.tsxruns7,308 bytes
  • site/src/app/alternatives/page.tsxruns2,323 bytes
  • site/src/app/docs/[[...slug]]/page.tsxruns2,404 bytes
  • site/src/app/docs/docs.cssasset1,529 bytes
  • site/src/app/docs/layout.tsxruns1,162 bytes
  • site/src/app/favicon.icoasset25,931 bytes
  • site/src/app/globals.cssasset3,167 bytes
  • site/src/app/go/[slug]/SponsorCard.tsxruns1,185 bytes
  • site/src/app/go/[slug]/SponsorRedirect.module.cssasset1,192 bytes
  • site/src/app/go/[slug]/SponsorRedirect.tsxruns1,278 bytes
  • site/src/app/go/[slug]/page.tsxruns1,751 bytes
  • site/src/app/layout.tsxruns2,947 bytes
  • site/src/app/llms-full.txt/route.tsruns215 bytes
  • site/src/app/llms.txt/route.tsruns205 bytes
  • site/src/app/logo-wall.svg/route.tsruns614 bytes
  • site/src/app/page.tsxruns1,359 bytes
  • site/src/app/robots.tsruns581 bytes
  • site/src/app/search.json/route.tsruns229 bytes
  • site/src/app/sitemap.tsruns1,379 bytes
  • site/src/app/sponsors/page.tsxruns7,007 bytes
  • site/src/app/sponsors/sponsors.module.cssasset1,258 bytes
  • site/src/components/Analytics.tsxruns1,456 bytes
  • site/src/components/AnnouncementBar.module.cssasset842 bytes
  • site/src/components/AnnouncementBar.tsxruns910 bytes
  • site/src/components/FeatureMarquee.module.cssasset998 bytes
  • site/src/components/FeatureMarquee.tsxruns1,062 bytes
  • site/src/components/Feedback.module.cssasset2,188 bytes
  • site/src/components/Feedback.tsxruns3,466 bytes
  • site/src/components/Footer.module.cssasset1,420 bytes
  • site/src/components/Footer.tsxruns3,975 bytes
  • site/src/components/Hero.module.cssasset2,780 bytes
  • site/src/components/Hero.tsxruns3,491 bytes
  • site/src/components/HowItWorks.module.cssasset3,398 bytes
  • site/src/components/HowItWorks.tsxruns7,149 bytes
  • site/src/components/LogoWall.module.cssasset3,215 bytes
  • site/src/components/LogoWall.tsxruns3,007 bytes
  • site/src/components/Nav.module.cssasset4,007 bytes
  • site/src/components/Nav.tsxruns3,235 bytes
  • site/src/components/OpenSource.module.cssasset1,911 bytes
  • site/src/components/OpenSource.tsxruns2,819 bytes
  • site/src/components/Parity.module.cssasset2,436 bytes
  • site/src/components/Parity.tsxruns4,817 bytes
  • site/src/components/Quickstart.module.cssasset3,498 bytes
  • site/src/components/Quickstart.tsxruns3,797 bytes
  • site/src/components/Reveal.tsxruns1,098 bytes
  • site/src/components/SponsorStrip.module.cssasset587 bytes
  • site/src/components/SponsorStrip.tsxruns1,354 bytes
  • site/src/components/Sponsors.module.cssasset2,368 bytes
  • site/src/components/Sponsors.tsxruns2,446 bytes
  • site/src/components/StartShipping.module.cssasset853 bytes
  • site/src/components/StartShipping.tsxruns1,472 bytes
  • site/src/components/Stats.module.cssasset667 bytes
  • site/src/components/Stats.tsxruns668 bytes
  • site/src/components/Testimonials.module.cssasset1,781 bytes
  • site/src/components/Testimonials.tsxruns3,078 bytes
  • site/src/components/Tools.module.cssasset4,338 bytes
  • site/src/components/Tools.tsxruns10,583 bytes
  • site/src/components/TrustedBy.module.cssasset1,169 bytes
  • site/src/components/TrustedBy.tsxruns751 bytes
  • site/src/components/alternatives/Alternatives.module.cssasset3,385 bytes
  • site/src/components/alternatives/Inline.tsxruns447 bytes
  • site/src/components/docs/SearchDialog.tsxruns1,259 bytes
  • site/src/content/alternatives.tsruns12,065 bytes
  • site/src/content/llms-preamble.mddoc4,805 bytes
  • site/src/content/logo-wall/companies.jsonasset8,254 bytes
  • site/src/content/logo-wall/rasters.jsonasset276 bytes
  • site/src/lib/analytics.tsruns2,022 bytes
  • site/src/lib/jsonld.tsruns2,314 bytes
  • site/src/lib/lastmod.tsruns824 bytes
  • site/src/lib/llms.tsruns2,537 bytes
  • site/src/lib/logo-wall.tsruns4,974 bytes
  • site/src/lib/site.tsruns743 bytes
  • site/src/lib/source.tsruns480 bytes
  • site/src/lib/sponsors.tsruns4,847 bytes
  • site/src/lib/stats.tsruns936 bytes
  • site/tests/alternatives.test.tsruns1,461 bytes
  • site/tests/analytics.test.tsruns2,494 bytes
  • site/tests/logo-wall.test.tsruns2,530 bytes
  • site/tsconfig.jsonasset670 bytes
  • site/vitest.config.mtsruns268 bytes
  • smithery.yamlasset634 bytes
  • src/agent/executor.tsruns10,657 bytes
  • src/agent/pipeline.tsruns17,985 bytes
  • src/agent/planner.tsruns8,473 bytes
  • src/agent/rank.tsruns1,268 bytes
  • src/agent/relevance.tsruns1,675 bytes
  • src/cache/backfill-embeddings.tsruns4,206 bytes
  • src/cache/change-detector.tsruns2,483 bytes
  • src/cache/db.tsruns9,420 bytes
  • src/cache/diff-engine.tsruns23,378 bytes
  • src/cache/diff-summary.tsruns2,815 bytes
  • src/cache/lcs.tsruns1,797 bytes
  • src/cache/migrations/001-sqlite-vec.sqlasset1,059 bytes
  • src/cache/migrations/002-feed-items.sqlasset1,371 bytes
  • src/cache/migrations/003-crawl-etags.sqlasset573 bytes
  • src/cache/migrations/004-watch-jobs.sqlasset698 bytes
  • src/cache/migrations/005-tls-routing.sqlasset837 bytes
  • src/cache/migrations/006-url-cache-http-status.sqlasset462 bytes
  • src/cache/migrations/007-drop-lp-routing.sqlasset262 bytes
  • src/cache/migrations/008-antibot-clearance.sqlasset1,251 bytes
  • src/cache/migrations/010-clearance-route.sqlasset687 bytes
  • src/cache/migrations/runner.tsruns14,113 bytes
  • src/cache/sqlite-vec-store.tsruns8,346 bytes
  • src/cache/store.tsruns37,129 bytes
  • src/cli/agents/antigravity.tsruns1,799 bytes
  • src/cli/agents/claude-code.tsruns4,364 bytes
  • src/cli/agents/cline.tsruns2,218 bytes
  • src/cli/agents/codex.tsruns3,310 bytes
  • src/cli/agents/cursor.tsruns1,831 bytes
  • src/cli/agents/gemini-cli.tsruns1,826 bytes
  • src/cli/agents/opencode.tsruns8,785 bytes
  • src/cli/agents/registry.tsruns1,460 bytes
  • src/cli/agents/skills/catalog.tsruns4,944 bytes
  • src/cli/agents/skills/executor.tsruns29,906 bytes
  • src/cli/agents/skills/index.tsruns798 bytes
  • src/cli/agents/skills/planner.tsruns14,121 bytes
  • src/cli/agents/skills/receipts.tsruns9,404 bytes
  • src/cli/agents/skills/snapshot.tsruns2,022 bytes
  • src/cli/agents/skills/targets.tsruns3,984 bytes
  • src/cli/agents/skills/types.tsruns4,841 bytes
  • src/cli/agents/utils.tsruns7,460 bytes
  • src/cli/agents/vscode.tsruns3,599 bytes
  • src/cli/agents/windsurf.tsruns2,026 bytes
  • src/cli/agents/zed.tsruns2,091 bytes
  • src/cli/auth.tsruns3,807 bytes
  • src/cli/backfill.tsruns2,615 bytes
  • src/cli/config.tsruns17,804 bytes
  • src/cli/daemon.tsruns6,371 bytes
  • src/cli/doctor.tsruns56,413 bytes
  • src/cli/flag-bridge.tsruns15,729 bytes
  • src/cli/health.tsruns2,060 bytes
  • src/cli/help.tsruns10,624 bytes
  • src/cli/index.tsruns1,663 bytes
  • src/cli/init.tsruns34,046 bytes
  • src/cli/mcp.tsruns1,142 bytes
  • src/cli/ollama-probe.tsruns2,907 bytes
  • src/cli/plugin.tsruns10,848 bytes
  • src/cli/setup-mcp.tsruns4,889 bytes
  • src/cli/shell.tsruns4,437 bytes
  • src/cli/shutdown.tsruns1,215 bytes
  • src/cli/skills.tsruns17,083 bytes
  • src/cli/status.tsruns1,573 bytes
  • src/cli/telemetry.tsruns2,388 bytes
  • src/cli/tool-run.tsruns7,983 bytes
  • src/cli/tui/actions/cache-stats.tsruns940 bytes
  • src/cli/tui/actions/cleanup.tsruns2,137 bytes
  • src/cli/tui/actions/compute-storage.tsruns2,568 bytes
  • src/cli/tui/actions/detect-system.tsruns1,507 bytes
  • src/cli/tui/actions/export-import-config.tsruns5,255 bytes
  • src/cli/tui/actions/headless-set.tsruns7,756 bytes
  • src/cli/tui/actions/index.tsruns3,357 bytes
  • src/cli/tui/actions/provider-keys.tsruns6,029 bytes
  • src/cli/tui/actions/setup-status.tsruns11,568 bytes
  • src/cli/tui/actions/types.tsruns1,071 bytes
  • src/cli/tui/actions/uninstall.tsruns4,789 bytes
  • src/cli/tui/actions/verify-e2e.tsruns19,331 bytes
  • src/cli/tui/actions/verify-router.tsruns797 bytes
  • src/cli/tui/actions/write-config.tsruns3,389 bytes
  • src/cli/tui/agents-types.tsruns848 bytes
  • src/cli/tui/agents.tsruns3,724 bytes
  • src/cli/tui/banner.tsruns1,061 bytes
  • src/cli/tui/components/ActionBar.tsxruns1,185 bytes
  • src/cli/tui/components/Banner.tsxruns767 bytes
  • src/cli/tui/components/CategoryScreen.tsxruns9,750 bytes
  • src/cli/tui/components/DashboardExport.tsxruns4,470 bytes
  • src/cli/tui/components/DashboardUninstall.tsxruns4,166 bytes
  • src/cli/tui/components/DoctorScreen.tsxruns2,953 bytes
  • src/cli/tui/components/FieldRenderer.tsxruns17,731 bytes
  • src/cli/tui/components/ImportScreen.tsxruns8,805 bytes
  • src/cli/tui/components/SettingsHome.tsxruns9,921 bytes
  • src/cli/tui/components/Verification.tsxruns4,742 bytes
  • src/cli/tui/components/VerifyScreen.tsxruns1,605 bytes
  • src/cli/tui/components/WizardSteps.tsxruns20,095 bytes
  • src/cli/tui/config-writer-cli.tsruns1,964 bytes
  • src/cli/tui/config-writer-json.tsruns21,559 bytes
  • src/cli/tui/config-writer-toml.tsruns2,965 bytes
  • src/cli/tui/config-writer.tsruns5,377 bytes
  • src/cli/tui/detect-helpers.tsruns1,043 bytes
  • src/cli/tui/entry.tsruns9,579 bytes
  • src/cli/tui/extras-prompt.tsruns4,068 bytes
  • src/cli/tui/flags-types.tsruns2,089 bytes
  • src/cli/tui/flags.tsruns7,056 bytes
  • src/cli/tui/format.tsruns762 bytes
  • src/cli/tui/hooks/useVerify.tsruns2,469 bytes
  • src/cli/tui/reporter-auto.tsruns679 bytes
  • src/cli/tui/reporter.tsruns1,625 bytes
  • src/cli/tui/router/ink.tsxruns16,185 bytes
  • src/cli/tui/run-command.tsruns2,282 bytes
  • src/cli/tui/schema/advanced.tsruns1,848 bytes
  • src/cli/tui/schema/agents.tsruns740 bytes
  • src/cli/tui/schema/browser.tsruns1,054 bytes
  • src/cli/tui/schema/cache.tsruns902 bytes
  • src/cli/tui/schema/catalog.tsruns485 bytes
  • src/cli/tui/schema/llm.tsruns1,415 bytes
  • src/cli/tui/schema/migrate.tsruns1,781 bytes
  • src/cli/tui/schema/search.tsruns1,781 bytes
  • src/cli/tui/schema/types.tsruns1,046 bytes
  • src/cli/tui/select-agents.tsruns889 bytes
  • src/cli/tui/shell/App.tsxruns4,720 bytes
  • src/cli/tui/shell/CommandPalette.tsxruns4,001 bytes
  • src/cli/tui/shell/Footer.tsxruns2,476 bytes
  • src/cli/tui/shell/Header.tsxruns3,458 bytes
  • src/cli/tui/shell/HelpOverlay.tsxruns1,643 bytes
  • src/cli/tui/shell/MainPane.tsxruns1,416 bytes
  • src/cli/tui/shell/Sidebar.tsxruns4,515 bytes
  • src/cli/tui/shell/Spinner.tsxruns506 bytes
  • src/cli/tui/shell/palette-index.tsruns1,829 bytes
  • src/cli/tui/shell/width.tsruns629 bytes
  • src/cli/tui/state/activity-store-instance.tsruns185 bytes
  • src/cli/tui/state/activity-store.tsruns732 bytes
  • src/cli/tui/state/agent-install-hints.tsruns2,317 bytes
  • src/cli/tui/state/agent-targets.tsruns5,605 bytes
  • src/cli/tui/state/propagation.tsruns21,372 bytes
  • src/cli/tui/state/required-fields.tsruns2,070 bytes
  • src/cli/tui/state/secret-store.tsruns3,747 bytes
  • src/cli/tui/state/settings-store.tsruns3,560 bytes
  • src/cli/tui/state/toast-store-instance.tsruns164 bytes
  • src/cli/tui/state/toast-store.tsruns2,783 bytes
  • src/cli/tui/state/uninstall-signal.tsruns164 bytes
  • src/cli/tui/status-agents.tsruns3,937 bytes
  • src/cli/tui/status-cache.tsruns1,098 bytes
  • src/cli/tui/status-format.tsruns1,710 bytes
  • src/cli/tui/status-python.tsruns1,115 bytes
  • src/cli/tui/system-check.tsruns4,196 bytes
  • src/cli/tui/theme/borders.tsruns239 bytes
  • src/cli/tui/theme/motion-guard.tsruns250 bytes
  • src/cli/tui/theme/motion.tsruns203 bytes
  • src/cli/tui/theme/palette.tsruns578 bytes
  • src/cli/tui/tui-reporter.tsruns2,783 bytes
  • src/cli/tui/utils/config-writer.tsruns827 bytes
  • src/cli/tui/utils/suppress-logs.tsruns173 bytes
  • src/cli/tui/verify-suggestions.tsruns1,026 bytes
  • src/cli/tui/verify.tsruns5,969 bytes
  • src/cli/tui/version.tsruns336 bytes
  • src/cli/tune.tsruns5,845 bytes
  • src/cli/uninstall.tsruns7,651 bytes
  • src/cli/verify.tsruns2,136 bytes
  • src/cli/warmup.tsruns24,469 bytes
  • src/config.tsruns42,104 bytes
  • src/crawl/crawler.tsruns14,777 bytes
  • src/crawl/dedup.tsruns5,604 bytes
  • src/crawl/etag-incremental.tsruns5,127 bytes
  • src/crawl/index-to-vec.tsruns2,721 bytes
  • src/crawl/mapper.tsruns6,619 bytes
  • src/crawl/rate-limiter.tsruns7,208 bytes
  • src/crawl/robots.tsruns1,889 bytes
  • src/crawl/sitemap-first.tsruns2,239 bytes
  • src/crawl/sitemap.tsruns3,207 bytes
  • src/crawl/url-utils.tsruns2,955 bytes
  • src/daemon/admin-token.tsruns2,262 bytes
  • src/daemon/health-check.tsruns2,271 bytes
  • src/daemon/http-server.tsruns19,540 bytes
  • src/daemon/proxy.tsruns2,958 bytes
  • src/daemon/rest/auth.tsruns5,651 bytes
  • src/daemon/rest/dispatch.tsruns10,343 bytes
  • src/daemon/rest/errors.tsruns5,859 bytes
  • src/daemon/rest/firecrawl-compat.tsruns19,650 bytes
  • src/daemon/rest/limits.tsruns5,549 bytes
  • src/daemon/rest/openapi.tsruns14,015 bytes
  • src/daemon/rest/router.tsruns10,560 bytes
  • src/daemon/rest/target-guard.tsruns1,839 bytes
  • src/daemon/rest/validate.tsruns2,865 bytes
  • src/embedding/background-queue.tsruns7,029 bytes
  • src/embedding/embed.tsruns12,636 bytes
  • src/embedding/fastembed-provider.tsruns8,612 bytes
  • src/embedding/key-terms.tsruns4,757 bytes
  • src/extraction/boilerplate.tsruns2,539 bytes
  • src/extraction/brand-palette.tsruns12,178 bytes
  • src/extraction/brand-provenance.tsruns1,417 bytes
  • src/extraction/brand.tsruns45,036 bytes
  • src/extraction/defuddle.tsruns874 bytes
  • src/extraction/div-grid.tsruns16,639 bytes
  • src/extraction/extract.tsruns16,234 bytes
  • src/extraction/jsonld.tsruns2,134 bytes
  • src/extraction/lang-hints.tsruns665 bytes
  • src/extraction/list.tsruns11,304 bytes
  • src/extraction/llm-fallback.tsruns5,508 bytes
  • src/extraction/markdown-sanitize.tsruns4,212 bytes
  • src/extraction/markdown.tsruns8,344 bytes
  • src/extraction/metadata.tsruns2,329 bytes
  • src/extraction/pipeline.tsruns3,136 bytes
  • src/extraction/readability.tsruns932 bytes
  • src/extraction/schema-truth.tsruns6,442 bytes
  • src/extraction/schema.tsruns18,069 bytes
  • src/extraction/site-extractors/amazon.tsruns17,365 bytes
  • src/extraction/site-extractors/docs-generic.tsruns3,030 bytes
  • src/extraction/site-extractors/github.tsruns9,549 bytes
  • src/extraction/site-extractors/mdn.tsruns2,474 bytes
  • src/extraction/site-extractors/reddit.tsruns10,784 bytes
  • src/extraction/site-extractors/stackoverflow.tsruns3,409 bytes
  • src/extraction/site-extractors/youtube.tsruns14,546 bytes
  • src/extraction/structured-data.tsruns6,262 bytes
  • src/extraction/structured.tsruns8,761 bytes
  • src/extraction/v1/classifier.tsruns3,549 bytes
  • src/extraction/v1/content-root.tsruns3,137 bytes
  • src/extraction/v1/extract-provider.tsruns2,326 bytes
  • src/extraction/v1/local-llm.tsruns5,355 bytes
  • src/extraction/v1/news.tsruns1,975 bytes
  • src/extraction/v1/product.tsruns5,869 bytes
  • src/extraction/v1/recipe.tsruns4,429 bytes
  • src/extraction/v1/routed.tsruns5,648 bytes
  • src/extraction/v1/schemas/Article.tsruns5,011 bytes
  • src/extraction/v1/schemas/CodeSnippet.tsruns3,148 bytes
  • src/extraction/v1/schemas/EventListing.tsruns4,415 bytes
  • src/extraction/v1/schemas/JobPosting.tsruns7,427 bytes
  • src/extraction/v1/schemas/Paper.tsruns5,551 bytes
  • src/extraction/v1/schemas/Product.tsruns5,487 bytes
  • src/extraction/v1/schemas/Recipe.tsruns5,632 bytes
  • src/extraction/v1/schemas/index.tsruns1,786 bytes
  • src/extraction/v1/site-extractors.tsruns1,809 bytes
  • src/fetch/action-executor.tsruns4,047 bytes
  • src/fetch/ai-solve.tsruns10,516 bytes
  • src/fetch/auth.tsruns2,316 bytes
  • src/fetch/auto-pass.tsruns7,151 bytes
  • src/fetch/behavior.tsruns7,829 bytes
  • src/fetch/browser-acquire.tsruns11,776 bytes
  • src/fetch/browser-pool.tsruns78,556 bytes
  • src/fetch/browser-probe.tsruns2,855 bytes
  • src/fetch/browser-selector.tsruns2,231 bytes
  • src/fetch/browser-types.tsruns1,475 bytes
  • src/fetch/cdp-client.tsruns3,361 bytes
  • src/fetch/cdp-direct.tsruns48,942 bytes
  • src/fetch/challenge-classify.tsruns16,966 bytes
  • src/fetch/challenge-completion.tsruns3,441 bytes
  • src/fetch/clearance-reuse.tsruns6,461 bytes
  • src/fetch/content-check.tsruns4,892 bytes
  • src/fetch/error-describe.tsruns2,921 bytes
  • src/fetch/escape-hatch.tsruns12,471 bytes
  • src/fetch/http-client.tsruns15,578 bytes
  • src/fetch/human-solve.tsruns5,353 bytes
  • src/fetch/hydration-probe.tsruns15,128 bytes
  • src/fetch/pinned-dispatcher.tsruns4,690 bytes
  • src/fetch/playwright-tier.tsruns3,954 bytes
  • src/fetch/politeness.tsruns1,991 bytes
  • src/fetch/proxy-credentials.tsruns3,806 bytes
  • src/fetch/reddit-api.tsruns19,591 bytes
  • src/fetch/router.tsruns72,462 bytes
  • src/fetch/scraping-browser.tsruns7,480 bytes
  • src/fetch/settle.tsruns8,654 bytes
  • src/fetch/solve-ladder.tsruns5,711 bytes
  • src/fetch/stealth.tsruns14,030 bytes
  • src/fetch/tls-tier.tsruns32,465 bytes
  • src/index.tsruns5,471 bytes
  • src/instructions.tsruns28,684 bytes
  • src/integrations/cloud/llm/anthropic.tsruns1,378 bytes
  • src/integrations/cloud/llm/cache.tsruns1,572 bytes
  • src/integrations/cloud/llm/custom-backend.tsruns5,367 bytes
  • src/integrations/cloud/llm/gemini.tsruns1,038 bytes
  • src/integrations/cloud/llm/groq.tsruns2,939 bytes
  • src/integrations/cloud/llm/hash.tsruns842 bytes
  • src/integrations/cloud/llm/local-tier.tsruns6,838 bytes
  • src/integrations/cloud/llm/model-select.tsruns1,397 bytes
  • src/integrations/cloud/llm/openai.tsruns1,187 bytes
  • src/integrations/cloud/llm/run.tsruns10,238 bytes
  • src/integrations/cloud/llm/select.tsruns4,742 bytes
  • src/integrations/cloud/llm/text-adapters.tsruns5,454 bytes
  • src/integrations/cloud/llm/types.tsruns551 bytes
  • src/integrations/cloud/llm/validate.tsruns2,386 bytes
  • src/logger.tsruns3,352 bytes
  • src/pdf-parse.d.tsruns845 bytes
  • src/persisted-config.tsruns16,338 bytes
  • src/plugins/loader.tsruns5,379 bytes
  • src/plugins/registry.tsruns2,546 bytes
  • src/plugins/validate.tsruns2,527 bytes
  • src/providers/embed-provider.tsruns5,123 bytes
  • src/providers/extract-provider.tsruns1,280 bytes
  • src/providers/idle-unload.tsruns3,620 bytes
  • src/providers/rerank-provider.tsruns7,962 bytes
  • src/providers/search-provider.tsruns3,607 bytes
  • src/providers/vector-store.tsruns1,678 bytes
  • src/python-env.tsruns6,083 bytes
  • src/repl/commands/agent.tsruns2,634 bytes
  • src/repl/commands/cache.tsruns2,172 bytes
  • src/repl/commands/crawl.tsruns2,094 bytes
  • src/repl/commands/diff.tsruns3,225 bytes
  • src/repl/commands/extract.tsruns2,003 bytes
  • src/repl/commands/fetch.tsruns3,624 bytes
  • src/repl/commands/find-similar.tsruns3,134 bytes
  • src/repl/commands/research.tsruns2,856 bytes
  • src/repl/commands/search.tsruns2,911 bytes
  • src/repl/commands/types.tsruns292 bytes
  • src/repl/commands/watch.tsruns3,913 bytes
  • src/repl/completer.tsruns3,446 bytes
  • src/repl/formatters.tsruns13,068 bytes
  • src/repl/parser.tsruns2,484 bytes
  • src/repl/shell.tsruns10,242 bytes
  • src/research/branch-exploration.tsruns3,562 bytes
  • src/research/brief.tsruns20,653 bytes
  • src/research/citation-graph.tsruns3,616 bytes
  • src/research/decompose.tsruns13,929 bytes
  • src/research/entity-extractor.tsruns2,409 bytes
  • src/research/pipeline.tsruns20,513 bytes
  • src/research/render-brief.tsruns6,822 bytes
  • src/research/source-validation.tsruns9,432 bytes
  • src/research/synthesis-local.tsruns4,441 bytes
  • src/research/synthesize.tsruns5,368 bytes
  • src/search/answer-synthesis.tsruns13,674 bytes
  • src/search/content-fetch.tsruns15,368 bytes
  • src/search/context-formatter.tsruns2,205 bytes
  • src/search/core/brand-collision.tsruns18,858 bytes
  • src/search/core/canonical-url.tsruns3,871 bytes
  • src/search/core/context-rank.tsruns3,184 bytes
  • src/search/core/core-provider.tsruns43,232 bytes
  • src/search/core/domain-quality.tsruns4,931 bytes
  • src/search/core/engine-base.tsruns25,134 bytes
  • src/search/core/engine-health.tsruns7,649 bytes
  • src/search/core/engine-quality.tsruns7,091 bytes
  • src/search/core/engine-warnings.tsruns6,413 bytes
  • src/search/core/error-intent.tsruns7,599 bytes
  • src/search/core/favicon.tsruns763 bytes
  • src/search/core/freshness.tsruns1,814 bytes
  • src/search/core/intent-router.tsruns9,056 bytes
  • src/search/core/lexical-alignment.tsruns1,790 bytes
  • src/search/core/orchestrator.tsruns43,089 bytes
  • src/search/core/query-expansion.tsruns5,488 bytes
  • src/search/core/query-understanding.tsruns3,959 bytes
  • src/search/core/rare-terms.tsruns5,907 bytes
  • src/search/core/recency-boost.tsruns2,830 bytes
  • src/search/core/recent-cache-dedup.tsruns3,615 bytes
  • src/search/core/rerank-fold.tsruns10,446 bytes
  • src/search/core/rss/feed-config.tsruns3,385 bytes
  • src/search/core/rss/feed-parser.tsruns4,622 bytes
  • src/search/core/rss/feed-poller.tsruns3,590 bytes
  • src/search/core/rss/feed-store.tsruns4,730 bytes
  • src/search/core/rss/rss-engine.tsruns965 bytes
  • src/search/core/score-floor.tsruns8,436 bytes
  • src/search/core/text-tokenizer.tsruns1,671 bytes
  • src/search/core/time-range.tsruns2,512 bytes
  • src/search/core/verticals/code.tsruns2,938 bytes
  • src/search/core/verticals/docs.tsruns1,497 bytes
  • src/search/core/verticals/general.tsruns3,394 bytes
  • src/search/core/verticals/images.tsruns1,629 bytes
  • src/search/core/verticals/news.tsruns3,687 bytes
  • src/search/core/verticals/papers.tsruns2,020 bytes
  • src/search/dedup.tsruns1,693 bytes
  • src/search/engines/arxiv.tsruns2,810 bytes
  • src/search/engines/bing-news.tsruns5,540 bytes
  • src/search/engines/bing.tsruns5,283 bytes
  • src/search/engines/brave-image.tsruns4,128 bytes
  • src/search/engines/brave.tsruns2,999 bytes
  • src/search/engines/crates-io.tsruns2,794 bytes
  • src/search/engines/dblp.tsruns4,555 bytes
  • src/search/engines/ddg-image.tsruns5,511 bytes
  • src/search/engines/devdocs.tsruns3,400 bytes
  • src/search/engines/duckduckgo.tsruns2,900 bytes
  • src/search/engines/github-code.tsruns3,270 bytes
  • src/search/engines/hn-algolia.tsruns3,195 bytes
  • src/search/engines/lobsters.tsruns4,109 bytes
  • src/search/engines/marginalia.tsruns2,951 bytes
  • src/search/engines/mdn.tsruns1,863 bytes
  • src/search/engines/mojeek.tsruns3,188 bytes
  • src/search/engines/openalex.tsruns3,797 bytes
  • src/search/engines/openreview.tsruns2,491 bytes
  • src/search/engines/semantic-scholar.tsruns2,950 bytes
  • src/search/engines/stackoverflow.tsruns2,930 bytes
  • src/search/engines/user-agents.tsruns2,154 bytes
  • src/search/engines/wikipedia.tsruns2,496 bytes
  • src/search/evidence.tsruns12,518 bytes
  • src/search/filters.tsruns3,139 bytes
  • src/search/find-similar.tsruns28,245 bytes
  • src/search/find-similar/crawl-rank.tsruns11,041 bytes
  • src/search/find-similar/mode.tsruns749 bytes
  • src/search/highlights.tsruns7,585 bytes
  • src/search/hybrid/common-nouns.tsruns836 bytes
  • src/search/hybrid/merge.tsruns3,006 bytes
  • src/search/hybrid/router.tsruns4,207 bytes
  • src/search/hybrid/signals.tsruns4,326 bytes
  • src/search/language-filter.tsruns6,122 bytes
  • src/search/legacy/searxng-orchestrator.tsruns22,753 bytes
  • src/search/legacy/searxng-provider.tsruns472 bytes
  • src/search/multi-query.tsruns9,841 bytes
  • src/search/query.tsruns1,103 bytes
  • src/search/rerank.tsruns2,365 bytes
  • src/search/reranker/authority-boost.tsruns5,968 bytes
  • src/search/reranker/consensus-boost.tsruns1,421 bytes
  • src/search/reranker/recency-boost.tsruns505 bytes
  • src/search/reranker/recency.tsruns797 bytes
  • src/search/reranker/remote-rerank-provider.tsruns4,333 bytes
  • src/search/reranker/transformers-rerank-provider.tsruns5,055 bytes
  • src/search/rrf.tsruns1,526 bytes
  • src/search/sampling.tsruns2,086 bytes
  • src/search/searxng.tsruns4,030 bytes
  • src/search/tokens.tsruns1,470 bytes
  • src/search/truncate.tsruns1,091 bytes
  • src/search/url-unwrap.tsruns1,235 bytes
  • src/search/validator.tsruns1,202 bytes
  • src/searxng/bootstrap.tsruns15,159 bytes
  • src/searxng/docker.tsruns3,882 bytes
  • src/searxng/enabled.tsruns1,679 bytes
  • src/searxng/process.tsruns9,099 bytes
  • src/security/key-crypto.tsruns5,122 bytes
  • src/security/key-store.tsruns8,415 bytes
  • src/security/keychain.tsruns3,270 bytes
  • src/server.tsruns24,114 bytes
  • src/server/backend-status.tsruns1,377 bytes
  • src/server/search-response.tsruns1,295 bytes
  • src/server/tool-schemas.tsruns24,841 bytes
  • src/server/warmup-on-start.tsruns4,128 bytes
  • src/tools/agent.tsruns6,925 bytes
  • src/tools/cache.tsruns7,979 bytes
  • src/tools/crawl.tsruns9,197 bytes
  • src/tools/diff.tsruns3,766 bytes
  • src/tools/extract.tsruns22,471 bytes
  • src/tools/fetch.tsruns19,520 bytes
  • src/tools/find-similar.tsruns5,192 bytes
  • src/tools/research.tsruns3,935 bytes
  • src/tools/search.tsruns1,117 bytes
  • src/tools/watch.tsruns6,734 bytes
  • src/types.tsruns48,953 bytes
  • src/util/abort.tsruns2,332 bytes
  • src/util/child-env.tsruns1,443 bytes
  • src/util/engine-list.tsruns994 bytes
  • src/util/mode.tsruns1,169 bytes
  • src/util/native-abi.tsruns3,259 bytes
  • src/util/packaged.tsruns1,456 bytes
  • src/util/redact-url.tsruns613 bytes
  • src/watch/scheduler.tsruns9,295 bytes
  • src/watch/ssrf.tsruns19,916 bytes
  • src/watch/store.tsruns6,467 bytes
  • tests/e2e/doctor-clean-exit.e2e.test.tsruns2,573 bytes
  • tests/e2e/fetch-tool.test.tsruns7,676 bytes
  • tests/e2e/init-command.e2e.test.tsruns2,711 bytes
  • tests/e2e/mcp-startup.test.tsruns4,965 bytes
  • tests/e2e/search-tool.test.tsruns6,428 bytes
  • tests/e2e/searxng-cold-bootstrap.e2e.test.tsruns5,262 bytes
  • tests/fetch/pinned-dispatcher.test.tsruns4,166 bytes
  • tests/fetch/pinned-e2e.test.tsruns2,040 bytes
  • tests/fetch/pinned-failclosed.test.tsruns2,122 bytes
  • tests/fetch/pinned-rebind.test.tsruns3,943 bytes
  • tests/fetch/pinned-redirect-body.test.tsruns3,649 bytes
  • tests/fetch/pinned-redirect.test.tsruns2,430 bytes
  • tests/fixtures/amazon/blocked.htmlasset408 bytes
  • tests/fixtures/amazon/book.htmlasset3,872 bytes
  • tests/fixtures/amazon/de-euro.htmlasset1,987 bytes
  • tests/fixtures/amazon/electronics.htmlasset5,157 bytes
  • tests/fixtures/amazon/grocery.htmlasset3,445 bytes
  • tests/fixtures/amazon/out-of-stock.htmlasset2,125 bytes
  • tests/fixtures/amazon/uk-pound.htmlasset2,059 bytes
  • tests/fixtures/bing-tracker-urls.jsonasset800 bytes
  • tests/fixtures/brand/anthropic.htmlasset1,719 bytes
  • tests/fixtures/brand/cloudflare.htmlasset1,956 bytes
  • tests/fixtures/brand/convex.htmlasset1,667 bytes
  • tests/fixtures/brand/discord.htmlasset1,845 bytes
  • tests/fixtures/brand/figma.htmlasset1,696 bytes
  • tests/fixtures/brand/fly.htmlasset1,703 bytes
  • tests/fixtures/brand/fonts/example.htmlasset387 bytes
  • tests/fixtures/brand/fonts/figma.htmlasset700 bytes
  • tests/fixtures/brand/fonts/hackernews.htmlasset723 bytes
  • tests/fixtures/brand/fonts/linear.htmlasset535 bytes
  • tests/fixtures/brand/fonts/stripe.htmlasset707 bytes
  • tests/fixtures/brand/fonts/vercel.htmlasset687 bytes
  • tests/fixtures/brand/github.htmlasset2,039 bytes
  • tests/fixtures/brand/linear.htmlasset1,723 bytes
  • tests/fixtures/brand/netlify.htmlasset1,889 bytes
  • tests/fixtures/brand/nextjs.htmlasset1,712 bytes
  • tests/fixtures/brand/notion.htmlasset1,732 bytes
  • tests/fixtures/brand/openai.htmlasset1,618 bytes
  • tests/fixtures/brand/posthog.htmlasset1,778 bytes
  • tests/fixtures/brand/railway.htmlasset1,624 bytes
  • tests/fixtures/brand/render.htmlasset1,744 bytes
  • tests/fixtures/brand/resend.htmlasset1,620 bytes
  • tests/fixtures/brand/slack.htmlasset1,815 bytes
  • tests/fixtures/brand/stripe.htmlasset2,129 bytes
  • tests/fixtures/brand/supabase.htmlasset1,828 bytes
  • tests/fixtures/brand/tailwind.htmlasset1,949 bytes
  • tests/fixtures/brand/vercel.htmlasset1,845 bytes
  • tests/fixtures/cdp-json/active-sessions.jsonasset1,236 bytes
  • tests/fixtures/cdp-json/empty.jsonasset3 bytes
  • tests/fixtures/cdp-json/malformed.jsonasset24 bytes
  • tests/fixtures/changing-page/v1.htmlasset918 bytes
  • tests/fixtures/changing-page/v2.htmlasset1,213 bytes
  • tests/fixtures/cookie-banner.htmlasset1,382 bytes
  • tests/fixtures/crawl/nextjs-docs/page-1.htmlasset1,410 bytes
  • tests/fixtures/crawl/nextjs-docs/page-2.htmlasset1,410 bytes
  • tests/fixtures/crawl/nextjs-docs/page-3.htmlasset1,410 bytes
  • tests/fixtures/crawl/nextjs-docs/page-4.htmlasset1,410 bytes
  • tests/fixtures/crawl/nextjs-docs/page-5.htmlasset1,410 bytes
  • tests/fixtures/dump_tokens.pyruns3,014 bytes
  • tests/fixtures/extraction/article.htmlasset4,472 bytes
  • tests/fixtures/extraction/blog-post.htmlasset6,592 bytes
  • tests/fixtures/extraction/code-blocks.htmlasset2,249 bytes
  • tests/fixtures/extraction/dense-ordinal-leaderboard.htmlasset1,577 bytes
  • tests/fixtures/extraction/div-grid-pricing.htmlasset1,480 bytes
  • tests/fixtures/extraction/job-listing.htmlasset2,077 bytes
  • tests/fixtures/extraction/jsonld-article.htmlasset759 bytes
  • tests/fixtures/extraction/legacy-table-listing.htmlasset3,120 bytes
  • tests/fixtures/extraction/metadata.htmlasset1,211 bytes
  • tests/fixtures/extraction/minimal.htmlasset140 bytes
  • tests/fixtures/extraction/news-article.htmlasset6,225 bytes
  • tests/fixtures/extraction/product-page.htmlasset1,357 bytes
  • tests/fixtures/extraction/react-managing-state.htmlasset3,116 bytes
  • tests/fixtures/extraction/react-reference-real.htmlasset158,392 bytes
  • tests/fixtures/extraction/react-reference-shell.htmlasset3,615 bytes
  • tests/fixtures/extraction/tables.htmlasset1,902 bytes
  • tests/fixtures/extraction/vitepress-guide.htmlasset49,891 bytes
  • tests/fixtures/form-page.htmlasset1,248 bytes
  • tests/fixtures/load-more.htmlasset1,194 bytes
  • tests/fixtures/multi-browser/simple.htmlasset962 bytes
  • tests/fixtures/plugins/bad-json/package.jsonruns35 bytes
  • tests/fixtures/plugins/invalid-shape/index.mjsruns186 bytes
  • tests/fixtures/plugins/invalid-shape/package.jsonruns80 bytes
  • tests/fixtures/plugins/no-main/package.jsonruns51 bytes
  • tests/fixtures/plugins/throws-on-load/index.mjsruns66 bytes
  • tests/fixtures/plugins/throws-on-load/package.jsonruns81 bytes
  • tests/fixtures/plugins/valid-both/index.mjsruns670 bytes
  • tests/fixtures/plugins/valid-both/package.jsonruns77 bytes
  • tests/fixtures/plugins/valid-extractor/index.mjsruns337 bytes
  • tests/fixtures/plugins/valid-extractor/package.jsonruns82 bytes
  • tests/fixtures/plugins/valid-search-engine/index.mjsruns328 bytes
  • tests/fixtures/plugins/valid-search-engine/package.jsonruns86 bytes
  • tests/fixtures/repl/golden/cache-stats.txtdoc131 bytes
  • tests/fixtures/repl/golden/crawl.txtdoc184 bytes
  • tests/fixtures/repl/golden/extract.txtdoc164 bytes
  • tests/fixtures/repl/golden/fetch.txtdoc187 bytes
  • tests/fixtures/repl/golden/search.txtdoc395 bytes
  • tests/fixtures/reranker-tokenizer-corpus.README.mddoc1,675 bytes
  • tests/fixtures/reranker-tokenizer-corpus.jsonasset24,778 bytes
  • tests/fixtures/reranker-tokenizer-snapshot.jsonasset1,404,950 bytes
  • tests/fixtures/search/bing-results.htmlasset776 bytes
  • tests/fixtures/search/duckduckgo-results.htmlasset997 bytes
  • tests/fixtures/search/searxng-response.jsonasset1,003 bytes
  • tests/fixtures/site-extractors/docusaurus-page.htmlasset5,606 bytes
  • tests/fixtures/site-extractors/github-blob-legacy.htmlasset731 bytes
  • tests/fixtures/site-extractors/github-blob-modern.htmlasset3,467 bytes
  • tests/fixtures/site-extractors/github-blob-truncated.htmlasset612 bytes
  • tests/fixtures/site-extractors/github-issue.htmlasset2,838 bytes
  • tests/fixtures/site-extractors/github-readme.htmlasset1,306 bytes
  • tests/fixtures/site-extractors/mdn-article.htmlasset8,551 bytes
  • tests/fixtures/site-extractors/reddit-blocked.htmlasset338 bytes
  • tests/fixtures/site-extractors/reddit-deleted-comments.htmlasset3,962 bytes
  • tests/fixtures/site-extractors/reddit-deleted-post.htmlasset1,981 bytes
  • tests/fixtures/site-extractors/reddit-thread.htmlasset9,781 bytes
  • tests/fixtures/site-extractors/stackoverflow-question.htmlasset4,114 bytes
  • tests/fixtures/site-extractors/youtube-watch-age-restricted.htmlasset555 bytes
  • tests/fixtures/site-extractors/youtube-watch-no-captions.htmlasset605 bytes
  • tests/fixtures/site-extractors/youtube-watch-with-captions.htmlasset1,638 bytes
  • tests/fixtures/spa-shells/next-empty.htmlasset559 bytes
  • tests/fixtures/spa-shells/normal-page.htmlasset1,797 bytes
  • tests/fixtures/spa-shells/noscript-required.htmlasset260 bytes
  • tests/fixtures/spa-shells/react-spa.htmlasset423 bytes
  • tests/fixtures/spa-shells/script-heavy.htmlasset3,782 bytes
  • tests/fixtures/spa-shells/thin-content.htmlasset142 bytes
  • tests/fixtures/spa-shells/vue-spa.htmlasset353 bytes
  • tests/fixtures/structured-data/article-jsonld.htmlasset876 bytes
  • tests/fixtures/structured-data/breadcrumb-microdata.htmlasset908 bytes
  • tests/fixtures/structured-data/organization-rdfa.htmlasset544 bytes
  • tests/fixtures/structured-data/product-jsonld.htmlasset764 bytes
  • tests/fixtures/structured-data/product-microdata.htmlasset576 bytes
  • tests/fixtures/structured-data/recipe-jsonld.htmlasset1,051 bytes
  • tests/helpers/wait-for.tsruns553 bytes
  • tests/integration/__snapshots__/extract-pipeline-v1.test.ts.snapasset9,671 bytes
  • tests/integration/agent-defaults-token-discipline.test.tsruns2,245 bytes
  • tests/integration/agent-local-tier.test.tsruns3,844 bytes
  • tests/integration/agent-top-mcp-servers.test.tsruns3,750 bytes
  • tests/integration/agent.test.tsruns13,216 bytes
  • tests/integration/browser-actions.test.tsruns9,056 bytes
  • tests/integration/build-output.test.tsruns1,116 bytes
  • tests/integration/cache-defaults-token-discipline.test.tsruns2,303 bytes
  • tests/integration/cache-tool.test.tsruns4,672 bytes
  • tests/integration/cdp-discovery.test.tsruns6,840 bytes
  • tests/integration/change-detection.test.tsruns9,032 bytes
  • tests/integration/citation-id-stability.test.tsruns4,786 bytes
  • tests/integration/config-writer-fs.test.tsruns7,642 bytes
  • tests/integration/crawl-index-latency.test.tsruns5,625 bytes
  • tests/integration/crawl-pipeline.test.tsruns11,436 bytes
  • tests/integration/crawl/nav-dedupe.test.tsruns1,099 bytes
  • tests/integration/daemon-mode.test.tsruns5,865 bytes
  • tests/integration/embedding-cache-fastembed.test.tsruns3,455 bytes
  • tests/integration/embedding.test.tsruns6,646 bytes
  • tests/integration/extract-pipeline-v1.test.tsruns10,189 bytes
  • tests/integration/extract-pipeline.test.tsruns6,738 bytes
  • tests/integration/extract-schema-evidence-only.test.tsruns8,339 bytes
  • tests/integration/extract-structured.test.tsruns5,060 bytes
  • tests/integration/extract-tables-truncation.test.tsruns3,375 bytes
  • tests/integration/extract-wikipedia-chrome.test.tsruns5,141 bytes
  • tests/integration/extraction-pipeline-structured-data.test.tsruns2,323 bytes
  • tests/integration/extraction/markdown-post-process.test.tsruns1,231 bytes
  • tests/integration/extras-prompt-roundtrip.test.tsruns4,807 bytes
  • tests/integration/fetch-cache-completeness-gate.test.tsruns6,438 bytes
  • tests/integration/fetch-cache-miss.test.tsruns801 bytes
  • tests/integration/fetch-method-visibility.test.tsruns3,562 bytes
  • tests/integration/fetch-pdf.test.tsruns4,875 bytes
  • tests/integration/fetch-pipeline.test.tsruns8,904 bytes
  • tests/integration/fetch-router-tuning.test.tsruns7,962 bytes
  • tests/integration/fetch-site-data.test.tsruns12,322 bytes
  • tests/integration/fetch-vs-extract-metadata.test.tsruns2,201 bytes
  • tests/integration/fetch/browser-pool.test.tsruns8,737 bytes
  • tests/integration/fetch/no-lightpanda.test.tsruns4,846 bytes
  • tests/integration/fetch/playwright-tier.test.tsruns10,854 bytes
  • tests/integration/fetch/spa-settle-corpus.test.tsruns6,550 bytes
  • tests/integration/fetch/spa-settle-corpus/fixtures.tsruns4,748 bytes
  • tests/integration/fetch/spa-settle-corpus/server.tsruns1,680 bytes
  • tests/integration/filter-enforcement.test.tsruns9,371 bytes
  • tests/integration/find-similar.test.tsruns13,136 bytes
  • tests/integration/fixtures/search-parity-snapshot.jsonasset684 bytes
  • tests/integration/fixtures/skills-legacy/wigolo-search-SKILL.mddoc4,685 bytes
  • tests/integration/hybrid-mode.test.tsruns8,779 bytes
  • tests/integration/instructions-v3.test.tsruns3,048 bytes
  • tests/integration/llm-fallback-e2e.test.tsruns4,459 bytes
  • tests/integration/llm-fallback-schema.test.tsruns3,697 bytes
  • tests/integration/map-mode.test.tsruns9,725 bytes
  • tests/integration/mode-deep.test.tsruns3,442 bytes
  • tests/integration/multi-browser.test.tsruns6,154 bytes
  • tests/integration/multi-query.test.tsruns5,640 bytes
  • tests/integration/onnx-rerank-e2e.test.tsruns3,062 bytes
  • tests/integration/pipeline-success-criteria.test.tsruns6,010 bytes
  • tests/integration/plugins/plugin-lifecycle.test.tsruns8,285 bytes
  • tests/integration/remote-rerank-pipeline.test.tsruns2,144 bytes
  • tests/integration/repl-e2e.test.tsruns9,862 bytes
  • tests/integration/rerank-pipeline.test.tsruns5,878 bytes
  • tests/integration/research-local-tier.test.tsruns5,417 bytes
  • tests/integration/research.test.tsruns9,592 bytes
  • tests/integration/rest-api.test.tsruns14,530 bytes
  • tests/integration/rest-firecrawl-compat.test.tsruns14,471 bytes
  • tests/integration/rest-tools.test.tsruns12,197 bytes
  • tests/integration/router-stealth.test.tsruns5,953 bytes
  • tests/integration/schema-extract-pipeline.test.tsruns9,941 bytes
  • tests/integration/search-adapter-quality.test.tsruns6,550 bytes
  • tests/integration/search-answer.test.tsruns9,679 bytes
  • tests/integration/search-depth.test.tsruns4,210 bytes
  • tests/integration/search-evidence-default.test.tsruns6,751 bytes
  • tests/integration/search-filtering-pipeline.test.tsruns10,050 bytes
  • tests/integration/search-format-answer-empty.test.tsruns1,722 bytes
  • tests/integration/search-format-answer-slim.test.tsruns5,495 bytes
  • tests/integration/search-language-filter.test.tsruns2,244 bytes
  • tests/integration/search-legacy-parity.test.tsruns3,366 bytes
  • tests/integration/search-pipeline.test.tsruns5,542 bytes
  • tests/integration/search-rerank-fold.test.tsruns10,801 bytes
  • tests/integration/search-rerank-pipeline.test.tsruns5,165 bytes
  • tests/integration/search-s11c-ranking.test.tsruns11,192 bytes
  • tests/integration/search-v1-context.test.tsruns9,836 bytes
  • tests/integration/search-v1-pipeline.test.tsruns10,351 bytes
  • tests/integration/searxng-retry.test.tsruns2,570 bytes
  • tests/integration/setup-roundtrip.test.tsruns13,395 bytes
  • tests/integration/skills-install.test.tsruns15,786 bytes
  • tests/integration/tui-autosave-roundtrip.test.tsruns3,330 bytes
  • tests/integration/tui-narrow-terminal.test.tsruns2,039 bytes
  • tests/integration/tui-shell-integration.test.tsruns3,718 bytes
  • tests/integration/warmup-force.test.tsruns2,155 bytes
  • tests/integration/warmup-tui.test.tsruns3,312 bytes
  • tests/integration/watch/watch-handler.test.tsruns22,180 bytes
  • tests/integration/zero-touch-just-works.test.tsruns8,353 bytes
  • tests/perf/embedding.bench.tsruns2,912 bytes
  • tests/perf/rerank.bench.tsruns3,861 bytes
  • tests/perf/search-v1.bench.tsruns1,515 bytes
  • tests/perf/vector-search.bench.tsruns3,343 bytes
  • tests/setup.tsruns4,139 bytes
  • tests/unit/agent/agent-defaults.test.tsruns446 bytes
  • tests/unit/agent/executor.test.tsruns10,841 bytes
  • tests/unit/agent/pipeline.llm-gate-keystore.test.tsruns4,729 bytes
  • tests/unit/agent/pipeline.local-tier.test.tsruns7,843 bytes
  • tests/unit/agent/pipeline.provider-priority.test.tsruns3,532 bytes
  • tests/unit/agent/pipeline.test.tsruns28,954 bytes
  • tests/unit/agent/planner.test.tsruns9,265 bytes
  • tests/unit/agent/rank.test.tsruns3,148 bytes
  • tests/unit/agent/relevance.test.tsruns3,601 bytes
  • tests/unit/benchmarks/agent/evaluator.test.tsruns10,457 bytes
  • tests/unit/benchmarks/agent/metrics.test.tsruns3,469 bytes
  • tests/unit/benchmarks/agent/report.test.tsruns3,479 bytes
  • tests/unit/benchmarks/agent/runner.test.tsruns3,686 bytes
  • tests/unit/benchmarks/agent/task-executor.test.tsruns7,390 bytes
  • tests/unit/benchmarks/extraction/metrics.test.tsruns6,992 bytes
  • tests/unit/benchmarks/extraction/report.test.tsruns7,521 bytes
  • tests/unit/benchmarks/extraction/runner.test.tsruns8,364 bytes
  • tests/unit/benchmarks/extraction/tokenizer.test.tsruns5,161 bytes
  • tests/unit/benchmarks/search/metrics.test.tsruns7,320 bytes
  • tests/unit/benchmarks/search/mock-engine.test.tsruns4,908 bytes
  • tests/unit/benchmarks/search/report.test.tsruns5,439 bytes
  • tests/unit/benchmarks/search/runner.test.tsruns5,442 bytes
  • tests/unit/cache/antibot-clearance.test.tsruns10,410 bytes
  • tests/unit/cache/backfill-embeddings.test.tsruns5,324 bytes
  • tests/unit/cache/change-detector.test.tsruns9,041 bytes
  • tests/unit/cache/clearance-route-secret.test.tsruns3,622 bytes
  • tests/unit/cache/db-embedding.test.tsruns3,879 bytes
  • tests/unit/cache/db-exit-hook.test.tsruns1,115 bytes
  • tests/unit/cache/db-vec-packaged.test.tsruns3,542 bytes
  • tests/unit/cache/db.test.tsruns1,974 bytes
  • tests/unit/cache/diff-engine.test.tsruns16,232 bytes
  • tests/unit/cache/diff-summary.test.tsruns6,865 bytes
  • tests/unit/cache/domain-routing-admin.test.tsruns7,204 bytes
  • tests/unit/cache/lcs.test.tsruns3,477 bytes
  • tests/unit/cache/migrations-runner.test.tsruns9,237 bytes
  • tests/unit/cache/sanitize-fts-query.test.tsruns2,676 bytes
  • tests/unit/cache/sqlite-vec-store.test.tsruns5,704 bytes
  • tests/unit/cache/stale-window.test.tsruns3,560 bytes
  • tests/unit/cache/store-embedding.test.tsruns4,683 bytes
  • tests/unit/cache/store-search-key.test.tsruns4,640 bytes
  • tests/unit/cache/store.test.tsruns27,110 bytes
  • tests/unit/cache/tls-routing.test.tsruns2,480 bytes
  • tests/unit/cli/agents/agent-support-consistency.test.tsruns4,684 bytes
  • tests/unit/cli/agents/claude-code.test.tsruns11,601 bytes
  • tests/unit/cli/agents/cline.test.tsruns4,333 bytes
  • tests/unit/cli/agents/codex.test.tsruns6,192 bytes
  • tests/unit/cli/agents/opencode.test.tsruns11,567 bytes
  • tests/unit/cli/agents/registry.test.tsruns2,313 bytes
  • tests/unit/cli/agents/skills-content.test.tsruns8,236 bytes
  • tests/unit/cli/agents/skills/catalog.test.tsruns3,404 bytes
  • tests/unit/cli/agents/skills/executor.test.tsruns28,796 bytes
  • tests/unit/cli/agents/skills/planner.test.tsruns11,165 bytes
  • tests/unit/cli/agents/skills/receipts.test.tsruns12,486 bytes
  • tests/unit/cli/agents/skills/targets.test.tsruns2,929 bytes
  • tests/unit/cli/agents/utils.test.tsruns10,804 bytes
  • tests/unit/cli/agents/vscode.test.tsruns7,904 bytes
  • tests/unit/cli/agents/windsurf.test.tsruns5,763 bytes
  • tests/unit/cli/agents/zed.test.tsruns5,163 bytes
  • tests/unit/cli/auth.test.tsruns6,623 bytes
  • tests/unit/cli/config-dispatch.test.tsruns13,270 bytes
  • tests/unit/cli/config.test.tsruns2,498 bytes
  • tests/unit/cli/daemon.test.tsruns10,422 bytes
  • tests/unit/cli/doctor-engine-health.test.tsruns6,945 bytes
  • tests/unit/cli/doctor-fixes.test.tsruns15,404 bytes
  • tests/unit/cli/doctor-isolated.test.tsruns20,355 bytes
  • tests/unit/cli/doctor-lazy.test.tsruns17,563 bytes
  • tests/unit/cli/doctor-ollama.test.tsruns7,293 bytes
  • tests/unit/cli/doctor-provider.test.tsruns1,938 bytes
  • tests/unit/cli/doctor-tls-tier.test.tsruns5,638 bytes
  • tests/unit/cli/doctor.test.tsruns23,150 bytes
  • tests/unit/cli/flag-bridge.test.tsruns8,555 bytes
  • tests/unit/cli/health.test.tsruns5,226 bytes
  • tests/unit/cli/help-completeness.test.tsruns3,805 bytes
  • tests/unit/cli/help.test.tsruns6,437 bytes
  • tests/unit/cli/index.test.tsruns6,075 bytes
  • tests/unit/cli/init-non-interactive.test.tsruns21,639 bytes
  • tests/unit/cli/init-ollama-hint.test.tsruns2,808 bytes
  • tests/unit/cli/init-packaged-binary.test.tsruns5,406 bytes
  • tests/unit/cli/init.test.tsruns44,539 bytes
  • tests/unit/cli/json-contracts.test.tsruns9,576 bytes
  • tests/unit/cli/ollama-probe.test.tsruns3,952 bytes
  • tests/unit/cli/plugin.test.tsruns14,826 bytes
  • tests/unit/cli/router-config.test.tsruns1,286 bytes
  • tests/unit/cli/setup-mcp-integration.test.tsruns6,091 bytes
  • tests/unit/cli/setup-mcp-non-interactive.test.tsruns2,828 bytes
  • tests/unit/cli/setup-mcp.test.tsruns5,837 bytes
  • tests/unit/cli/shell.test.tsruns2,678 bytes
  • tests/unit/cli/skills-command.test.tsruns17,232 bytes
  • tests/unit/cli/status.test.tsruns4,595 bytes
  • tests/unit/cli/telemetry.test.tsruns6,687 bytes
  • tests/unit/cli/tool-flag-parity.test.tsruns2,784 bytes
  • tests/unit/cli/tool-run.test.tsruns7,535 bytes
  • tests/unit/cli/tui/actions/cache-stats.test.tsruns2,704 bytes
  • tests/unit/cli/tui/actions/cleanup.test.tsruns4,750 bytes
  • tests/unit/cli/tui/actions/compute-storage.test.tsruns5,818 bytes
  • tests/unit/cli/tui/actions/detect-system.test.tsruns2,570 bytes
  • tests/unit/cli/tui/actions/export-import-config.test.tsruns9,135 bytes
  • tests/unit/cli/tui/actions/headless-set.test.tsruns11,669 bytes
  • tests/unit/cli/tui/actions/mcp-stdio-no-ink.test.tsruns3,572 bytes
  • tests/unit/cli/tui/actions/provider-actions.test.tsruns6,198 bytes
  • tests/unit/cli/tui/actions/uninstall.test.tsruns9,466 bytes
  • tests/unit/cli/tui/actions/write-config-no-silent.test.tsruns2,009 bytes
  • tests/unit/cli/tui/actions/write-config.test.tsruns4,901 bytes
  • tests/unit/cli/tui/agents.test.tsruns12,972 bytes
  • tests/unit/cli/tui/banner.test.tsruns2,149 bytes
  • tests/unit/cli/tui/banner.test.tsxruns1,318 bytes
  • tests/unit/cli/tui/components/ActionBar.test.tsxruns1,612 bytes
  • tests/unit/cli/tui/components/CategoryScreen.blur.test.tsxruns7,532 bytes
  • tests/unit/cli/tui/components/CategoryScreen.test.tsxruns12,035 bytes
  • tests/unit/cli/tui/components/DoctorScreen.test.tsxruns3,439 bytes
  • tests/unit/cli/tui/components/FieldRenderer.enter-select.test.tsxruns4,755 bytes
  • tests/unit/cli/tui/components/FieldRenderer.saved-check.test.tsxruns4,842 bytes
  • tests/unit/cli/tui/components/FieldRenderer.test.tsxruns29,243 bytes
  • tests/unit/cli/tui/components/ImportScreen.test.tsxruns8,466 bytes
  • tests/unit/cli/tui/components/SettingsHome.multiselect-preview.test.tsxruns3,546 bytes
  • tests/unit/cli/tui/components/SettingsHome.quit.test.tsxruns2,301 bytes
  • tests/unit/cli/tui/components/SettingsHome.test.tsxruns11,262 bytes
  • tests/unit/cli/tui/components/SettingsHome.threeway.test.tsxruns4,644 bytes
  • tests/unit/cli/tui/components/VerifyScreen.test.tsxruns3,082 bytes
  • tests/unit/cli/tui/components/WizardSteps.ceremony.test.tsxruns6,065 bytes
  • tests/unit/cli/tui/components/WizardSteps.continue-quit.test.tsxruns10,666 bytes
  • tests/unit/cli/tui/components/WizardSteps.test.tsxruns11,054 bytes
  • tests/unit/cli/tui/config-force-wizard.test.tsruns1,975 bytes
  • tests/unit/cli/tui/config-writer-cli.test.tsruns3,495 bytes
  • tests/unit/cli/tui/config-writer-json.test.tsruns21,524 bytes
  • tests/unit/cli/tui/config-writer-toml.test.tsruns3,713 bytes
  • tests/unit/cli/tui/config-writer.test.tsruns6,922 bytes
  • tests/unit/cli/tui/dashboard-screens.test.tsxruns4,409 bytes
  • tests/unit/cli/tui/detect-helpers.test.tsruns4,869 bytes
  • tests/unit/cli/tui/entry-required-fields.test.tsruns4,152 bytes
  • tests/unit/cli/tui/entry.test.tsruns3,535 bytes
  • tests/unit/cli/tui/extras-prompt.test.tsruns7,589 bytes
  • tests/unit/cli/tui/flags.test.tsruns5,211 bytes
  • tests/unit/cli/tui/format.test.tsruns1,454 bytes
  • tests/unit/cli/tui/init-config-writer.test.tsruns1,475 bytes
  • tests/unit/cli/tui/mount-root-phase-sync.test.tsxruns3,590 bytes
  • tests/unit/cli/tui/plain-override.test.tsruns2,786 bytes
  • tests/unit/cli/tui/reporter-auto.test.tsruns2,530 bytes
  • tests/unit/cli/tui/reporter.test.tsruns2,421 bytes
  • tests/unit/cli/tui/router/entry-wire.test.tsxruns6,061 bytes
  • tests/unit/cli/tui/router/ink-root.apply-verify.test.tsxruns4,843 bytes
  • tests/unit/cli/tui/router/ink-root.phase3-integration.test.tsxruns3,995 bytes
  • tests/unit/cli/tui/router/ink-root.save-state.test.tsxruns3,289 bytes
  • tests/unit/cli/tui/router/ink-root.test.tsxruns7,506 bytes
  • tests/unit/cli/tui/run-command.test.tsruns1,858 bytes
  • tests/unit/cli/tui/schema/advanced.test.tsruns2,937 bytes
  • tests/unit/cli/tui/schema/agents.test.tsruns1,739 bytes
  • tests/unit/cli/tui/schema/browser.test.tsruns1,385 bytes
  • tests/unit/cli/tui/schema/cache.test.tsruns1,628 bytes
  • tests/unit/cli/tui/schema/catalog.test.tsruns722 bytes
  • tests/unit/cli/tui/schema/llm-no-custom.test.tsruns2,294 bytes
  • tests/unit/cli/tui/schema/llm.test.tsruns3,935 bytes
  • tests/unit/cli/tui/schema/migrate.test.tsruns3,493 bytes
  • tests/unit/cli/tui/schema/search.test.tsruns1,933 bytes
  • tests/unit/cli/tui/schema/types.test.tsruns2,100 bytes
  • tests/unit/cli/tui/select-agents.test.tsruns3,561 bytes
  • tests/unit/cli/tui/shell/App.test.tsxruns3,719 bytes
  • tests/unit/cli/tui/shell/CommandPalette.test.tsxruns3,460 bytes
  • tests/unit/cli/tui/shell/CommandPalette.width.test.tsxruns4,733 bytes
  • tests/unit/cli/tui/shell/Footer.test.tsxruns4,835 bytes
  • tests/unit/cli/tui/shell/Header.liveness.test.tsxruns5,103 bytes
  • tests/unit/cli/tui/shell/Header.test.tsxruns3,280 bytes
  • tests/unit/cli/tui/shell/HelpOverlay.test.tsxruns2,051 bytes
  • tests/unit/cli/tui/shell/HelpOverlay.width.test.tsxruns2,070 bytes
  • tests/unit/cli/tui/shell/MainPane.test.tsxruns1,571 bytes
  • tests/unit/cli/tui/shell/MainPane.transition.test.tsxruns2,885 bytes
  • tests/unit/cli/tui/shell/Sidebar.pulse.test.tsxruns6,651 bytes
  • tests/unit/cli/tui/shell/Sidebar.quit.test.tsxruns3,099 bytes
  • tests/unit/cli/tui/shell/Sidebar.test.tsxruns9,896 bytes
  • tests/unit/cli/tui/shell/Spinner.test.tsxruns2,727 bytes
  • tests/unit/cli/tui/shell/palette-index.test.tsruns2,998 bytes
  • tests/unit/cli/tui/shell/width.test.tsruns826 bytes
  • tests/unit/cli/tui/state/activity-store.test.tsruns1,224 bytes
  • tests/unit/cli/tui/state/agent-install-hints.test.tsruns3,691 bytes
  • tests/unit/cli/tui/state/agent-targets.test.tsruns3,029 bytes
  • tests/unit/cli/tui/state/propagation.test.tsruns21,960 bytes
  • tests/unit/cli/tui/state/required-fields.test.tsruns6,750 bytes
  • tests/unit/cli/tui/state/secret-store.test.tsruns6,362 bytes
  • tests/unit/cli/tui/state/settings-store.blur.test.tsruns4,504 bytes
  • tests/unit/cli/tui/state/settings-store.test.tsruns2,574 bytes
  • tests/unit/cli/tui/state/settings-store.toast.test.tsruns3,234 bytes
  • tests/unit/cli/tui/state/toast-store.action.test.tsruns2,639 bytes
  • tests/unit/cli/tui/state/toast-store.test.tsruns2,506 bytes
  • tests/unit/cli/tui/state/uninstall-signal.test.tsruns1,385 bytes
  • tests/unit/cli/tui/status-agents.test.tsruns7,411 bytes
  • tests/unit/cli/tui/status-cache.test.tsruns1,907 bytes
  • tests/unit/cli/tui/status-format.test.tsruns2,456 bytes
  • tests/unit/cli/tui/status-python.test.tsruns1,726 bytes
  • tests/unit/cli/tui/system-check.test.tsruns7,710 bytes
  • tests/unit/cli/tui/theme/borders.test.tsruns603 bytes
  • tests/unit/cli/tui/theme/motion-guard.test.tsruns1,700 bytes
  • tests/unit/cli/tui/theme/motion.test.tsruns498 bytes
  • tests/unit/cli/tui/theme/palette.test.tsruns825 bytes
  • tests/unit/cli/tui/tui-reporter.test.tsruns4,310 bytes
  • tests/unit/cli/tui/verification.test.tsxruns5,708 bytes
  • tests/unit/cli/tui/verify-suggestions.test.tsruns1,890 bytes
  • tests/unit/cli/tui/verify.test.tsruns9,141 bytes
  • tests/unit/cli/tui/version.test.tsruns671 bytes
  • tests/unit/cli/tune.test.tsruns9,358 bytes
  • tests/unit/cli/uninstall.test.tsruns9,395 bytes
  • tests/unit/cli/verify-command.test.tsruns7,396 bytes
  • tests/unit/cli/warmup-browser-deps.test.tsruns8,783 bytes
  • tests/unit/cli/warmup-embedding.test.tsruns3,727 bytes
  • tests/unit/cli/warmup-firefox.test.tsruns9,553 bytes
  • tests/unit/cli/warmup-force.test.tsruns2,602 bytes
  • tests/unit/cli/warmup-local-llm.test.tsruns1,808 bytes
  • tests/unit/cli/warmup-python-env.test.tsruns2,958 bytes
  • tests/unit/cli/warmup-setup-json-contract.test.tsruns5,938 bytes
  • tests/unit/cli/warmup-verify.test.tsruns4,202 bytes
  • tests/unit/cli/warmup.test.tsruns28,738 bytes
  • tests/unit/config-persistence.test.tsruns7,251 bytes
  • tests/unit/config-search-budgets.test.tsruns1,874 bytes
  • tests/unit/config.test.tsruns24,394 bytes
  • tests/unit/config/crawl-pacing.test.tsruns2,290 bytes
  • tests/unit/config/hardcore-mode.test.tsruns11,458 bytes
  • tests/unit/config/proxy-credential-persistence.test.tsruns5,311 bytes
  • tests/unit/config/proxy-credential-resolve.test.tsruns3,184 bytes
  • tests/unit/config/reddit-credentials.test.tsruns4,344 bytes
  • tests/unit/crawl/crawler.test.tsruns30,842 bytes
  • tests/unit/crawl/dedup.test.tsruns7,474 bytes
  • tests/unit/crawl/etag-incremental.test.tsruns6,790 bytes
  • tests/unit/crawl/index-to-vec.test.tsruns3,840 bytes
  • tests/unit/crawl/mapper.test.tsruns29,196 bytes
  • tests/unit/crawl/rate-limiter.test.tsruns9,377 bytes
  • tests/unit/crawl/robots.test.tsruns2,100 bytes
  • tests/unit/crawl/sitemap-first.test.tsruns5,214 bytes
  • tests/unit/crawl/sitemap.test.tsruns6,362 bytes
  • tests/unit/crawl/url-utils.test.tsruns4,608 bytes
  • tests/unit/daemon/admin-reset-integration.test.tsruns4,666 bytes
  • tests/unit/daemon/admin-token.test.tsruns2,584 bytes
  • tests/unit/daemon/firecrawl-compat.test.tsruns22,037 bytes
  • tests/unit/daemon/health-check.test.tsruns6,317 bytes
  • tests/unit/daemon/http-server.test.tsruns29,510 bytes
  • tests/unit/daemon/proxy.test.tsruns3,047 bytes
  • tests/unit/daemon/rest-auth.test.tsruns7,118 bytes
  • tests/unit/daemon/rest-dispatch.test.tsruns10,117 bytes
  • tests/unit/daemon/rest-errors.test.tsruns6,615 bytes
  • tests/unit/daemon/rest-limits.test.tsruns5,171 bytes
  • tests/unit/daemon/rest-openapi.test.tsruns10,379 bytes
  • tests/unit/daemon/rest-router.test.tsruns11,340 bytes
  • tests/unit/daemon/rest-target-guard.test.tsruns1,917 bytes
  • tests/unit/daemon/rest-validate.test.tsruns2,363 bytes
  • tests/unit/documentation/docker-image-tags.test.tsruns917 bytes
  • tests/unit/embedding/background-queue.test.tsruns6,141 bytes
  • tests/unit/embedding/embed-provider-resolution.test.tsruns3,753 bytes
  • tests/unit/embedding/embed.test.tsruns14,500 bytes
  • tests/unit/embedding/fastembed-provider-dispose.test.tsruns7,876 bytes
  • tests/unit/embedding/fastembed-provider.test.tsruns6,265 bytes
  • tests/unit/embedding/key-terms.test.tsruns8,134 bytes
  • tests/unit/extraction/boilerplate.test.tsruns8,270 bytes
  • tests/unit/extraction/brand-async.test.tsruns23,682 bytes
  • tests/unit/extraction/brand-fixtures.test.tsruns5,630 bytes
  • tests/unit/extraction/brand-fonts-acceptance.test.tsruns5,086 bytes
  • tests/unit/extraction/brand-honesty.test.tsruns10,469 bytes
  • tests/unit/extraction/brand-palette.test.tsruns16,238 bytes
  • tests/unit/extraction/brand.test.tsruns28,414 bytes
  • tests/unit/extraction/content-root.test.tsruns5,945 bytes
  • tests/unit/extraction/defuddle.test.tsruns4,173 bytes
  • tests/unit/extraction/extract.test.tsruns26,025 bytes
  • tests/unit/extraction/interleaved-binding.test.tsruns5,384 bytes
  • tests/unit/extraction/jsonld.test.tsruns5,734 bytes
  • tests/unit/extraction/lang-hints.test.tsruns2,189 bytes
  • tests/unit/extraction/list-detector.test.tsruns9,232 bytes
  • tests/unit/extraction/listing-vs-grid-regression.test.tsruns12,270 bytes
  • tests/unit/extraction/llm-fallback.test.tsruns7,542 bytes
  • tests/unit/extraction/llm/anthropic.test.tsruns2,147 bytes
  • tests/unit/extraction/llm/cache.test.tsruns2,096 bytes
  • tests/unit/extraction/llm/gemini.test.tsruns1,724 bytes
  • tests/unit/extraction/llm/groq.test.tsruns2,342 bytes
  • tests/unit/extraction/llm/hash.test.tsruns1,390 bytes
  • tests/unit/extraction/llm/openai.test.tsruns2,016 bytes
  • tests/unit/extraction/llm/select.test.tsruns3,221 bytes
  • tests/unit/extraction/llm/types.test.tsruns1,490 bytes
  • tests/unit/extraction/markdown-sanitize.test.tsruns2,442 bytes
  • tests/unit/extraction/markdown.test.tsruns14,141 bytes
  • tests/unit/extraction/readability.test.tsruns2,820 bytes
  • tests/unit/extraction/schema-confidence.test.tsruns2,998 bytes
  • tests/unit/extraction/schema-evidence-only.test.tsruns11,802 bytes
  • tests/unit/extraction/schema-truth-perf.test.tsruns4,338 bytes
  • tests/unit/extraction/schema.test.tsruns31,914 bytes
  • tests/unit/extraction/site-extractors/amazon.test.tsruns18,259 bytes
  • tests/unit/extraction/site-extractors/docs-generic.test.tsruns8,245 bytes
  • tests/unit/extraction/site-extractors/github.test.tsruns10,193 bytes
  • tests/unit/extraction/site-extractors/mdn.test.tsruns8,241 bytes
  • tests/unit/extraction/site-extractors/reddit.test.tsruns10,814 bytes
  • tests/unit/extraction/site-extractors/stackoverflow.test.tsruns5,045 bytes
  • tests/unit/extraction/site-extractors/youtube.test.tsruns16,296 bytes
  • tests/unit/extraction/structured-data-logging.test.tsruns1,213 bytes
  • tests/unit/extraction/structured-data.test.tsruns4,344 bytes
  • tests/unit/extraction/structured.test.tsruns24,030 bytes
  • tests/unit/extraction/v1/classifier.test.tsruns8,484 bytes
  • tests/unit/extraction/v1/news.test.tsruns4,472 bytes
  • tests/unit/extraction/v1/pdf.test.tsruns3,843 bytes
  • tests/unit/extraction/v1/product.test.tsruns6,505 bytes
  • tests/unit/extraction/v1/recipe.test.tsruns5,536 bytes
  • tests/unit/extraction/v1/routed.test.tsruns12,953 bytes
  • tests/unit/extraction/v1/schemas/Article.test.tsruns5,314 bytes
  • tests/unit/extraction/v1/schemas/CodeSnippet.test.tsruns2,215 bytes
  • tests/unit/extraction/v1/schemas/EventListing.test.tsruns2,990 bytes
  • tests/unit/extraction/v1/schemas/JobPosting.test.tsruns3,686 bytes
  • tests/unit/extraction/v1/schemas/Paper.test.tsruns3,350 bytes
  • tests/unit/extraction/v1/schemas/Product.test.tsruns3,116 bytes
  • tests/unit/extraction/v1/schemas/Recipe.test.tsruns3,091 bytes
  • tests/unit/extraction/v1/schemas/index.test.tsruns1,714 bytes
  • tests/unit/extraction/v1/schemas/local-llm.test.tsruns11,081 bytes
  • tests/unit/fetch/action-executor.test.tsruns13,557 bytes
  • tests/unit/fetch/ai-solve.test.tsruns13,074 bytes
  • tests/unit/fetch/auth.test.tsruns9,138 bytes
  • tests/unit/fetch/auto-pass.test.tsruns7,521 bytes
  • tests/unit/fetch/behavior-slow-runner.test.tsruns2,407 bytes
  • tests/unit/fetch/behavior.test.tsruns4,925 bytes
  • tests/unit/fetch/browser-acquire.test.tsruns9,238 bytes
  • tests/unit/fetch/browser-pool-multi.test.tsruns9,401 bytes
  • tests/unit/fetch/browser-pool.abort.test.tsruns6,108 bytes
  • tests/unit/fetch/browser-pool.cdp-direct.test.tsruns7,471 bytes
  • tests/unit/fetch/browser-pool.challenge.test.tsruns30,896 bytes
  • tests/unit/fetch/browser-pool.channel.test.tsruns10,116 bytes
  • tests/unit/fetch/browser-pool.clearance.test.tsruns8,116 bytes
  • tests/unit/fetch/browser-pool.download.test.tsruns5,982 bytes
  • tests/unit/fetch/browser-pool.driver-fallback.test.tsruns5,297 bytes
  • tests/unit/fetch/browser-pool.humanize.test.tsruns5,904 bytes
  • tests/unit/fetch/browser-pool.hydration.test.tsruns2,507 bytes
  • tests/unit/fetch/browser-pool.image-subtype.test.tsruns1,674 bytes
  • tests/unit/fetch/browser-pool.navigating.test.tsruns2,651 bytes
  • tests/unit/fetch/browser-pool.proxy.test.tsruns4,314 bytes
  • tests/unit/fetch/browser-pool.scraping-browser.test.tsruns6,351 bytes
  • tests/unit/fetch/browser-pool.stealth.test.tsruns13,795 bytes
  • tests/unit/fetch/browser-pool.timeout.test.tsruns3,009 bytes
  • tests/unit/fetch/browser-pool.widget-locate-budget.test.tsruns2,585 bytes
  • tests/unit/fetch/browser-probe.test.tsruns3,536 bytes
  • tests/unit/fetch/browser-selector.test.tsruns6,894 bytes
  • tests/unit/fetch/browser-types.test.tsruns4,293 bytes
  • tests/unit/fetch/cdp-client.test.tsruns9,065 bytes
  • tests/unit/fetch/cdp-direct-discover-retry.test.tsruns1,895 bytes
  • tests/unit/fetch/cdp-direct-egress-policy.test.tsruns6,041 bytes
  • tests/unit/fetch/cdp-direct-fetch.test.tsruns16,495 bytes
  • tests/unit/fetch/cdp-direct-identity.test.tsruns3,435 bytes
  • tests/unit/fetch/cdp-direct.test.tsruns6,762 bytes
  • tests/unit/fetch/challenge-classify.test.tsruns13,204 bytes
  • tests/unit/fetch/challenge-completion.test.tsruns6,213 bytes
  • tests/unit/fetch/challenge-status-distinguishable.test.tsruns4,332 bytes
  • tests/unit/fetch/clearance-major-drift.test.tsruns2,514 bytes
  • tests/unit/fetch/clearance-reuse.test.tsruns7,437 bytes
  • tests/unit/fetch/content-check.test.tsruns2,257 bytes
  • tests/unit/fetch/error-describe.test.tsruns1,915 bytes
  • tests/unit/fetch/escape-hatch.test.tsruns12,937 bytes
  • tests/unit/fetch/http-client.test.tsruns14,626 bytes
  • tests/unit/fetch/human-solve.test.tsruns7,380 bytes
  • tests/unit/fetch/hydration-probe.test.tsruns21,547 bytes
  • tests/unit/fetch/playwright-tier.hydration-gate.test.tsruns9,294 bytes
  • tests/unit/fetch/politeness.test.tsruns1,863 bytes
  • tests/unit/fetch/proxy-credentials.test.tsruns4,179 bytes
  • tests/unit/fetch/reddit-api.test.tsruns19,729 bytes
  • tests/unit/fetch/reddit-url-fidelity.test.tsruns2,282 bytes
  • tests/unit/fetch/redirect-guard.test.tsruns6,928 bytes
  • tests/unit/fetch/resource-leak-guards.test.tsruns2,582 bytes
  • tests/unit/fetch/router-antibot-domains.test.tsruns17,933 bytes
  • tests/unit/fetch/router-browser-acquire.test.tsruns12,959 bytes
  • tests/unit/fetch/router-challenge-status.test.tsruns12,373 bytes
  • tests/unit/fetch/router-clearance-route-gate.test.tsruns5,740 bytes
  • tests/unit/fetch/router-clearance.test.tsruns9,091 bytes
  • tests/unit/fetch/router-escalation-tuning.test.tsruns12,976 bytes
  • tests/unit/fetch/router-escape-hatch.test.tsruns5,756 bytes
  • tests/unit/fetch/router-mode.test.tsruns4,272 bytes
  • tests/unit/fetch/router-politeness.test.tsruns11,461 bytes
  • tests/unit/fetch/router-reddit-api.test.tsruns6,882 bytes
  • tests/unit/fetch/router-stealth.test.tsruns7,777 bytes
  • tests/unit/fetch/router-tls.test.tsruns11,803 bytes
  • tests/unit/fetch/router.test.tsruns35,783 bytes
  • tests/unit/fetch/scraping-browser.test.tsruns8,047 bytes
  • tests/unit/fetch/settle.test.tsruns16,738 bytes
  • tests/unit/fetch/solve-ladder.test.tsruns7,603 bytes
  • tests/unit/fetch/stealth-driver-test-isolation.test.tsruns3,190 bytes
  • tests/unit/fetch/stealth-driver.test.tsruns3,986 bytes
  • tests/unit/fetch/stealth.test.tsruns7,852 bytes
  • tests/unit/fetch/tls-tier.test.tsruns51,435 bytes
  • tests/unit/help-overlay.test.tsxruns806 bytes
  • tests/unit/helpers/wait-for.test.tsruns953 bytes
  • tests/unit/init-flags.test.tsruns5,811 bytes
  • tests/unit/instructions-v3.test.tsruns12,739 bytes
  • tests/unit/instructions.test.tsruns1,922 bytes
  • tests/unit/integrations/cloud/llm/text-adapters-vision.test.tsruns4,510 bytes
  • tests/unit/integrations/custom-backend.test.tsruns6,956 bytes
  • tests/unit/integrations/llm-retry.test.tsruns3,394 bytes
  • tests/unit/integrations/llm-runner.test.tsruns10,459 bytes
  • tests/unit/integrations/llm-select-seam.test.tsruns7,989 bytes
  • tests/unit/integrations/local-tier.test.tsruns8,142 bytes
  • tests/unit/logger-suppression.test.tsruns2,006 bytes
  • tests/unit/logger.test.tsruns3,189 bytes
  • tests/unit/mcp-description-budget.test.tsruns3,317 bytes
  • tests/unit/package-deps.test.tsruns5,066 bytes
  • tests/unit/package-metadata.test.tsruns3,584 bytes
  • tests/unit/persisted-config.test.tsruns10,705 bytes
  • tests/unit/plugins/example-search-engine.test.tsruns644 bytes
  • tests/unit/plugins/loader.test.tsruns7,511 bytes
  • tests/unit/plugins/registry.test.tsruns5,881 bytes
  • tests/unit/plugins/validate.test.tsruns8,264 bytes
  • tests/unit/providers/embed-provider-factory.test.tsruns1,958 bytes
  • tests/unit/providers/extract-provider-factory.test.tsruns823 bytes
  • tests/unit/providers/idle-unload.test.tsruns4,108 bytes
  • tests/unit/providers/provider-idle-unload.test.tsruns14,842 bytes
  • tests/unit/providers/rerank-provider-factory.test.tsruns4,716 bytes
  • tests/unit/providers/search-provider-factory.test.tsruns5,039 bytes
  • tests/unit/providers/vector-store-factory.test.tsruns1,746 bytes
  • tests/unit/python-env-resolve.test.tsruns1,929 bytes
  • tests/unit/python-env-venv.test.tsruns4,126 bytes
  • tests/unit/python-env.test.tsruns2,833 bytes
  • tests/unit/repl/commands/agent.test.tsruns2,800 bytes
  • tests/unit/repl/commands/cache.test.tsruns2,374 bytes
  • tests/unit/repl/commands/crawl.test.tsruns2,801 bytes
  • tests/unit/repl/commands/diff.test.tsruns4,756 bytes
  • tests/unit/repl/commands/extract.test.tsruns2,553 bytes
  • tests/unit/repl/commands/fetch.test.tsruns5,300 bytes
  • tests/unit/repl/commands/find-similar.test.tsruns3,593 bytes
  • tests/unit/repl/commands/research.test.tsruns2,930 bytes
  • tests/unit/repl/commands/search.test.tsruns4,863 bytes
  • tests/unit/repl/commands/watch.test.tsruns4,827 bytes
  • tests/unit/repl/completer.test.tsruns3,256 bytes
  • tests/unit/repl/formatters.test.tsruns10,830 bytes
  • tests/unit/repl/parser.test.tsruns6,256 bytes
  • tests/unit/repl/shell-history-mode.test.tsruns3,792 bytes
  • tests/unit/repl/shell.test.tsruns9,329 bytes
  • tests/unit/research/branch-exploration.test.tsruns5,151 bytes
  • tests/unit/research/brief.test.tsruns39,021 bytes
  • tests/unit/research/citation-graph.test.tsruns6,517 bytes
  • tests/unit/research/decompose.test.tsruns13,308 bytes
  • tests/unit/research/entity-extractor.test.tsruns1,698 bytes
  • tests/unit/research/gap-detection.test.tsruns1,291 bytes
  • tests/unit/research/pipeline-breadth.test.tsruns6,183 bytes
  • tests/unit/research/pipeline-budget.test.tsruns2,659 bytes
  • tests/unit/research/pipeline-score-floor.test.tsruns12,402 bytes
  • tests/unit/research/pipeline-shell-completeness.test.tsruns6,544 bytes
  • tests/unit/research/pipeline-source-validation.test.tsruns10,811 bytes
  • tests/unit/research/pipeline.llm-gate-keystore.test.tsruns5,380 bytes
  • tests/unit/research/pipeline.local-tier.test.tsruns8,880 bytes
  • tests/unit/research/pipeline.test.tsruns15,052 bytes
  • tests/unit/research/render-brief.test.tsruns13,900 bytes
  • tests/unit/research/source-validation.test.tsruns10,205 bytes
  • tests/unit/research/synthesis-local.test.tsruns15,778 bytes
  • tests/unit/research/synthesize.test.tsruns9,015 bytes
  • tests/unit/response-time.test.tsruns2,853 bytes
  • tests/unit/search/answer-fallback.test.tsruns2,970 bytes
  • tests/unit/search/answer-synthesis-quota.test.tsruns3,074 bytes
  • tests/unit/search/answer-synthesis.provider-priority.test.tsruns4,191 bytes
  • tests/unit/search/answer-synthesis.test.tsruns19,608 bytes
  • tests/unit/search/authority-boost.aliases.test.tsruns2,238 bytes
  • tests/unit/search/authority-boost.cap.test.tsruns1,595 bytes
  • tests/unit/search/brand-collision-warning.test.tsruns13,378 bytes
  • tests/unit/search/burst-cascade.test.tsruns5,590 bytes
  • tests/unit/search/content-fetch.test.tsruns35,421 bytes
  • tests/unit/search/context-formatter.test.tsruns7,032 bytes
  • tests/unit/search/core/canonical-url.test.tsruns4,300 bytes
  • tests/unit/search/core/code-routing.test.tsruns10,744 bytes
  • tests/unit/search/core/core-provider-collision-dispatch.test.tsruns6,727 bytes
  • tests/unit/search/core/core-provider-error-intent.test.tsruns4,571 bytes
  • tests/unit/search/core/core-provider-kept-zero.test.tsruns5,401 bytes
  • tests/unit/search/core/core-provider-rare-variant.test.tsruns1,779 bytes
  • tests/unit/search/core/core-provider-recency-backfill.test.tsruns6,304 bytes
  • tests/unit/search/core/core-provider-score-floor.test.tsruns7,705 bytes
  • tests/unit/search/core/core-provider-tier-budgets.test.tsruns7,917 bytes
  • tests/unit/search/core/date-window.test.tsruns3,214 bytes
  • tests/unit/search/core/domain-quality.test.tsruns5,376 bytes
  • tests/unit/search/core/engine-quality.test.tsruns2,547 bytes
  • tests/unit/search/core/error-intent.test.tsruns7,372 bytes
  • tests/unit/search/core/lexical-alignment.test.tsruns2,234 bytes
  • tests/unit/search/core/orchestrator-cache.test.tsruns5,602 bytes
  • tests/unit/search/core/orchestrator-rank.test.tsruns21,777 bytes
  • tests/unit/search/core/query-expansion.test.tsruns3,124 bytes
  • tests/unit/search/core/rare-terms.test.tsruns6,312 bytes
  • tests/unit/search/core/rerank-fold.test.tsruns27,082 bytes
  • tests/unit/search/core/score-floor-per-engine.test.tsruns5,772 bytes
  • tests/unit/search/core/score-floor.test.tsruns8,312 bytes
  • tests/unit/search/core/text-tokenizer.test.tsruns1,205 bytes
  • tests/unit/search/country.test.tsruns4,256 bytes
  • tests/unit/search/dedup.test.tsruns3,347 bytes
  • tests/unit/search/degraded-recovery.test.tsruns15,329 bytes
  • tests/unit/search/engine-breaker.test.tsruns24,991 bytes
  • tests/unit/search/engine-health.test.tsruns7,694 bytes
  • tests/unit/search/engine-quality.test.tsruns4,200 bytes
  • tests/unit/search/engine-soft-deadline.test.tsruns10,799 bytes
  • tests/unit/search/engine-telemetry.test.tsruns10,869 bytes
  • tests/unit/search/engine-throttle.test.tsruns7,412 bytes
  • tests/unit/search/engine-warnings.test.tsruns3,465 bytes
  • tests/unit/search/engines-used-semantics.test.tsruns6,189 bytes
  • tests/unit/search/engines/arxiv.test.tsruns3,578 bytes
  • tests/unit/search/engines/bing-decoder.test.tsruns1,604 bytes
  • tests/unit/search/engines/bing-news.test.tsruns3,579 bytes
  • tests/unit/search/engines/bing.test.tsruns2,366 bytes
  • tests/unit/search/engines/brave-image.test.tsruns4,259 bytes
  • tests/unit/search/engines/brave.test.tsruns1,938 bytes
  • tests/unit/search/engines/crates-io.test.tsruns3,979 bytes
  • tests/unit/search/engines/date-parsing.test.tsruns4,056 bytes
  • tests/unit/search/engines/dblp.test.tsruns8,350 bytes
  • tests/unit/search/engines/ddg-image.test.tsruns4,621 bytes
  • tests/unit/search/engines/devdocs.test.tsruns1,906 bytes
  • tests/unit/search/engines/duckduckgo.test.tsruns2,669 bytes
  • tests/unit/search/engines/github-code.test.tsruns6,900 bytes
  • tests/unit/search/engines/hn-algolia.test.tsruns4,931 bytes
  • tests/unit/search/engines/lobsters.test.tsruns6,882 bytes
  • tests/unit/search/engines/marginalia.test.tsruns3,544 bytes
  • tests/unit/search/engines/mdn.test.tsruns2,669 bytes
  • tests/unit/search/engines/mojeek.test.tsruns3,408 bytes
  • tests/unit/search/engines/openalex.test.tsruns7,356 bytes
  • tests/unit/search/engines/openreview.test.tsruns5,753 bytes
  • tests/unit/search/engines/semantic-scholar.test.tsruns4,734 bytes
  • tests/unit/search/engines/stackoverflow.test.tsruns3,991 bytes
  • tests/unit/search/engines/wikipedia.test.tsruns1,857 bytes
  • tests/unit/search/evidence-default.test.tsruns7,182 bytes
  • tests/unit/search/evidence-score.test.tsruns4,624 bytes
  • tests/unit/search/evidence-token-discipline.test.tsruns8,493 bytes
  • tests/unit/search/evidence.test.tsruns4,160 bytes
  • tests/unit/search/exact-match-pre-dedup.test.tsruns5,930 bytes
  • tests/unit/search/exact-match.test.tsruns4,926 bytes
  • tests/unit/search/exclude-domains.test.tsruns5,268 bytes
  • tests/unit/search/expand-query.test.tsruns657 bytes
  • tests/unit/search/favicon.test.tsruns4,352 bytes
  • tests/unit/search/filters.test.tsruns9,181 bytes
  • tests/unit/search/find-similar-embedding.test.tsruns13,424 bytes
  • tests/unit/search/find-similar-threshold.test.tsruns6,010 bytes
  • tests/unit/search/find-similar.test.tsruns24,071 bytes
  • tests/unit/search/find-similar/crawl-rank.test.tsruns16,452 bytes
  • tests/unit/search/find-similar/generate-search-queries.test.tsruns1,955 bytes
  • tests/unit/search/find-similar/mode.test.tsruns2,274 bytes
  • tests/unit/search/format-rename.test.tsruns992 bytes
  • tests/unit/search/freshness.test.tsruns5,920 bytes
  • tests/unit/search/highlights-evidence.test.tsruns1,926 bytes
  • tests/unit/search/highlights.test.tsruns6,601 bytes
  • tests/unit/search/hybrid/merge.test.tsruns5,243 bytes
  • tests/unit/search/hybrid/router.test.tsruns11,284 bytes
  • tests/unit/search/hybrid/signals.test.tsruns8,614 bytes
  • tests/unit/search/include-domains-hard-filter.test.tsruns8,488 bytes
  • tests/unit/search/include-images.test.tsruns5,281 bytes
  • tests/unit/search/language-filter.test.tsruns3,030 bytes
  • tests/unit/search/mojeek-probe-only.test.tsruns2,880 bytes
  • tests/unit/search/multi-query.decompose.test.tsruns2,220 bytes
  • tests/unit/search/multi-query.test.tsruns12,380 bytes
  • tests/unit/search/passage-spans.test.tsruns2,215 bytes
  • tests/unit/search/query-understanding.test.tsruns10,047 bytes
  • tests/unit/search/query.test.tsruns1,859 bytes
  • tests/unit/search/remote-rerank-provider.test.tsruns6,209 bytes
  • tests/unit/search/rerank-recency.test.tsruns3,732 bytes
  • tests/unit/search/rerank.test.tsruns6,442 bytes
  • tests/unit/search/reranker/consensus-boost.test.tsruns2,278 bytes
  • tests/unit/search/reranker/recency.test.tsruns1,940 bytes
  • tests/unit/search/reranker/transformers-rerank-provider-errors.test.tsruns2,851 bytes
  • tests/unit/search/rrf.test.tsruns6,182 bytes
  • tests/unit/search/sampling.test.tsruns6,211 bytes
  • tests/unit/search/searxng-filtering.test.tsruns7,856 bytes
  • tests/unit/search/searxng-orchestrator-strip.test.tsruns3,077 bytes
  • tests/unit/search/searxng.test.tsruns3,174 bytes
  • tests/unit/search/time-range.test.tsruns6,060 bytes
  • tests/unit/search/tokens.test.tsruns2,655 bytes
  • tests/unit/search/transformers-rerank-provider.test.tsruns4,370 bytes
  • tests/unit/search/truncate.test.tsruns2,586 bytes
  • tests/unit/search/url-unwrap.test.tsruns1,307 bytes
  • tests/unit/search/v1/context-rank.test.tsruns6,326 bytes
  • tests/unit/search/v1/engine-base.test.tsruns9,434 bytes
  • tests/unit/search/v1/intent-router.test.tsruns15,555 bytes
  • tests/unit/search/v1/orchestrator.test.tsruns60,850 bytes
  • tests/unit/search/v1/recency-boost.test.tsruns6,278 bytes
  • tests/unit/search/v1/recent-cache-dedup.test.tsruns8,038 bytes
  • tests/unit/search/v1/rss/feed-config.test.tsruns4,200 bytes
  • tests/unit/search/v1/rss/feed-parser.test.tsruns4,960 bytes
  • tests/unit/search/v1/rss/feed-poller.test.tsruns4,895 bytes
  • tests/unit/search/v1/rss/feed-store.test.tsruns3,364 bytes
  • tests/unit/search/v1/rss/rss-engine.test.tsruns2,548 bytes
  • tests/unit/search/v1/v1-provider.test.tsruns32,437 bytes
  • tests/unit/search/v1/verticals/code.test.tsruns4,246 bytes
  • tests/unit/search/v1/verticals/docs.test.tsruns2,865 bytes
  • tests/unit/search/v1/verticals/general.test.tsruns3,543 bytes
  • tests/unit/search/v1/verticals/news.test.tsruns5,738 bytes
  • tests/unit/search/v1/verticals/papers.test.tsruns1,999 bytes
  • tests/unit/search/validator.test.tsruns2,804 bytes
  • tests/unit/searxng/bootstrap-lock.test.tsruns3,824 bytes
  • tests/unit/searxng/bootstrap-retry.test.tsruns16,059 bytes
  • tests/unit/searxng/bootstrap.test.tsruns5,379 bytes
  • tests/unit/searxng/docker.test.tsruns7,695 bytes
  • tests/unit/searxng/enabled.test.tsruns3,425 bytes
  • tests/unit/searxng/process-health.test.tsruns3,610 bytes
  • tests/unit/searxng/process-lock.test.tsruns2,267 bytes
  • tests/unit/searxng/process.test.tsruns6,207 bytes
  • tests/unit/security/key-crypto.test.tsruns3,050 bytes
  • tests/unit/security/key-store.test.tsruns10,514 bytes
  • tests/unit/server/backend-status-bootstrapping.test.tsruns1,549 bytes
  • tests/unit/server/backend-status.test.tsruns1,446 bytes
  • tests/unit/server/format-schema.test.tsruns1,411 bytes
  • tests/unit/server/instructions.test.tsruns6,000 bytes
  • tests/unit/server/schema-registration.test.tsruns11,085 bytes
  • tests/unit/server/search-response.test.tsruns4,124 bytes
  • tests/unit/server/server-factory.test.tsruns7,822 bytes
  • tests/unit/server/tool-annotations.test.tsruns8,464 bytes
  • tests/unit/server/tool-schemas.test.tsruns543 bytes
  • tests/unit/server/warmup-on-start.test.tsruns7,015 bytes
  • tests/unit/setup-status.test.tsruns13,142 bytes
  • tests/unit/skill-md.test.tsruns12,559 bytes
  • tests/unit/sponsors-links.test.tsruns8,176 bytes
  • tests/unit/tools/agent.test.tsruns12,981 bytes
  • tests/unit/tools/cache-hybrid.test.tsruns7,389 bytes
  • tests/unit/tools/cache.test.tsruns14,980 bytes
  • tests/unit/tools/crawl-map-routing.test.tsruns5,200 bytes
  • tests/unit/tools/crawl.test.tsruns13,577 bytes
  • tests/unit/tools/diff.test.tsruns12,752 bytes
  • tests/unit/tools/extract.body-retained.test.tsruns2,056 bytes
  • tests/unit/tools/extract.test.tsruns32,295 bytes
  • tests/unit/tools/fetch-embedding.test.tsruns4,239 bytes
  • tests/unit/tools/fetch-mode.test.tsruns4,353 bytes
  • tests/unit/tools/fetch.challenge-provenance.test.tsruns3,821 bytes
  • tests/unit/tools/fetch.http-error.test.tsruns2,081 bytes
  • tests/unit/tools/fetch.silent-failures.test.tsruns10,054 bytes
  • tests/unit/tools/fetch.stealth-cache-bypass.test.tsruns3,624 bytes
  • tests/unit/tools/fetch.test.tsruns37,380 bytes
  • tests/unit/tools/find-similar.test.tsruns16,730 bytes
  • tests/unit/tools/max-tokens-out.test.tsruns9,969 bytes
  • tests/unit/tools/research.test.tsruns10,414 bytes
  • tests/unit/tools/search-answer.test.tsruns12,346 bytes
  • tests/unit/tools/search-cache-embed.test.tsruns3,326 bytes
  • tests/unit/tools/search-filtering.test.tsruns13,168 bytes
  • tests/unit/tools/search-max-content-chars.test.tsruns4,116 bytes
  • tests/unit/tools/search-mode.test.tsruns2,352 bytes
  • tests/unit/tools/search-multi-query.test.tsruns10,271 bytes
  • tests/unit/tools/search-timing.test.tsruns5,537 bytes
  • tests/unit/tools/search-warning.test.tsruns2,011 bytes
  • tests/unit/tools/search.engine-warnings.test.tsruns5,983 bytes
  • tests/unit/tools/search.images.test.tsruns8,432 bytes
  • tests/unit/tools/search.long-tail-engines.test.tsruns6,344 bytes
  • tests/unit/tools/search.test.tsruns15,330 bytes
  • tests/unit/tui/verify-e2e.test.tsruns16,690 bytes
  • tests/unit/types-multi-query.test.tsruns1,728 bytes
  • tests/unit/types.test.tsruns7,905 bytes
  • tests/unit/types/solve-provenance.test.tsruns1,941 bytes
  • tests/unit/types/stage-result.test.tsruns1,282 bytes
  • tests/unit/util/abort.test.tsruns3,020 bytes
  • tests/unit/util/child-env.test.tsruns2,909 bytes
  • tests/unit/util/mode.test.tsruns1,469 bytes
  • tests/unit/util/native-abi.test.tsruns3,501 bytes
  • tests/unit/util/redact-url.test.tsruns1,336 bytes
  • tests/unit/watch/ssrf.test.tsruns13,438 bytes
  • tests/unit/watch/store.test.tsruns6,898 bytes
  • tests/unit/wizard-setup-complete.test.tsxruns2,159 bytes
  • tests/watch/ssrf-resolved-host.test.tsruns2,815 bytes
  • tests/watch/ssrf-resolved-serve-target.test.tsruns4,804 bytes
  • tsconfig.build.jsonasset169 bytes
  • tsconfig.jsonasset531 bytes
  • tsup.config.tsruns272 bytes
  • vitest.config.tsruns571 bytes
  • vitest.perf.config.tsruns443 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills 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

  1. #257 from Oct 31 to Nov 1
  2. #258 on Nov 2
  3. #260 on Nov 3
  4. #261 on Nov 4
  5. #262 on Nov 5
  6. #264 since Nov 6
66 earlier periods
  1. #223 on Aug 2
  2. #218 on Aug 7
  3. #217 on Aug 8
  4. #216 on Aug 9
  5. #222 on Aug 10
  6. #220 on Aug 11
  7. #217 on Aug 12
  8. #221 from Aug 13 to Aug 14
  9. #219 on Aug 15
  10. #218 from Aug 16 to Aug 17
  11. #222 on Aug 18
  12. #221 on Aug 19
  13. #218 on Aug 20
  14. #219 on Aug 21
  15. #218 on Aug 22
  16. #224 on Aug 23
  17. #223 from Aug 24 to Aug 26
  18. #224 on Aug 27
  19. #223 from Aug 28 to Aug 29
  20. #221 from Aug 30 to Aug 31
  21. #226 on Sep 1
  22. #219 on Sep 2
  23. #228 on Sep 3
  24. #223 from Sep 4 to Sep 5
  25. #221 on Sep 6
  26. #222 from Sep 7 to Sep 8
  27. #223 on Sep 9
  28. #221 on Sep 10
  29. #223 on Sep 11
  30. #225 on Sep 12
  31. #227 on Sep 13
  32. #226 on Sep 14
  33. #227 from Sep 15 to Sep 16
  34. #226 on Sep 17
  35. #229 on Sep 18
  36. #227 on Sep 19
  37. #231 on Sep 20
  38. #230 from Sep 21 to Sep 23
  39. #229 on Sep 24
  40. #228 from Sep 25 to Sep 26
  41. #229 on Sep 27
  42. #231 from Sep 28 to Sep 29
  43. #228 on Sep 30
  44. #231 on Oct 1
  45. #233 on Oct 2
  46. #229 on Oct 3
  47. #227 on Oct 4
  48. #228 on Oct 5
  49. #231 on Oct 6
  50. #233 on Oct 7
  51. #232 on Oct 8
  52. #237 on Oct 9
  53. #234 from Oct 10 to Oct 11
  54. #238 on Oct 12
  55. #239 on Oct 13
  56. #238 on Oct 14
  57. #239 on Oct 15
  58. #237 on Oct 16
  59. #239 from Oct 17 to Oct 18
  60. #240 from Oct 19 to Oct 20
  61. #242 from Oct 21 to Oct 22
  62. #243 on Oct 24
  63. #245 on Oct 25
  64. #248 on Oct 28
  65. #252 on Oct 29
  66. #253 on Oct 30

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • package-lock.json:7405 Analysis incomplete: signal count limit reached
  • site/package-lock.json:7812 Analysis incomplete: signal count limit reached
  • tests/fixtures/extraction/react-reference-real.html:1 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/react-reference-real.html:99 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/react-reference-real.html:97 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/react-reference-real.html:98 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/react-reference-real.html:141 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/react-reference-real.html:139 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/vitepress-guide.html:10 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/vitepress-guide.html:8 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/extraction/vitepress-guide.html:9 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/reranker-tokenizer-corpus.json:17 Analysis incomplete: physical or joined line exceeds character limit
  • tests/fixtures/reranker-tokenizer-corpus.json:18 Analysis incomplete: physical or joined line exceeds character limit
Show all 21,127 signals by file

.github/FUNDING.yml

  • Network accessline 10
    # carries both the thank-you and the how-to-sponsor contact. buy_me_a_coffee: knockoutez custom: "https://wigolo.app/#sponsors"
  • Network accessline 12
    custom: "https://wigolo.app/#sponsors"

.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

  • Network accessline 23
    working-directory: site     env:       NEXT_PUBLIC_SITE_URL: https://wigolo.app
  • Network accessline 24
    env:       NEXT_PUBLIC_SITE_URL: https://wigolo.app       NEXT_PUBLIC_WEB3FORMS_KEY: ${{ secrets.WEB3FORMS_KEY }}
  • Network accessline 25
    NEXT_PUBLIC_SITE_URL: https://wigolo.app

.github/workflows/star-chart.yml

  • Network accessline 35
    [Credential-related source omitted]
  • Network accessline 36
    [Credential-related source omitted]
  • Network accessline 37
    [Credential-related source omitted]
  • Access to secretsline 37
    [Credential-related source omitted]

.gitignore

  • Access to secretsline 20
    [Credential-related source omitted]

ADOPTERS.md

  • Network accessline 9
    - **Open a pull request** adding a row below, or - **[File an adopter issue](https://github.com/KnockOutEZ/wigolo/issues/new?template=adopter.yml)**
  • Network accessline 10
    - **[File an adopter issue](https://github.com/KnockOutEZ/wigolo/issues/new?template=adopter.yml)**

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/>.

Makefile

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 63
    rm -rf dist

README.md

  • Network accessline 11
    [![npm](https://img.shields.io/npm/v/wigolo?color=cb3837&logo=npm)](https://www.npmjs.com/package/wigolo)
  • Network accessline 12
    [![npm downloads](https://img.shields.io/npm/dm/wigolo?color=cb3837&logo=npm&label=downloads)](https://www.npmjs.com/package/wigolo)
  • Network accessline 13
    [![GitHub stars](https://img.shields.io/github/stars/KnockOutEZ/wigolo?style=flat&logo=github&color=e3b341)](https://github.com/KnockOutEZ/wigolo/stargazers)
  • Network accessline 14
    [![CI](https://img.shields.io/github/actions/workflow/status/KnockOutEZ/wigolo/ci.yml?branch=main&logo=github&label=CI)](https://github.com/KnockOutEZ/wigolo/actions/workflows/ci.yml)
  • Network accessline 15
    [![node](https://img.shields.io/badge/node-%E2%89%A520-339933?logo=node.js&logoColor=white)](https://nodejs.org)
  • Network accessline 16
    [![MCP](https://img.shields.io/badge/MCP-server-7c3aed)](https://modelcontextprotocol.io)
  • Network accessline 17
    [![license](https://img.shields.io/badge/license-AGPL--3.0-2563eb)](#license)
  • Network accessline 18
    [![status](https://img.shields.io/badge/status-public%20beta-b7791f)](#beta--feedback)
  • Network accessline 19
    [![follow on X](https://img.shields.io/badge/follow-%40yourtowhid-000000?logo=x&logoColor=white)](https://x.com/yourtowhid)
  • Network accessline 20
    [![Discord](https://img.shields.io/badge/Discord-join%20the%20community-5865F2?logo=discord&logoColor=white)](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

  • Network accessline 15
    - **Wordmark:** the word `wigolo`, always lowercase. - **Font:** [Inter](https://rsms.me/inter/), weight **800** (ExtraBold).
  • Network accessline 16
    - **Font:** [Inter](https://rsms.me/inter/), weight **800** (ExtraBold).

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

  • Network accessline 298
    - [TypeScript Handbook: Generics](https://www.typescriptlang.org/docs/handbook/2/generics.html)
  • Network accessline 299
    - [Node.js EventEmitter](https://nodejs.org/api/events.html)
  • Network accessline 300
    - [TypeScript Playground](https://www.typescriptlang.org/play)

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

  • Network accessline 262
    backend: vault   vault:     address: "https://vault.example.com"
  • Network accessline 263
    vault:     address: "https://vault.example.com"     path: "secret/data/myapp"
  • Network accessline 264
    address: "https://vault.example.com"

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
    [![Build Status](https://github.com/valyala/fasthttp/actions/workflows/ci.yml/badge.svg)](https://github.com/valyala/fasthttp/actions)
  • Network accessline 6
    [![Go Report Card](https://goreportcard.com/badge/github.com/valyala/fasthttp)](https://goreportcard.com/report/github.com/valyala/fasthttp)
  • Network accessline 7
    [![GoDoc](https://godoc.org/github.com/valyala/fasthttp?status.svg)](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

  • Network accessline 40
    try {       const response = await server.fetch('/api/stream', {
  • Network accessline 41
    const response = await server.fetch('/api/stream', {

benchmarks/extraction/fixtures/golden/github-003.md

  • Network accessline 5
    [![npm](https://img.shields.io/npm/v/zod)](https://www.npmjs.com/package/zod)
  • Network accessline 6
    [![GitHub stars](https://img.shields.io/github/stars/colinhacks/zod)](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

  • Network accessline 55
    npx wigolo fetch https://example.com --max-content-chars=400
  • Network accessline 59
    Fetch: https://example.com/
  • Network accessline 64
    [Learn more](https://iana.org/domains/example)

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

  • Access to secretsline 15
    [Credential-related source omitted]
  • Dangerous shell operationline 23
    `rm -rf ~/.wigolo` erases all of it. `wigolo config --storage` shows what's using space.
  • Access to secretsline 43
    [Credential-related source omitted]
  • Access to secretsline 44
    [Credential-related source omitted]

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

  • Network accessline 76
    wigolo config --set useProxy=true PROXY_URL=https://user:pass@proxy.example.com:8443 wigolo serve
  • Network accessline 77
    PROXY_URL=https://user:pass@proxy.example.com:8443 wigolo serve
  • Access to secretsline 80
    [Credential-related source omitted]

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

  • Network accessline 13
    "parameters": {         "method": "POST",         "url": "http://YOUR-WIGOLO-HOST:3477/v1/search",
  • Network accessline 14
    "method": "POST",         "url": "http://YOUR-WIGOLO-HOST:3477/v1/search",         "sendHeaders": true,
  • Network accessline 15
    "url": "http://YOUR-WIGOLO-HOST:3477/v1/search",

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 16
    echo echo "== 2. fetch: any URL as clean markdown ==" $WIGOLO fetch https://developer.mozilla.org/en-US/docs/Web/API/structuredClone
  • Network accessline 18
    $WIGOLO fetch https://developer.mozilla.org/en-US/docs/Web/API/structuredClone

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

  • Network accessline 3
    [`wigolo-vercel-ai-sdk`](https://www.npmjs.com/package/wigolo-vercel-ai-sdk)
  • Network accessline 4
    wraps wigolo as ready-to-register [Vercel AI SDK](https://ai-sdk.dev) tools.

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

  • Network accessline 1
    {   "$schema": "https://glama.ai/mcp/schemas/server.json",
  • Network accessline 2
    "$schema": "https://glama.ai/mcp/schemas/server.json",

llms.txt

  • Network accessline 7
    Website: https://wigolo.app/
  • Network accessline 8
    Repository: https://github.com/KnockOutEZ/wigolo

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

  • Executable scriptline 1
    Executable file
  • Network accessline 97
    )     try:         return _to_json(client.fetch(**params))
  • Network accessline 98
    try:         return _to_json(client.fetch(**params))     except WigoloError as exc:
  • Network accessline 99
    return _to_json(client.fetch(**params))

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Dangerous shell operationline 61
    rm -f "$REPO_ROOT/pkg.build.json" "$REPO_ROOT/dist/package.json" "$REPO_ROOT/dist/cli/package.json"

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

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    process.stdout.write(sponsorReleaseLine('https://wigolo.app'));

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Dangerous shell operationline 35
    rm -rf "$WORK"

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Dangerous shell operationline 32
    rm -rf "$WORK_DIR" "$PREFIX_DIR" "$DATA_DIR"

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Dangerous shell operationline 2
    # Local verification for the curl|sh install channel (spec D2, slice S-P1-SH).
  • Dangerous shell operationline 41
    cleanup() { rm -rf "$SANDBOX"; }

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

  • Network accessline 17
    [project.urls] Homepage = "https://github.com/KnockOutEZ/wigolo"
  • Network accessline 18
    Homepage = "https://github.com/KnockOutEZ/wigolo"

sdks/python/src/wigolo/__init__.py

  • Executable scriptline 1
    Executable file

sdks/python/src/wigolo/_aio.py

  • Executable scriptline 1
    Executable file
  • Network accessline 175
    async def fetch(

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

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 15
    const GH = "https://github.com/KnockOutEZ/wigolo";

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

  • Executable scriptline 1
    Executable file
  • Network accessline 63
    </a>           <a             href="https://www.npmjs.com/package/wigolo"
  • Network accessline 64
    <a             href="https://www.npmjs.com/package/wigolo"             className={styles.contact}
  • Network accessline 65
    href="https://www.npmjs.com/package/wigolo"

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

  • Executable scriptline 1
    Executable file
  • Network accessline 124
    const GH = "https://github.com/KnockOutEZ/wigolo";

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

  • Executable scriptline 1
    Executable file
  • Network accessline 11
    export const UMAMI_SRC = process.env.NEXT_PUBLIC_UMAMI_SRC || "https://cloud.umami.is/script.js";

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    export const SITE_URL =   process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";
  • Network accessline 4
    process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";
  • Network accessline 6
    export const GH = "https://github.com/KnockOutEZ/wigolo";

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

  • Executable scriptline 1
    Executable file
  • Network accessline 301
    const raw = await Promise.race([         router.fetch(url, { renderJs: 'auto' }),
  • Network accessline 302
    router.fetch(url, { renderJs: 'auto' }),

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 107
    // recursive rm would ignore receipts and user-modified files.

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 162
    '  watch add <url> | watch list | watch rm <id> | watch run <id> | watch pause <id> | watch resume <id>',
  • Network accessline 269
    Docs: https://github.com/KnockOutEZ/wigolo

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 38
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 48
    function postRemote(endpoint: string, event: TelemetryEvent): void {   try {     const result = fetch(endpoint, {
  • Network accessline 49
    try {     const result = fetch(endpoint, {       method: 'POST',
  • Network accessline 50
    const result = fetch(endpoint, {

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 7
    [Credential-related source omitted]
  • Access to secretsline 287
    [Credential-related source omitted]

src/cli/tui/actions/types.ts

  • Executable scriptline 1
    Executable file

src/cli/tui/actions/uninstall.ts

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 28
    * uninstall into an `rm -rf` of a system path.

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 20
    [Credential-related source omitted]
  • Access to secretsline 63
    [Credential-related source omitted]
  • Access to secretsline 66
    [Credential-related source omitted]
  • Access to secretsline 73
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 30
    [Credential-related source omitted]
  • Access to secretsline 37
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 8
    [Credential-related source omitted]

src/cli/tui/shell/Footer.tsx

  • Executable scriptline 1
    Executable file

src/cli/tui/shell/Header.tsx

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 32
    const rm = reducedMotion();
  • Dangerous shell operationline 74
    const dotChar = busy && !rm ? spinner.pulse[pulseFrame] : spinner.pulse[0];
  • Dangerous shell operationline 82
    ) : rm ? (

src/cli/tui/shell/HelpOverlay.tsx

  • Executable scriptline 1
    Executable file

src/cli/tui/shell/MainPane.tsx

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 17
    const rm = reducedMotion();

src/cli/tui/shell/Sidebar.tsx

  • Executable scriptline 1
    Executable file

src/cli/tui/shell/Spinner.tsx

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 7
    const rm = reducedMotion();
  • Dangerous shell operationline 14
    return <Text>{rm ? '…' : spinner.dots[i]}</Text>;

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 70
    [Credential-related source omitted]
  • Access to secretsline 71
    [Credential-related source omitted]
  • Access to secretsline 228
    [Credential-related source omitted]
  • Access to secretsline 335
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 22
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 64
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 327
    // Amazon renders these as: "ASIN <U+200D> : <U+200D> B08N5WRWNW"
  • Possible obfuscationline 330
    const cleaned = raw.replace(/[<U+200D><U+200E><U+200F><U+200B>]/g, '').trim();

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

  • Executable scriptline 1
    Executable file
  • Network accessline 70
    // Accept "Recipe", "schema:Recipe", "http://schema.org/Recipe", etc.

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 795
    [Credential-related source omitted]
  • Access to secretsline 1431
    [Credential-related source omitted]
  • Access to secretsline 1435
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 5
    [Credential-related source omitted]
  • Access to secretsline 9
    [Credential-related source omitted]
  • Access to secretsline 10
    [Credential-related source omitted]
  • Access to secretsline 16
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 127
    `sudo apt install ${pkg}${suffix}. ` +

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 23
    ' | watch list | watch rm <job_id> | watch run <job_id>' +

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 83
    '  watch add <url> [--interval=SECONDS] | watch list | watch rm <id> | watch run <id>',

src/research/branch-exploration.ts

  • Executable scriptline 1
    Executable file

src/research/brief.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 430
    // Auto-link: `<https://...>`

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 95
    [Credential-related source omitted]

src/research/synthesize.ts

  • Executable scriptline 1
    Executable file

src/search/answer-synthesis.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 267
    [Credential-related source omitted]
  • Access to secretsline 330
    [Credential-related source omitted]
  • Access to secretsline 331
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 81
    // Drop trailing slash on the path when there are no params (URL serializer   // keeps "https://x.com/" — we want "https://x.com").
  • Network accessline 82
    // keeps "https://x.com/" — we want "https://x.com").

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 9
    [Credential-related source omitted]
  • Access to secretsline 11
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 75
    params.set('setlang', 'en');     }     const url = `https://www.bing.com/search?${params}`;
  • Network accessline 77
    const url = `https://www.bing.com/search?${params}`;
  • Network accessline 81
    const response = await fetch(url, {

src/search/engines/bing.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 87
    params.set('setlang', 'en');     }     const url = `https://www.bing.com/search?${params}`;
  • Network accessline 89
    const url = `https://www.bing.com/search?${params}`;
  • Network accessline 93
    const response = await fetch(url, {

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

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    const MDN_HOST = 'https://developer.mozilla.org';
  • Network accessline 37
    const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });

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

  • Executable scriptline 1
    Executable file
  • Network accessline 60
    const url = `https://api.semanticscholar.org/graph/v1/paper/search?${params}`;
  • Network accessline 63
    const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });

src/search/engines/stackoverflow.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 65
    const url = `https://api.stackexchange.com/2.3/search/advanced?${params}`;
  • Network accessline 68
    const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });

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

  • Executable scriptline 1
    Executable file
  • Network accessline 96
    const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 11
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 349
    const raw = await router.fetch(input.url, {

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 20
    [Credential-related source omitted]

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

  • Network accessline 18
    <pre><code class="language-typescript">async function fetchUser(id: string): Promise&lt;User&gt; {   const response = await fetch(`/api/users/${id}`);
  • Network accessline 19
    const response = await fetch(`/api/users/${id}`);

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

  • Network accessline 6
    <script type="application/ld+json">   {     "@context": "https://schema.org",
  • Network accessline 7
    {     "@context": "https://schema.org",     "@type": "Article",
  • Network accessline 8
    "@context": "https://schema.org",

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&amp;w=64&amp;q=75 1x, /_next/image?url=%2Fimages%2Fuwu.png&amp;w=128&amp;q=75 2x"/><div id="__next"><div></div>
  • Network accessline 98
    })();               </script><link rel="preload" as="image" imageSrcSet="/_next/image?url=%2Fimages%2Fuwu.png&amp;w=64&amp;q=75 1x, /_next/image?url=%2Fimages%2Fuwu.png&amp;w=128&amp;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&amp;w=64&amp;q=75 1x, /_next/image?url=%2Fimages%2Fuwu.png&amp;w=128&amp;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

  • Network accessline 23
    [Credential-related source omitted]
  • Network accessline 24
    const result = await client.fetch('https://example.com');</code></pre>

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

  • Network accessline 6
    <script type="application/ld+json">     {       "@context": "https://schema.org",
  • Network accessline 7
    {       "@context": "https://schema.org",       "@type": "Article",
  • Network accessline 8
    "@context": "https://schema.org",

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

  • 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",

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

  • Network accessline 6
    <script type="application/ld+json">     {       "@context": "https://schema.org",
  • Network accessline 7
    {       "@context": "https://schema.org",       "@graph": [
  • Network accessline 8
    "@context": "https://schema.org",

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": "![AI analyzing code on screen](https://example.com/images/ai-code-analysis-hero.jpg)
  • Network accessline 110
    "markdown": "![AI analyzing code on screen](https://example.com/images/ai-code-analysis-hero.jpg)
  • 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

  • Executable scriptline 1
    Executable file
  • Network accessline 8
    'utf8', ); const URL = 'https://react.dev/learn/managing-state';
  • Network accessline 10
    const URL = 'https://react.dev/learn/managing-state';

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

  • Executable scriptline 1
    Executable file
  • Network accessline 9
    it('returns explicit cache_miss StageError when URL not cached', async () => {     const url = 'https://example.com/never-cached-' + Date.now();
  • Network accessline 10
    const url = 'https://example.com/never-cached-' + Date.now();

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 17
    [Credential-related source omitted]
  • Access to secretsline 18
    [Credential-related source omitted]
  • Access to secretsline 19
    [Credential-related source omitted]
  • Access to secretsline 21
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 121
    [Credential-related source omitted]
  • Access to secretsline 123
    [Credential-related source omitted]
  • Access to secretsline 127
    [Credential-related source omitted]
  • Access to secretsline 136
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 162
    it('handles links with complex URLs', () => {     const md = '[link](https://example.com/path?q=1&b=2#frag)';
  • Network accessline 163
    const md = '[link](https://example.com/path?q=1&b=2#frag)';

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 242
    // Skill dirs must remain — a naive recursive rm was removed on purpose so

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 237
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 37
    [Credential-related source omitted]
  • Access to secretsline 40
    [Credential-related source omitted]
  • Access to secretsline 45
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 187
    it('--no-cache / --no-web / --no-content are boolean-false curated aliases', () => {     const nc = coerceFlags('find-similar', { 'no-cache': 'true' });
  • Network accessline 188
    const nc = coerceFlags('find-similar', { 'no-cache': 'true' });

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 6
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 78
    [Credential-related source omitted]
  • Access to secretsline 85
    [Credential-related source omitted]
  • Access to secretsline 120
    [Credential-related source omitted]
  • Access to secretsline 139
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 144
    describe('uninstall — path-safety guard (rm -rf footgun prevention)', () => {

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 47
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 52
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 55
    [Credential-related source omitted]
  • Access to secretsline 59
    [Credential-related source omitted]
  • Access to secretsline 60
    [Credential-related source omitted]

tests/unit/cli/tui/schema/migrate.test.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 39
    [Credential-related source omitted]
  • Access to secretsline 43
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 16
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 126
    [Credential-related source omitted]
  • Access to secretsline 289
    [Credential-related source omitted]
  • Access to secretsline 568
    [Credential-related source omitted]
  • Access to secretsline 592
    [Credential-related source omitted]

tests/unit/cli/tui/state/required-fields.test.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 57
    [Credential-related source omitted]
  • Access to secretsline 70
    [Credential-related source omitted]
  • Access to secretsline 78
    [Credential-related source omitted]
  • Access to secretsline 92
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 26
    const okResult: VerifyResult = {     searxng: 'ok',     searxngUrl: 'http://127.0.0.1:8888',
  • Network accessline 27
    searxng: 'ok',     searxngUrl: 'http://127.0.0.1:8888',     reranker: 'ok',
  • Network accessline 28
    searxngUrl: 'http://127.0.0.1:8888',

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 236
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 175
    [Credential-related source omitted]

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('![Image](https://example.com/img.png)');   });
  • Network accessline 79
    expect(result).toContain('![Image](https://example.com/img.png)');
  • 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 = '![Logo](https://example.com/logo.png) and ![Banner](https://example.com/banner.png)';
  • Network accessline 252
    const md = '![Logo](https://example.com/logo.png) and ![Banner](https://example.com/banner.png)';
  • 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 = '![Alt](https://example.com/img.png) [Link](https://example.com/page)';
  • Network accessline 260
    const md = '![Alt](https://example.com/img.png) [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 = '![A](https://example.com/img.png) ![B](https://example.com/img.png)';
  • Network accessline 273
    const md = '![A](https://example.com/img.png) ![B](https://example.com/img.png)';
  • 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) ![Img](https://img.com/a.png)';
  • Network accessline 292
    const md = '[Link](https://link.com) ![Img](https://img.com/a.png)';
  • 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 ![](https://example.com/deco.png) after';
  • Network accessline 302
    it('drops images with no alt text', () => {     const md = 'Before ![](https://example.com/deco.png) after';     expect(filterDecorativeImages(md)).toBe('Before  after');
  • Network accessline 303
    const md = 'Before ![](https://example.com/deco.png) after';
  • Network accessline 307
    it('keeps images with meaningful alt text', () => {     const md = '![Architecture diagram](https://example.com/diagram.png)';
  • Network accessline 308
    const md = '![Architecture diagram](https://example.com/diagram.png)';
  • Network accessline 312
    it('drops avatar/icon/logo/tracking marked urls even with alt', () => {     const md = [       '![Jane](https://cdn.example.com/avatars/jane.jpg)',
  • Network accessline 313
    const md = [       '![Jane](https://cdn.example.com/avatars/jane.jpg)',       '![Home](https://example.com/icons/home.svg)',
  • Network accessline 314
    '![Jane](https://cdn.example.com/avatars/jane.jpg)',
  • Network accessline 315
    '![Home](https://example.com/icons/home.svg)',
  • Network accessline 316
    '![Brand](https://example.com/logo.png)',
  • Network accessline 317
    '![Build](https://img.shields.io/badge/build-passing)',
  • Network accessline 318
    '![](https://pixel.track.com/1x1.gif)',
  • Network accessline 333
    it('preserves non-image markdown and text around images', () => {     const md = 'Leading text ![Real Diagram](https://example.com/real.png) trailing';
  • Network accessline 334
    const md = 'Leading text ![Real Diagram](https://example.com/real.png) 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 = '![Diag](/assets/diagram.png)';     expect(resolveRelativeUrls(md, 'https://example.com/docs/intro')).toContain(
  • Network accessline 379
    const md = '![Diag](/assets/diagram.png)';     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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 73
    [Credential-related source omitted]
  • Access to secretsline 74
    [Credential-related source omitted]
  • Access to secretsline 75
    [Credential-related source omitted]
  • Access to secretsline 77
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    describe('extractCodeSnippet', () => {   const url = 'https://example.com/post';
  • Network accessline 5
    const url = 'https://example.com/post';

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 86
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 29
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 93
    expect(hint).toContain('sudo apt install python3.12-venv');
  • Dangerous shell operationline 100
    expect(hint).toContain('sudo apt install python3-venv');

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

  • Executable scriptline 1
    Executable file
  • Network accessline 22
    const baseOutput: SearchOutput = {     results: [{ title: 'T', url: 'https://a.com', snippet: 'S', relevance_score: 0.9 }],
  • Network accessline 23
    results: [{ title: 'T', url: 'https://a.com', snippet: 'S', relevance_score: 0.9 }],

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

  • Executable scriptline 1
    Executable file
  • Network accessline 90
    it('offers no completion inside an open single quote', () => {     const [matches] = complete("fetch 'http://ex");
  • Network accessline 91
    const [matches] = complete("fetch 'http://ex");

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 = [       '![hero image with very long alt text describing the visual content of this page topic comparison chart deluxe edition](https://cdn.examp
  • Network accessline 184
    const md = [       '![hero image with very long alt text describing the visual content of this page topic comparison chart deluxe edition](https://cdn.example.com/hero.webp)',       '',
  • Network accessline 185
    '![hero image with very long alt text describing the visual content of this page topic comparison chart deluxe edition](https://cdn.example.com/hero.webp)',
  • 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   // (`![x](https://miro.medium.com/v2/resize:fill:64:64/…)`), byline links
  • Network accessline 597
    // (`![x](https://miro.medium.com/v2/resize:fill:64:64/…)`), byline links
  • Network accessline 605
    it('does NOT surface shared image/byline CHROME as cross-references', () => {     const chrome =       '[\n\n![Akhil](https://miro.medium.com/v2/resize:fill:64:64/0*bhgL.png)\n\n]' +
  • Network accessline 606
    const chrome =       '[\n\n![Akhil](https://miro.medium.com/v2/resize:fill:64:64/0*bhgL.png)\n\n]' +       '(/@sharmaakhil.work?source=post_page---byline--7b8ac89bfaae----)\n\n' +
  • Network accessline 607
    '[\n\n![Akhil](https://miro.medium.com/v2/resize:fill:64:64/0*bhgL.png)\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

  • Executable scriptline 1
    Executable file
  • Network accessline 30
    return {     title,     url: `https://example.com/${title}`,
  • Network accessline 31
    title,     url: `https://example.com/${title}`,     snippet: '',
  • Network accessline 32
    url: `https://example.com/${title}`,

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

  • Executable scriptline 1
    Executable file
  • Network accessline 58
    expect(results[0].url).toBe('https://openreview.net/forum?id=abc123');

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&lt;T&gt;(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

  • Executable scriptline 1
    Executable file
  • Network accessline 24
    {       title: 'Doc',       url: 'https://example.com/doc',
  • Network accessline 25
    title: 'Doc',       url: 'https://example.com/doc',       snippet: 'doc snippet',
  • Network accessline 26
    url: 'https://example.com/doc',

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 28
    [Credential-related source omitted]
  • Access to secretsline 34
    [Credential-related source omitted]
  • Access to secretsline 66
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 14
    return {     title,     url: `https://example.com/${title}`,
  • Network accessline 15
    title,     url: `https://example.com/${title}`,     snippet: '',
  • Network accessline 16
    url: `https://example.com/${title}`,

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 &amp; machine learning.</description>
  • Network accessline 12
    <link>https://example.com/1</link>
  • Network accessline 13
    <description>About AI &amp; 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

  • 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]

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

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 329
    // failed state must instead carry "sudo apt install python3.X-venv" so
  • Dangerous shell operationline 358
    expect(final.lastError?.message).toContain('sudo apt install python3.12-venv');

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 136
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 288
    [Credential-related source omitted]
  • Access to secretsline 293
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 118
    [Credential-related source omitted]
  • Access to secretsline 224
    [Credential-related source omitted]

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
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 compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexNativeManifest site/AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

KnockOutEZ/wigolo: #264 on hotskills, 5.5k stars

[![KnockOutEZ/wigolo on hotskills](https://hotskills.dev/badge/knockoutez-wigolo.svg)](https://hotskills.dev/skill/knockoutez-wigolo/)