"""Source adapters for the federated label API. Each adapter implements `query(address, chain) -> list[Label]`. To add a new source: 1. Create a new module in this package (e.g., `my_source.py`) 2. Implement `async def query_my_source(address: str, chain: str) -> list[Label]` 3. Register it in LabelSource enum (models.py) 4. Wire it in federated.py:_query_source dispatcher All adapters follow these conventions: - Return [] on no match (not None) - Raise exceptions on infrastructure errors (handled by caller) - All addresses are normalized to lowercase before query - Each label has source=LabelSource.MY_SOURCE """