v0.8.1 : le moteur dit enfin pourquoi il ne demarre pas, et les presets repartent propres

- start/restart : preflight (BIN, MODEL, .gguf) et fin du faux « [ok] activating »
  sur un service qui redemarre en boucle (SubState auto-restart).
- MODEL en chemin absolu accepte hors des dossiers declares (lecture seule) ;
  l'allowlist reste sur la suppression de fichiers.
- ajean edit : squelette commente des cles au lieu d'un fichier quasi vide.
- install : les prochaines etapes n'oublient plus « ajean llamacpp install ».
- Presets : un nouveau preset ne recopie plus la config active (issue #17),
  seulement BIN/HOST/PORT.
- Presets : plus de guillemet interne mange a la relecture (Go et interface),
  et EXTRA_ARGS decoupe en respectant les guillemets.
This commit is contained in:
nathaninline committed 2026-08-08 09:16:16 +02:00
1 parent 68d6d2032a
commit db47c72240
17 files changed
+439 -102

No files matched your search

+23
View File
@@ -101,6 +101,29 @@ func baseName(p string) string {
return p
}
// resolveServeModelPath résout MODEL= pour LANCER le moteur. Différence avec
// resolveModelPath : un chemin absolu qui pointe sur un .gguf existant est
// accepté même hors des dossiers déclarés. L'allowlist protège des opérations
// destructrices pilotées depuis l'UI (suppression d'un fichier) ; l'appliquer à
// « ouvrir ce modèle en lecture » rendait la config éditée à la main
// inutilisable : MODEL=/home/moi/models/x.gguf renvoyait « dossier non
// autorisé », le moteur mourait en boucle, et le seul remède connu était
// d'aller déclarer le dossier dans l'interface web.
func resolveServeModelPath(name string) (string, error) {
p, err := resolveModelPath(name)
if err == nil {
return p, nil
}
s := strings.TrimSpace(strings.Trim(strings.TrimSpace(name), `"`))
if filepath.IsAbs(s) && strings.HasSuffix(strings.ToLower(s), ".gguf") {
abs := filepath.Clean(s)
if st, e := os.Stat(abs); e == nil && !st.IsDir() {
return abs, nil
}
}
return "", err
}
// resolveModelPath transforme une valeur MODEL= (nom de fichier OU chemin
// absolu) en chemin absolu vers un .gguf. Un chemin absolu n'est accepté que
// s'il est dans un des dossiers déclarés — sinon l'UI web deviendrait un moyen