feat(rag): écran admin d'ingestion du corpus (provider /rag + réindexation live)
Gestion du corpus RAG depuis l'app admin, sans adb.
Patient :
- RagDb v2 : table rag_docs (documents BRUTS, source de vérité) séparée des
embeddings rag_chunks ; onUpgrade ajoute la table.
- Rag : ingest enregistre le doc brut ; reingestMissing() (ré)indexe les docs
sans embeddings ; listDocs/deleteDoc.
- ContentProvider /rag : query liste (source+char+chunk_count), /rag/<src> texte
pour édition, insert (upsert doc + invalide chunks + broadcast), delete /rag/<src>.
Broadcast RELOAD_RAG EXPLICITE (setPackage) — l'implicite n'est pas délivré au
receiver NOT_EXPORTED sur Android récent.
- KazeiaService : receiver RAG_RELOAD -> reingestMissing live ; au démarrage,
embarque les docs ajoutés hors-ligne.
Admin : KazeiaRagClient + RagRepository + RagScreen (Compose : liste, badge
"à indexer", ajout/édition/suppression). Remplace le StubScreen du slot Rag.
Validé device E2E : admin insert 'colere' -> RELOAD -> embeddé live (chunk_count 1,
sans restart) -> tour patient "fou de rage" récupère [Source: colere] (top 0.83)
-> réponse ancrée. App admin se lance sans crash.
Au passage : .gitignore exclut kazeia-android/*/build/ et dé-suit app-admin/build/
(1017 artefacts qui étaient trackés par erreur).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>