0a9d42ce40
Plugin-registered web providers (registered via agent.web_search_registry) were invisible to the tool-availability gate: _is_backend_available() was a hardcoded env-var if-chain that returned False for any name outside the eight built-in backends. Because check_web_api_key() is the check_fn for both web_search and web_extract, a working custom provider with no built-in creds left both tools filtered out of the toolset entirely. Fix at the single chokepoint: _is_backend_available() now delegates non-legacy backend names to the registered provider's is_available(), falling back to the legacy built-in probes for known names and unregistered providers. Because _get_backend(), _get_capability_backend(), and check_web_api_key() all resolve availability through this one function, the fix cascades to every caller — including the per-capability extract selection that produced a dead-end 'search-only' error (#32698). The two remaining hardcoded whitelist early-returns (_get_backend, check_web_api_key) now also accept registered names, and both walk registered providers as a final fallback so a custom backend still resolves when no built-in has credentials. Built-in backend priority is preserved unchanged: the registry is consulted only for names outside _LEGACY_WEB_BACKENDS. Fixes #28651 Fixes #31873 Fixes #32698