# Single Provider interface with optional search/fetch, not split interfaces

Search and fetch are kept on a single `Provider` interface with optional `search()` and `fetch()` methods, gated by `capabilities` flags. A provider implements whichever methods it supports and declares them in its `capabilities` struct. Built-in Tavily/AnySearch implement both; built-in Jina and local Firecrawl implement only fetch; local Exa and iFlow implement both; local Serper, DeepSeek, and Gemini implement search.

A split into separate `SearchProvider` and `FetchProvider` interfaces (with two registries, two factories, two config sections) was considered and rejected. The split would let pure-fetch services like Jina and Firecrawl join cleanly, but the same outcome is achievable by making `search()` and `fetch()` optional on one interface and relying on the existing `capabilities` flags — which were already present but underused. The single-interface form avoids doubling the registration/factory/config surface while still admitting fetch-only providers, and keeps the "add a new provider = edit one file" property intact.
