"""Provider registry (v3). get_provider(id) returns a Provider instance for the daemon to poll. Anthropic is real; OpenAI and z.ai return a StubProvider until M2/M3 land, so selecting them never crashes the loop. """ from __future__ import annotations from .base import Provider, ProviderStatus, StubProvider from .anthropic import AnthropicProvider from .openai_codex import OpenAICodexProvider from .zai import ZaiProvider def get_provider(pid: str) -> Provider: if pid == "anthropic": return AnthropicProvider() if pid == "openai": return OpenAICodexProvider() if pid == "zai": return ZaiProvider() # Unknown id (a config from a newer version, say) — a safe placeholder. return StubProvider(pid, label=pid, accent="d97757") __all__ = [ "Provider", "ProviderStatus", "StubProvider", "AnthropicProvider", "OpenAICodexProvider", "ZaiProvider", "get_provider", ]