from typing import Any from models.bot import BotInstance from providers.registry import ProviderRegistry from providers.provision.base import ProvisionProvider from providers.runtime.base import RuntimeProvider from providers.target import resolve_provider_target from providers.workspace.base import WorkspaceProvider def _require_provider(value: Any, label: str): if value is None: raise RuntimeError(f"{label} is not configured") return value def _get_registry(app_state: Any) -> ProviderRegistry | None: registry = getattr(app_state, "provider_registry", None) if registry is None: return None if not isinstance(registry, ProviderRegistry): raise RuntimeError("provider registry is misconfigured") return registry def get_runtime_provider(app_state: Any, bot: BotInstance) -> RuntimeProvider: registry = _get_registry(app_state) if registry is not None: target = resolve_provider_target(app_state, bot) bundle_key = registry.resolve_bundle_key(target) provider = registry.runtime.get(bundle_key) if bundle_key else None if provider is not None: return provider raise RuntimeError(f"runtime provider is not configured for target {target.key}") return _require_provider(getattr(app_state, "runtime_provider", None), "runtime provider") def get_workspace_provider(app_state: Any, bot: BotInstance) -> WorkspaceProvider: registry = _get_registry(app_state) if registry is not None: target = resolve_provider_target(app_state, bot) bundle_key = registry.resolve_bundle_key(target) provider = registry.workspace.get(bundle_key) if bundle_key else None if provider is not None: return provider raise RuntimeError(f"workspace provider is not configured for target {target.key}") return _require_provider(getattr(app_state, "workspace_provider", None), "workspace provider") def get_provision_provider(app_state: Any, bot: BotInstance) -> ProvisionProvider: registry = _get_registry(app_state) if registry is not None: target = resolve_provider_target(app_state, bot) bundle_key = registry.resolve_bundle_key(target) provider = registry.provision.get(bundle_key) if bundle_key else None if provider is not None: return provider raise RuntimeError(f"provision provider is not configured for target {target.key}") return _require_provider(getattr(app_state, "provision_provider", None), "provision provider")