from dataclasses import dataclass, field from typing import Any @dataclass(frozen=True) class ACL: tenant_id: str = "" principals: tuple[str, ...] = () groups: tuple[str, ...] = () visibility: str = "restricted" public: bool = False @dataclass(frozen=True) class Provenance: source_type: str source_id: str canonical_url: str revision: str | None = None retrieved_at: str | None = None webhook_event_id: str | None = None connector_version: str = "1.0" @dataclass(frozen=True) class Document: id: str tenant_id: str title: str content: str mime_type: str content_hash: str modified_at: str | None provenance: Provenance acl: ACL metadata: dict[str, Any] = field(default_factory=dict) deleted: bool = False @dataclass(frozen=True) class NormalizedDocument: document_id: str tenant_id: str title: str body: str mime_type: str source_path: str content_hash: str updated_at: Any acl: ACL provenance: dict[str, Any] metadata: dict[str, Any] = field(default_factory=dict) deleted: bool = False @dataclass(frozen=True) class ConnectorConfig: connector_id: str tenant_id: str secret_ref: str scope: dict[str, Any] options: dict[str, Any] = field(default_factory=dict) @dataclass(frozen=True) class SyncCursor: connector_id: str mode: str revision: str | None = None delta_token: str | None = None updated_at: str | None = None @dataclass(frozen=True) class Change: item_id: str kind: str revision: str | None = None event_id: str | None = None payload: dict[str, Any] = field(default_factory=dict) @dataclass(frozen=True) class IngestionRequest: source: str locator: str requested_by: str = "system" metadata: dict[str, Any] = field(default_factory=dict) @dataclass(frozen=True) class SourceDocument: identifier: str title: str body: str source: str url: str | None = None metadata: dict[str, Any] = field(default_factory=dict) @dataclass(frozen=True) class IngestionResult: document: Document | SourceDocument | None accepted: bool status: str reason: str | None = None published_url: str | None = None