"""Knowledge domain: sources, documents, chunks and retrieval policy. Retrieval is permission-aware: an employee only sees knowledge scoped to its organization (and optionally its project). """ from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime from enum import StrEnum from app.domain.base import new_id, utcnow class SourceKind(StrEnum): FILE = "file" TEXT = "text" URL = "url" REPO = "repo" class EmbeddingJobStatus(StrEnum): PENDING = "pending" RUNNING = "running" DONE = "done" FAILED = "failed" @dataclass(slots=True, kw_only=True) class KnowledgeSource: organization_id: str name: str kind: SourceKind = SourceKind.TEXT uri: str = "" project_id: str | None = None id: str = field(default_factory=new_id) created_at: datetime = field(default_factory=utcnow) @dataclass(slots=True, kw_only=True) class Document: source_id: str title: str content: str = "" id: str = field(default_factory=new_id) created_at: datetime = field(default_factory=utcnow) @dataclass(slots=True, kw_only=True) class DocumentChunk: document_id: str index: int content: str embedding_json: list[float] = field(default_factory=list) id: str = field(default_factory=new_id) @dataclass(slots=True, kw_only=True) class EmbeddingJob: source_id: str status: EmbeddingJobStatus = EmbeddingJobStatus.PENDING error: str | None = None id: str = field(default_factory=new_id) created_at: datetime = field(default_factory=utcnow) @dataclass(slots=True, kw_only=True) class RetrievalPolicy: organization_id: str name: str scope_json: dict = field(default_factory=dict) id: str = field(default_factory=new_id) created_at: datetime = field(default_factory=utcnow)