websearch: add SearXNG JSON engine as escape hatch for blocked hosts (#270)
On some machines (commonly Linux boxes and servers) DuckDuckGo and Bing reject jcode's scraped HTML requests via TLS fingerprinting / IP reputation and return an anti-bot challenge page with zero results, so `websearch` appears broken with no actionable error. Reproduced locally: curl against both DDG and Bing from this host returns anomaly/captcha pages even with a browser User-Agent. Rather than the large/risky route of swapping reqwest for a browser-impersonating TLS stack, add a reliable opt-in escape hatch: a SearXNG metasearch engine that talks to an instance's JSON API. Changes: - jcode-config-types: add `WebSearchEngine::Searxng` (parses "searxng" and "searx"), plus `websearch.searxng_url` / `searxng_url_env` (default env `JCODE_SEARXNG_URL`). - jcode-app-core/websearch: implement `search_searxng()` hitting `<base>/search?format=json`, with clear errors when no instance is configured or the instance has JSON disabled. Extract the response mapping into a pure, unit-tested `parse_searxng_results()`. Improve the empty-results message to point users at SearXNG / a Bing API key when the default engines are being blocked. - jcode-base: wire `JCODE_SEARXNG_URL` env override and document the engine + the TLS-blocking caveat in the generated default config. Tests: JSON parsing (empty-url filtering, title fallback, snippet), result-limit capping, and engine alias parsing.
J
jeremy committed
423f4087f44ba5efc8dcda3377050b1b2dac3bab
Parent: e4e4a5c