from __future__ import annotations from datetime import datetime from typing import Any, Literal from pydantic import BaseModel, Field class SearchExternalReferenceResponse(BaseModel): system: str object_type: str object_id: str maturity: str connector_id: str | None = None canonical_url: str | None = None version: str | None = None etag: str | None = None observed_at: str | None = None metadata: dict[str, Any] = Field(default_factory=dict) class SearchResultResponse(BaseModel): provider_id: str module_id: str resource_type: str resource_id: str title: str summary: str | None = None url: str score: float = 0.0 highlights: list[str] = Field(default_factory=list) breadcrumbs: list[str] = Field(default_factory=list) external_reference: SearchExternalReferenceResponse | None = None metadata: dict[str, Any] = Field(default_factory=dict) source_revision: str | None = None provenance: dict[str, Any] = Field(default_factory=dict) class SearchProviderDiagnosticResponse(BaseModel): provider_id: str status: Literal["unavailable"] message: str class SearchResponse(BaseModel): query: str results: list[SearchResultResponse] diagnostics: list[SearchProviderDiagnosticResponse] = Field(default_factory=list) next_cursor: str | None = None has_more: bool = False class SearchProviderResponse(BaseModel): id: str module_id: str resource_types: list[str] order: int class SearchResourceTypeResponse(BaseModel): provider_id: str module_id: str resource_type: str label: str order: int class SearchProviderListResponse(BaseModel): providers: list[SearchProviderResponse] resources: list[SearchResourceTypeResponse] = Field(default_factory=list) class SearchIndexStateResponse(BaseModel): provider_id: str module_id: str resource_type: str index_version: int status: str checkpoint_cursor: str | None = None high_watermark: str | None = None last_change_cursor: str | None = None indexed_documents: int = 0 rejected_documents: int = 0 rebuild_started_at: datetime | None = None rebuild_completed_at: datetime | None = None last_success_at: datetime | None = None last_error: str | None = None class SearchDiagnosticsResponse(BaseModel): backend: str trigram_available: bool queue: dict[str, int] = Field(default_factory=dict) queue_oldest_age_seconds: float | None = None states: list[SearchIndexStateResponse] = Field( default_factory=list ) class SearchRebuildResponse(BaseModel): state: SearchIndexStateResponse class SearchChangeDispatchResponse(BaseModel): selected: int applied: int retrying: int quarantined: int class SearchModuleReconcileResponse(BaseModel): disabled_documents: int enabled_documents: int __all__ = [ "SearchProviderDiagnosticResponse", "SearchProviderListResponse", "SearchProviderResponse", "SearchResourceTypeResponse", "SearchChangeDispatchResponse", "SearchDiagnosticsResponse", "SearchIndexStateResponse", "SearchModuleReconcileResponse", "SearchRebuildResponse", "SearchResponse", "SearchResultResponse", ]