feat: implement durable permission-aware search

This commit is contained in:
2026-07-29 18:08:52 +02:00
parent c60ca2776e
commit a156e3d4fc
12 changed files with 2540 additions and 100 deletions
+53
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Any, Literal
from pydantic import BaseModel, Field
@@ -31,6 +32,8 @@ class SearchResultResponse(BaseModel):
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):
@@ -43,6 +46,8 @@ 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):
@@ -56,10 +61,58 @@ class SearchProviderListResponse(BaseModel):
providers: list[SearchProviderResponse]
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",
"SearchChangeDispatchResponse",
"SearchDiagnosticsResponse",
"SearchIndexStateResponse",
"SearchModuleReconcileResponse",
"SearchRebuildResponse",
"SearchResponse",
"SearchResultResponse",
]