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>
4.6 KiB
Avis d'attribution
Loki est un fork de AJEAN, créé par nathaninline et publié sous licence MIT. L'essentiel du code de ce dépôt — moteur d'assistant IA en Go, interface web embarquée, mémoire persistante, accès internet, outils MCP, accès distant chiffré — est l'œuvre du projet AJEAN. Merci à son auteur.
La licence d'origine est conservée à l'identique dans LICENSE.
Modifications apportées par le fork
- Renommage AJEAN → Loki (binaire
loki,LOKI_HOME,/etc/loki, unitsloki-engine/loki-ui). - Conteneurisation : image Docker autonome (llama.cpp compilé CUDA +
binaire Go),
docker-composeet variante Unraid, publication GHCR. - Supervision sans systemd (
sys_service_container.go) : en conteneur, le moteur est piloté par fichier PID au lieu de systemctl — indispensable pour que l'UI puisse redémarrer le moteur (changement de modèle). loki config get/set: lecture/écriture non interactive de la configuration, utilisée par l'entrypoint Docker.- Mode code (
internal/loki/code_*.go,lsp.go,agents/) : agent de code avec critères d'acceptation, passe de vérification indépendante, outils read/grep/glob, politique d'exécution, diagnostics LSP, outils git, jobs d'arrière-plan et relance sur appel d'outil textuel. La conception (contrat builder/verifier, tracker « lu avant d'écrire », auto-retry patterns, table languages.json) est reprise d'OpenFox (MIT) et réécrite en Go pour ce fork ; les prompts de rôles sont des réécritures originales. S'y ajoutent depuis d'autres idées reprises d'OpenFox et réimplémentées ici : les sous-agents (code_subagent.go— un rôle délégué qui travaille dans son propre contexte), la vérification déclenchée quand le builder a fini (statutcompleted, relance sur critères ouverts), le pré-vol qui refuse une écriture dès son chemin (tool_schema_order.go), la réparation des noms d'outils hallucinés (code_alias.go), les consignes du dépôt AGENTS.md / CLAUDE.md (code_instructions.go), l'hygiène du terminal (chat_shell_hygiene.go) et un compactage qui garde l'état du mode Code.
Reprises depuis l'amont après le fork
Le fork continue de suivre AJEAN et y reprend des fonctionnalités, adaptées au
conteneur : le contrôle du navigateur (computer_use.go, computer_cdp.go,
browser_grid.go — pilotage d'un Chromium en CDP, ici celui de Playwright déjà
présent dans l'image) et la préparation des images envoyées au modèle
(web_upload_orient.go — orientation EXIF et redimensionnement), les
notifications Web Push (push.go, web_push.go), les tâches script et
le dossier de scripts (chat_scripts.go, tasks_script.go, tasks_tools.go),
et le chiffrement de la mémoire (mem_crypto.go, mem_vault.go,
mem_store.go, mem_io.go, mem_migrate.go, mem_snapshots.go,
backup_bundle.go). La sauvegarde vers le relais (relay_backup.go) n'est
pas reprise : elle vise ajean.link, le service de l'auteur amont. Loki
expose à la place un export/import de paquet chiffré en fichier local.
La recherche plein-texte des discussions (chat_search.go) reprend celle
de l'historique d'AJEAN (commit 558d3b4d, issue amont #98, PR #99 d'Olioli4) :
index inversé chiffré comme les discussions, tokens repliés sans accents,
correspondance par début de mot, titre compté double. Adaptée au modèle de
Loki (toutes les discussions dans bkChat, index tenu à chaque écriture, y
compris celles de la façade Rust) et à sa barre latérale (« rechercher
partout », extrait autour du passage trouvé).
Moteur Strata
Le second moteur de Loki (internal/loki/backend_strata.go) est
Strata (MIT), spécialisé dans
Qwen3.8-Flash-Next. Son intégration est reprise d'AJEAN (« AJEAN MoE 1.1 »,
backend_moe.go) : Loki télécharge le paquet figé publié par AJEAN sur sa
release moe-v1.1 (sources de Strata et binaire Linux CUDA 12 compilé, avec
les modifications d'AJEAN), vérifié par SHA-256 avec les empreintes publiées
par AJEAN. La reprise automatique d'une installation 1.0 (strataMigrate) est
reprise d'AJEAN (moeMigrate). Ni Strata ni le modèle ne sont inclus dans
l'image : ils sont téléchargés à la demande.
Services externes
Le tunnel d'accès distant continue de pointer vers ajean.link, le relais opéré par l'auteur d'AJEAN ; le catalogue de modèles intégré est également servi par ajean.link. Ces services appartiennent au projet amont.