from __future__ import annotations from urllib.parse import quote import httpx from app.config import settings class ManifestClient: def fetch_manifest(self, app_id: str, version: str) -> dict: app_id_part = quote(app_id, safe="") version_part = quote(version, safe="") url = f"{settings.robot_package_base_url}/api/apps/{app_id_part}/versions/{version_part}/manifest" response = httpx.get(url, follow_redirects=True, timeout=30) response.raise_for_status() return response.json()