Discussions : la recherche trouve aussi les mots du texte, pas seulement les titres (index plein-texte chiffré, repris d'AJEAN 558d3b4d, #98)

Index inversé dans le bucket chatsearch (chat_search.go) : une fiche
légère par discussion (« d| » : version, date d'indexation, aperçu), sa
liste de mots (« t| ») et, par mot, la liste des discussions (« p| »).
Mots repliés sans accents, correspondance par début de mot, titre compté
double, comme chez l'amont. Chiffré quand la mémoire l'est
(encryptedBuckets) ; verrouillée, la recherche le dit (state=locked).

Adapté au modèle de Loki : toutes les discussions vivent dans
bkChat/conv:<id>. L'index suit chaque écriture de l'écrivain différé
(chat_persist.go, avant que le lot soit marqué traité : une suppression
passe toujours après) et ne touche que les mots ajoutés ou retirés. Il
suit aussi les écritures de la façade Rust, qui passent par
/internal/v1/store : le Go reste le seul à tenir l'index, la route
/api/conversations/search est servie ici et relayée par la façade comme
toute route qu'elle ne connaît pas (test de garde des deux côtés). Pas de
second écrivain, donc pas de test de parité à tenir.

Rattrapage en fond au démarrage, au déverrouillage et quand une recherche
trouve l'index incomplet : discussions absentes ou plus anciennes que leur
dernière écriture. La discussion ouverte est cherchée dans son journal en
RAM quand ce process la tient. L'extrait est pris autour du mot trouvé,
relu dans le corps des seuls résultats de la page.

Tests repris d'AJEAN (chat_search_test.go), adaptés, plus les écritures
de la façade, l'extrait en contexte, la mise à jour incrémentale et
l'index périmé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-19 11:23:18 +02:00
1 parent 6a45f19831
commit e9c0555ab7
12 files changed
+1623 -3

No files matched your search

+6
View File
@@ -163,6 +163,9 @@ func newWebMux() *http.ServeMux {
// orphelin arrêté, moteur relancé s'il tournait avant (backend_tune_lock.go)
// — au démarrage, puis toutes les 30 s (un stat sans verrou).
go tuneRecoverWatch(time.NewTicker(tuneRecoverEvery).C)
// Index plein-texte des discussions : rattrape celles d'avant la
// fonctionnalité (ou dont l'indexation a échoué), en tâche de fond.
startHistSearchBackfill()
mux := http.NewServeMux()
// Pages publiques : le HTML et le JS ne contiennent aucun secret. Toute la
// donnée et toutes les actions passent par /api/* qui, lui, exige la clé.
@@ -399,6 +402,9 @@ func newWebMux() *http.ServeMux {
api("/api/conversations/switch", handleConvSwitch)
api("/api/conversations/rename", handleConvRename)
api("/api/conversations/delete", handleConvDelete)
// Recherche plein-texte (chat_search.go) : servie ici même quand la façade
// tient la conversation — l'index est tenu par ce process.
api("/api/conversations/search", handleConvSearch)
api("/api/chat/mode", handleChatMode) // GET mode+critères / POST bascule Chat|Code
api("/api/chat/criteria", handleChatCriteria) // édition manuelle des critères (mode code)
api("/api/chat/compact", handleChatCompact) // compaction manuelle du contexte