Version 0.14.0

Rattrapage d'AJEAN jusqu'à la 0.17.6 (contexte, reprise réseau, presets
externes, tâches ponctuelles, file d'attente) et reprises d'OpenFox pour le
mode Code (vérification quand le builder a fini, pré-vol des écritures,
relance des appels textuels, alias d'outils, consignes du dépôt, terminal).
Les 19 commits locaux de la synchro 0.13.6 → 0.16.3, restés hors de main,
y sont rejoués.

Bump des trois porteurs de version (constante Go, versioninfo.json, .syso
Windows régénérés), notes de release réécrites, NOTICE à jour des idées
reprises d'OpenFox.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-02 23:41:37 +02:00
1 parent b955181bb9
commit cf8d1cfaaa
6 files changed
+85 -86

No files matched your search

+9 -4
View File
@@ -27,10 +27,15 @@ La licence d'origine est conservée à l'identique dans [`LICENSE`](LICENSE).
patterns, table languages.json) est reprise patterns, table languages.json) est reprise
d'**[OpenFox](https://github.com/co-l/openfox)** (MIT) et réécrite en Go d'**[OpenFox](https://github.com/co-l/openfox)** (MIT) et réécrite en Go
pour ce fork ; les prompts de rôles sont des réécritures originales. S'y pour ce fork ; les prompts de rôles sont des réécritures originales. S'y
ajoutent depuis deux idées reprises d'OpenFox et réimplémentées ici : les ajoutent depuis d'autres idées reprises d'OpenFox et réimplémentées ici :
**sous-agents** (`code_subagent.go` — un rôle délégué qui travaille dans son les **sous-agents** (`code_subagent.go` — un rôle délégué qui travaille dans
propre contexte) et le **fenêtrage du fil** au chargement d'une longue son propre contexte), la **vérification déclenchée quand le builder a
discussion. fini** (statut `completed`, 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 ## Reprises depuis l'amont après le fork
+72 -78
View File
@@ -1,96 +1,90 @@
# Loki 0.13.0 # Loki 0.14.0
Loki rattrape deux versions majeures d'AJEAN (0.14 → 0.15.4) et reprend deux Loki rattrape AJEAN jusqu'à la 0.17.6 et reprend une série d'idées d'OpenFox
idées d'OpenFox. L'IA peut piloter un navigateur, la mémoire se chiffre sur le pour le mode Code. Le gros du travail est invisible : des discussions qui ne se
disque, et le serveur sait te prévenir quand c'est prêt. bloquent plus sur un contexte plein, des réponses qui survivent à une coupure
réseau, un agent de code qui gaspille moins de tours.
## L'IA pilote un navigateur ## Le contexte ne bloque plus la discussion
Un interrupteur dans *Réglages → Contrôle du navigateur* et l'IA ouvre des pages Sur une fenêtre de 65k, un tour qui lisait plusieurs gros fichiers d'un coup
dans le Chromium déjà embarqué dans l'image. Elle en reçoit les éléments passait de 60 % à plus de 130 % sans jamais compacter, et le moteur répondait
interactifs **numérotés** (`[12] bouton « Se connecter »`) et agit par numéro : par un 400 qui figeait la discussion.
`browser_open`, `browser_find`, `browser_click`, `browser_type`, `browser_key`,
`browser_scroll`. **Aucune vision requise** — ça marche avec un petit modèle
texte. Avec un projecteur `mmproj` chargé s'ajoutent `browser_screenshot`
(capture quadrillée tous les 100 px) et `browser_click_xy`, pour ce que l'arbre
d'accessibilité ne montre pas : canvas, bandeau cookies en iframe.
Ce sont des actions réelles sur le web : l'interrupteur est distinct de l'accès - Le compactage en cours de tour compte aussi les résultats d'outils que le
internet et n'agit qu'en **mode agent**, au même niveau de confiance que `bash`. moteur n'a pas encore vus.
En CLI : `loki computer [on|off|status]`. - Tout résultat d'outil est borné à 30 000 caractères **pour le modèle** ;
l'interface garde le résultat complet (« voir plus »).
- En dernier recours, les gros résultats sont tronqués puis les plus vieux
échanges retirés, au lieu de laisser remonter l'erreur.
- Le compactage ne fait plus répondre deux fois à une vieille question, et le
texte écrit avant un appel d'outil n'est plus rangé en double.
## La mémoire se chiffre ## Presets : API compatible OpenAI
*Réglages → Mémoire → chiffrer la mémoire sur le disque* : pages mémoire, Les presets d'API externe gagnent ce qui leur manquait :
discussions, blocs archivés au compactage et trackers passent en **AES-256-GCM**
sous `/data`. La clé de données est enfermée dans un coffre par une clé dérivée
en **Argon2id** ; ce qui l'ouvre, c'est la **clé de pilotage de cet appareil**
(le serveur n'en garde qu'une empreinte — il ne peut pas ouvrir le coffre seul)
ou une **clé de récupération** affichée une seule fois à l'activation.
La clé ne vit qu'en RAM : après un redémarrage à froid, la mémoire reste - une case **« le modèle accepte les images »** pour un modèle distant
verrouillée jusqu'à ce qu'un navigateur se reconnecte. Verrouillé, Loki n'écrase multimodal ;
jamais du chiffré par du clair — il refuse d'écrire. Un **snapshot** est pris - plus de `chat_template_kwargs` (propre à llama.cpp) envoyé à l'API : une API
avant chaque bascule, une migration interrompue reprend au démarrage, et rien stricte répondait 400 et **chaque compactage échouait** ;
n'est supprimé avant que son remplaçant ait été relu et vérifié. - **reprise automatique** quand le flux se coupe en pleine réponse (Wi-Fi, VPN,
proxy) : jusqu'à 5 fois, le modèle reprend là où il s'était arrêté ;
- un 401, 429 ou 502 n'est plus pris pour un appel d'outil mal formé ;
- le débit est mesuré même quand l'API ne le donne pas ; le benchmark refuse de
mesurer un moteur local qui n'est pas celui du preset ; le badge des réponses
porte le nom du modèle distant.
**Sauvegarde chiffrée** : *exporter* télécharge un paquet scellé (mémoire, ## Mode Code
presets, réglages) que *importer* rejoue sur un autre serveur avec la seule clé —
de quoi remonter le conteneur ailleurs. Le fichier reste chez toi : aucun envoi
vers un service tiers.
## Notifications, même app fermée - **La vérification attend que le builder ait fini.** Il marque chaque critère
`completed` une fois fait ; tant qu'il en reste d'ouverts, il est relancé au
lieu de payer une passe de vérification sur un travail inachevé. Plus aucune
vérification ne part quand il vient de poser une question.
- **Écriture refusée dès son chemin** : un `write` sur un fichier jamais lu
était refusé après tout le fichier généré. Le chemin passe maintenant en
premier et le refus coupe la génération aussitôt.
- **Appel d'outil écrit en texte** (`<tool_call>`, format XML de Qwen3-Coder) :
repéré pendant le flux, coupé, et la relance cite l'extrait fautif.
- `read_file`, `str_replace`, `old_string`… appris d'autres agents sont
traduits vers les vrais outils.
- Les consignes du dépôt (**AGENTS.md**, CLAUDE.md) font partie du contexte.
- Terminal : `cmd | tail -N` rend le **vrai** code de sortie, la sortie déjà
produite est gardée au délai dépassé, les couleurs ANSI sont retirées.
- `git_status` / `git_diff` trouvent le dépôt cloné dans un sous-dossier.
- Le compactage garde les fichiers touchés, les erreurs résolues et l'état des
critères.
Le serveur pousse une notification à la fin d'une réponse **et à la fin d'une ## Tâches et chat
tâche planifiée**, succès comme échec — c'est le cas qui compte, personne ne
regarde. Interrupteur dans *Réglages → Mode agent*, à armer sur chaque appareil.
Demande HTTPS (ou localhost) ; sur iPhone, ajoute d'abord Loki à l'écran
d'accueil.
## Tâches : des scripts qui tournent sans modèle - **« Rappelle-moi dans 20 minutes »** : `task_create` accepte `in_minutes` ou
`at`, à l'heure du navigateur (le conteneur tourne en UTC).
- **Écrire pendant que l'IA répond** : le message part en file et le modèle en
tient compte dans la suite de sa réponse ; deux appareils qui envoient en
même temps ne se refusent plus.
- Longues discussions : au chargement, les 20 derniers échanges, le début d'un
clic ; la liste des discussions se dessine par pages et montre la nouvelle
dès le premier message.
- Mémoire : un mode par projet, et un quatrième, « recherche ».
- Appels d'outils parallèles séparés selon leur index ; bascule de preset par
identifiant ; un raisonnement qui reprend après la réponse a sa propre bulle.
Un nouveau dossier `/data/scripts`, **hors du workspace jetable** : supprimer une ## Sécurité et données
discussion n'y touche pas. Une tâche peut désormais être un **script seul** — le
planificateur le lance sans charger le modèle ni consommer un jeton. Une
sauvegarde, une synchro, un nettoyage n'ont rien à demander à un LLM.
L'IA dispose aussi de `task_create`, `task_list`, `task_update` et `task_delete` : - **Un site tiers ne peut plus piloter Loki** depuis le navigateur (Origin /
elle se pose ses propres rappels et veilles, cloisonnés par projet. Sec-Fetch-Site, DNS rebinding). ⚠️ Derrière un reverse proxy par nom de
domaine, définis une clé de pilotage ou `LOKI_TRUSTED_HOSTS` **avant** la mise
à jour, et vérifie que le proxy transmet l'en-tête `Host` d'origine.
- **Chiffrement de la mémoire** : l'activer rendait illisibles la discussion
active et le mode Code. Corrigé ; une base déjà touchée est réparée au
déverrouillage. Les résultats d'outils (« voir plus ») et les images du fil
sont désormais chiffrés eux aussi, et les images effacées après 24 h.
## Mode code : des sous-agents ## Moteur
L'outil `subagent` délègue une recherche (`explorer`), une relecture - `--mlock` seul ne coupe plus le mmap (OOM au chargement).
(`code-reviewer`) ou un découpage (`planner`) à un rôle qui travaille dans **son - Port déjà occupé refusé avec un message clair ; cache KV lent signalé.
propre contexte** et ne rend que sa réponse. Sur un modèle local, c'est la - Réponses web compressées en gzip.
fenêtre de contexte qu'on sauve : « trouve où est géré le cache » coûte dix
lectures de fichiers, qui restaient sinon dans l'historique alors que seule la
réponse comptait. Tous les rôles délégués sont en lecture seule.
Le builder ne publie plus de lui-même : sans demande explicite, ni commit, ni
push, ni redémarrage de service.
## Interface
- **Anglais** (*Apparence → Langue*) : la coque — navigation, intitulés,
boutons — passe en anglais. Ce qui n'est pas encore traduit reste en français
plutôt que d'afficher une clé technique, et le fil de discussion n'est jamais
touché.
- **Résultats d'outils** : le flux ne transporte plus qu'un aperçu ; « voir
plus » charge le reste à la demande et déplie vraiment le bloc. Le compteur
« ~N tok » dit enfin la taille réelle, pas celle de l'aperçu.
- **Longues discussions** : à l'ouverture, seule la fin du fil est rejouée. Un
bandeau dit combien d'événements sont masqués et charge le début d'un clic.
- **Images** : l'orientation EXIF est cuite dans les pixels (fini les photos de
téléphone couchées pour le modèle) et le grand côté ramené sous 1568 px.
## Corrections
- Un outil qui porte une image dans un message séparé (`see_image`,
`browser_screenshot`) renvoyait « [déjà fait] » **sans** l'image et le modèle
bouclait. Relancer la même commande `bash` est de nouveau permis.
- **MCP** ne tronque plus sa réponse à 12000 caractères avant le modèle.
- Le dossier mémoire n'est plus joignable qu'aux outils `mem_*` : un `cat
memory/…` contournait l'index `MEMORY.md`.
## Mise à jour ## Mise à jour
Binary file not shown.
Binary file not shown.
+3 -3
View File
@@ -2,13 +2,13 @@
"FixedFileInfo": { "FixedFileInfo": {
"FileVersion": { "FileVersion": {
"Major": 0, "Major": 0,
"Minor": 13, "Minor": 14,
"Patch": 0, "Patch": 0,
"Build": 0 "Build": 0
}, },
"ProductVersion": { "ProductVersion": {
"Major": 0, "Major": 0,
"Minor": 13, "Minor": 14,
"Patch": 0, "Patch": 0,
"Build": 0 "Build": 0
}, },
@@ -25,7 +25,7 @@
"LegalCopyright": "Copyright (c) 2026 Loki contributors. MIT License.", "LegalCopyright": "Copyright (c) 2026 Loki contributors. MIT License.",
"OriginalFilename": "loki.exe", "OriginalFilename": "loki.exe",
"ProductName": "Loki", "ProductName": "Loki",
"ProductVersion": "0.13.0", "ProductVersion": "0.14.0",
"Comments": "https://github.com/R0m1k3/Loki — projet open source (MIT)" "Comments": "https://github.com/R0m1k3/Loki — projet open source (MIT)"
}, },
"VarFileInfo": { "VarFileInfo": {
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"strings" "strings"
) )
const Version = "0.13.0" const Version = "0.14.0"
// Main est le vrai main() du binaire (cmd/loki ne fait que l'appeler). // Main est le vrai main() du binaire (cmd/loki ne fait que l'appeler).
func Main() { func Main() {