"""BaseIntrospector — contract for source-specific schema readers. Subclasses produce a Source object with raw schema (names, types, sample values, stats). The planner consumes this directly — descriptions are not LLM-generated. """ from abc import ABC, abstractmethod from ..models import Source class BaseIntrospector(ABC): """Abstract base. Subclasses: DatabaseIntrospector, TabularIntrospector.""" @abstractmethod async def introspect(self, location_ref: str) -> Source: ...