feat: add maintenance system with index reconciliation

Complete maintenance subsystem for index health and cleanup:

Endpoints:
- GET /maintenance/health - lightweight (or detailed) health check
- POST /maintenance/cleanup/all - full orphan cleanup
- POST /maintenance/cleanup/vectors - purge orphan vector chunks
- POST /maintenance/cleanup/graph - purge orphan graph nodes
- POST /maintenance/reconcile-index - cleanup + reindex missing pages

Bidirectional orphan detection:
- find_documents_without_vectors() in GraphService
- find_chunks_without_graph_nodes() in VectorService

Redis integration:
- Tracks last_cleanup timestamp for scheduler visibility

Config additions:
- Document store, volatile cache, and maintenance settings
- VectorServiceDep and GraphServiceDep type aliases

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-24 16:22:39 +01:00
co-authored by Claude Opus 4.5
parent 0e6c3619eb
commit f756ca9490
7 changed files with 1851 additions and 6 deletions
+11 -3
View File
@@ -76,13 +76,12 @@ def get_wikijs_client() -> WikiJSClient:
Get Wiki.js client singleton.
Returns:
Initialized Wiki.js GraphQL client with username/password auth
Initialized Wiki.js GraphQL client with API token auth
"""
settings = get_settings()
client = WikiJSClient(
base_url=settings.wikijs_url,
username=settings.wikijs_username,
password=settings.wikijs_password
api_token=settings.wiki_graphql_api
)
logger.debug("Created Wiki.js client instance")
return client
@@ -425,3 +424,12 @@ async def verify_api_key(
detail="Invalid API key"
)
return credentials.credentials
# Service type aliases for FastAPI endpoint dependencies
# These are defined after the factory functions
from src.services.vector_service import VectorService
from src.services.graph_service import GraphService
VectorServiceDep = Annotated[VectorService, Depends(get_vector_service)]
GraphServiceDep = Annotated[GraphService, Depends(get_graph_service)]