mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Les fichiers du chat vivaient dans un pot commun : on changeait de discussion et on revoyait les mêmes pièces jointes, et supprimer une discussion laissait derrière elle tout ce qu'on y avait déposé ou fait écrire à l'agent (seules ses captures, déjà rangées par identifiant, partaient avec). Chaque discussion a désormais son dossier, <workspace>/discussions/<id>/ : - les dépôts (uploads/), les captures (captures/) et ce que l'agent écrit y atterrissent ; le shell et les chemins relatifs du modèle y sont résolus ; - le panneau Fichiers s'ouvre sur ce dossier et n'en sort pas, et se redessine quand la discussion change (bascule ou vidage, signalés par le flux SSE) ; - supprimer une discussion — ou la vider — emporte ses fichiers. Les deux gestes le disent maintenant avant de demander confirmation ; « clear chat » en demandait aucune. La racine du dossier de travail reste la borne de sécurité : les liens des anciens messages (uploads/x.pdf, captures/<id>/y.jpg) continuent d'ouvrir leur fichier par un chemin de repli. Au démarrage, une migration range les captures dans le dossier de leur discussion et rend chaque dépôt à la discussion qui le mentionne dans son journal ; ce que personne ne réclame reste à la racine, atteignable par le bouton « hors discussion » du panneau, qui disparaît une fois le ménage fait. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LPyFxVHNAN9u5pVzSYMwjd
42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package loki
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Un chemin relatif du modèle doit atterrir dans le dossier de la DISCUSSION
|
|
// ouverte, jamais dans le répertoire courant du processus (Bureau,
|
|
// C:\ProgramData\loki\bin…) ni dans un dossier commun à toutes les discussions.
|
|
func TestResolveAgentPathRelative(t *testing.T) {
|
|
ws := withWorkspace(t)
|
|
got := resolveAgentPath("meteo.json")
|
|
want := filepath.Join(ws, "meteo.json")
|
|
if got != want {
|
|
t.Fatalf("resolveAgentPath = %q, attendu %q", got, want)
|
|
}
|
|
if !strings.Contains(got, convFilesRoot) {
|
|
t.Fatalf("le fichier n'est pas rangé par discussion : %q", got)
|
|
}
|
|
}
|
|
|
|
// Un chemin absolu demandé explicitement reste intouché.
|
|
func TestResolveAgentPathAbsolute(t *testing.T) {
|
|
abs := filepath.Join(t.TempDir(), "rapport.md")
|
|
if got := resolveAgentPath(abs); got != abs {
|
|
t.Fatalf("resolveAgentPath = %q, attendu %q", got, abs)
|
|
}
|
|
}
|
|
|
|
func TestResolveAgentPathSubdir(t *testing.T) {
|
|
ws := withWorkspace(t)
|
|
got := resolveAgentPath("notes/2026/a.txt")
|
|
if !strings.HasPrefix(got, ws) {
|
|
t.Fatalf("%q hors du dossier de la discussion %q", got, ws)
|
|
}
|
|
if strings.Contains(got, "/") && filepath.Separator != '/' {
|
|
t.Fatalf("séparateurs non normalisés : %q", got)
|
|
}
|
|
}
|