from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Any def utc_now() -> datetime: return datetime.now(timezone.utc) @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) fetched_at: datetime = field(default_factory=utc_now) @dataclass(frozen=True) class IngestionResult: document: SourceDocument accepted: bool status: str reason: str | None = None published_url: str | None = None