from __future__ import annotations from typing import Protocol from .models import Change, IngestionBatch, SyncCursor class Connector(Protocol): name: str def full(self, tenant_id: str) -> IngestionBatch: ... def incremental(self, tenant_id: str, cursor: SyncCursor | None) -> IngestionBatch: ... def changes_from_webhook(self, payload: dict) -> list[Change]: ... class HTTPClient(Protocol): def get(self, url: str, *, headers: dict[str, str], params: dict | None = None): ... class SecretProvider(Protocol): def get(self, ref: str) -> str: ... class CursorStore(Protocol): def load(self, tenant_id: str, connector: str) -> SyncCursor | None: ... def save(self, cursor: SyncCursor) -> None: ... class KnowledgeStore(Protocol): def upsert(self, documents: list) -> None: ... def delete(self, document_ids: list[str], tenant_id: str) -> None: ...