"""Unified adapter contract for Bridge V1.2. Every adapter must expose: execute(prompt: str) -> AdapterResult AdapterResult fields: response - string output on success, None on error error - error message on failure, None on success exit_code - 0 = success, non-zero = failure mode - "real" or "stub" metadata - adapter-specific extra data (e.g. agent_run_id) """ from __future__ import annotations from dataclasses import dataclass, field from typing import Any, Optional @dataclass class AdapterResult: response: Optional[str] error: Optional[str] exit_code: int mode: str # "real" | "stub" metadata: dict[str, Any] = field(default_factory=dict) @property def ok(self) -> bool: return self.exit_code == 0 and self.error is None