mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
macOS : modele resolu depuis JEAN_HOME + alerte App Translocation
- config.env stocke MODEL sous forme de nom de fichier : sous systemd/launchd le WorkingDirectory vaut JEAN_HOME, mais une app de bureau demarre avec cwd=/ et llama-server ne trouvait pas le .gguf. cmdServe resout desormais MODEL et BIN relatifs contre JEAN_HOME, et le service en mode utilisateur fixe cmd.Dir (macOS + Windows). - erreur explicite << modele introuvable : <chemin> >> au lieu d'un echec muet - bandeau d'alerte quand l'app tourne depuis une copie AppTranslocation (app non signee ouverte depuis Telechargements) : chemin different a chaque lancement, instances concurrentes, maj du moteur impossible
This commit is contained in:
1 parent
9fe955d5ae
commit
e7d837d17e
10 files changed
+68
No files matched your search
@@ -19,6 +19,20 @@ func cmdServe(args []string) error {
|
||||
if model == "" {
|
||||
return fmt.Errorf("MODEL non défini dans %s", confPath())
|
||||
}
|
||||
// MODEL est enregistré sous forme de simple nom de fichier (les .gguf vivent
|
||||
// dans JEAN_HOME) : sous systemd/launchd le WorkingDirectory vaut JEAN_HOME,
|
||||
// donc le chemin relatif tombait juste. Lancé depuis une app de bureau, le
|
||||
// répertoire courant est « / » et llama-server ne trouvait rien. On résout
|
||||
// donc explicitement, quel que soit le contexte de lancement.
|
||||
if !filepath.IsAbs(model) {
|
||||
model = filepath.Join(JeanHome(), model)
|
||||
}
|
||||
if _, err := os.Stat(model); err != nil {
|
||||
return fmt.Errorf("modèle introuvable : %s", model)
|
||||
}
|
||||
if !filepath.IsAbs(bin) {
|
||||
bin = filepath.Join(JeanHome(), bin)
|
||||
}
|
||||
|
||||
// Make sure llama-server can find its bundled shared libraries (the .so/.dll
|
||||
// neighbours of the binary). This is platform-specific: LD_LIBRARY_PATH on
|
||||
|
||||
@@ -36,6 +36,28 @@ func setupConsole() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// appWarning signale une situation de lancement qui casse Jean de façon peu
|
||||
// évidente. Aujourd'hui : l'App Translocation de Gatekeeper. Une app non signée
|
||||
// ouverte depuis Téléchargements est exécutée depuis une copie en LECTURE SEULE
|
||||
// sous /private/var/folders/…/AppTranslocation/<uuid>/, à un chemin différent à
|
||||
// CHAQUE lancement. Conséquences vécues : plusieurs instances qui se marchent
|
||||
// dessus (la seconde trouve le port 8090 occupé et se contente d'ouvrir l'UI de
|
||||
// la première, souvent une version périmée), des process fantômes issus de
|
||||
// copies précédentes, et une mise à jour en place impossible.
|
||||
// Le remède est côté utilisateur : déplacer Jean.app dans /Applications.
|
||||
func appWarning() string {
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
if !strings.Contains(exe, "/AppTranslocation/") {
|
||||
return ""
|
||||
}
|
||||
return "Jean tourne depuis une copie temporaire en lecture seule (App Translocation de macOS). " +
|
||||
"Fermez l'app, déplacez Jean.app dans le dossier Applications, puis rouvrez-la — " +
|
||||
"sinon chaque lancement crée une instance séparée et les mises à jour du moteur échouent."
|
||||
}
|
||||
|
||||
// fixFinderPath complète le PATH famélique hérité du Finder. Une app lancée par
|
||||
// LaunchServices reçoit /usr/bin:/bin:/usr/sbin:/sbin — pas les dossiers de
|
||||
// Homebrew : sans ça, Jean ne voit ni `brew`, ni `cmake`, ni `git`, et la
|
||||
|
||||
@@ -8,3 +8,7 @@ package jean
|
||||
// sys_console_windows.go (double-clic sur jean.exe) et sys_console_darwin.go
|
||||
// (ouverture de Jean.app depuis le Finder).
|
||||
func setupConsole() bool { return true }
|
||||
|
||||
// appWarning : rien à signaler hors macOS (l'App Translocation est spécifique à
|
||||
// Gatekeeper). Voir sys_console_darwin.go.
|
||||
func appWarning() string { return "" }
|
||||
@@ -58,3 +58,7 @@ func configureConsole() {
|
||||
_, _, _ = k.NewProc("SetConsoleMode").Call(h, uintptr(mode|enableVirtualTerminalProcessing))
|
||||
}
|
||||
}
|
||||
|
||||
// appWarning : rien à signaler sous Windows (pas d'App Translocation). Voir
|
||||
// sys_console_darwin.go.
|
||||
func appWarning() string { return "" }
|
||||
@@ -184,6 +184,10 @@ func userSvcStart() error {
|
||||
|
||||
cmd := exec.Command(self, "serve")
|
||||
cmd.Stdout, cmd.Stderr = logf, logf
|
||||
// Même répertoire de travail que sous systemd/launchd : les chemins relatifs
|
||||
// de config.env (MODEL=…gguf) se résolvent depuis JEAN_HOME, pas depuis « / »
|
||||
// que nous hérite le Finder.
|
||||
cmd.Dir = JeanHome()
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
|
||||
if err := cmd.Start(); err != nil {
|
||||
return fmt.Errorf("démarrage de 'jean serve': %w", err)
|
||||
|
||||
@@ -71,6 +71,7 @@ func svcStart() error {
|
||||
cmd := exec.Command(self, "serve")
|
||||
cmd.Stdout = logf
|
||||
cmd.Stderr = logf
|
||||
cmd.Dir = JeanHome() // les chemins relatifs de config.env se résolvent depuis JEAN_HOME
|
||||
// createNoWindow + HideWindow : le service enfant (`jean serve`) ne doit JAMAIS
|
||||
// faire clignoter de console noire quand Jean est lancé en mode app (double-clic).
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||
|
||||
@@ -401,6 +401,8 @@ button:disabled{opacity:.5;cursor:not-allowed}
|
||||
<h1 id="brand"><span id="brand-a">a</span>jean<span id="ver"></span></h1>
|
||||
<span id="status-svc" class="statuspill" onclick="toggleSvcLog()" title="voir le journal du moteur">…</span>
|
||||
</div>
|
||||
<!-- Avertissement de lancement (App Translocation macOS) — masqué par défaut. -->
|
||||
<div id="app-warn" class="muted" style="display:none;font-size:11px;line-height:1.5;margin:0 0 10px;padding:8px 10px;border-radius:8px;color:var(--warn);border:1px solid color-mix(in srgb,var(--warn) 45%,transparent);background:color-mix(in srgb,var(--warn) 12%,transparent)"></div>
|
||||
<!-- Journal du moteur : replié par défaut, ouvert au clic sur la pastille d'état.
|
||||
C'est le seul endroit où l'on voit pourquoi un modèle refuse de charger. -->
|
||||
<div id="svc-log-box" style="display:none;margin:0 0 10px">
|
||||
@@ -921,6 +923,13 @@ async function loadStatus(){
|
||||
if(s.version){
|
||||
document.getElementById('ver').textContent='v'+s.version;
|
||||
}
|
||||
// Avertissement de lancement (App Translocation macOS) : rare, mais il explique
|
||||
// des symptomes tres deroutants, donc on l'affiche en permanence tant qu'il dure.
|
||||
const wb=document.getElementById('app-warn');
|
||||
if(wb){
|
||||
if(s.warn){ wb.textContent='⚠ '+s.warn; wb.style.display=''; }
|
||||
else { wb.style.display='none'; }
|
||||
}
|
||||
}
|
||||
// Journal du moteur — replié par défaut, on l'ouvre en cliquant la pastille.
|
||||
function toggleSvcLog(){
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
<h1 id="brand"><span id="brand-a">a</span>jean<span id="ver"></span></h1>
|
||||
<span id="status-svc" class="statuspill" onclick="toggleSvcLog()" title="voir le journal du moteur">…</span>
|
||||
</div>
|
||||
<!-- Avertissement de lancement (App Translocation macOS) — masqué par défaut. -->
|
||||
<div id="app-warn" class="muted" style="display:none;font-size:11px;line-height:1.5;margin:0 0 10px;padding:8px 10px;border-radius:8px;color:var(--warn);border:1px solid color-mix(in srgb,var(--warn) 45%,transparent);background:color-mix(in srgb,var(--warn) 12%,transparent)"></div>
|
||||
<!-- Journal du moteur : replié par défaut, ouvert au clic sur la pastille d'état.
|
||||
C'est le seul endroit où l'on voit pourquoi un modèle refuse de charger. -->
|
||||
<div id="svc-log-box" style="display:none;margin:0 0 10px">
|
||||
|
||||
@@ -13,6 +13,13 @@ async function loadStatus(){
|
||||
if(s.version){
|
||||
document.getElementById('ver').textContent='v'+s.version;
|
||||
}
|
||||
// Avertissement de lancement (App Translocation macOS) : rare, mais il explique
|
||||
// des symptomes tres deroutants, donc on l'affiche en permanence tant qu'il dure.
|
||||
const wb=document.getElementById('app-warn');
|
||||
if(wb){
|
||||
if(s.warn){ wb.textContent='⚠ '+s.warn; wb.style.display=''; }
|
||||
else { wb.style.display='none'; }
|
||||
}
|
||||
}
|
||||
// Journal du moteur — replié par défaut, on l'ouvre en cliquant la pastille.
|
||||
function toggleSvcLog(){
|
||||
|
||||
@@ -41,6 +41,7 @@ func handleStatus(w http.ResponseWriter, r *http.Request) {
|
||||
"port": LLMPort(),
|
||||
"ctx": ctx,
|
||||
"version": Version,
|
||||
"warn": appWarning(), // ex. App Translocation macOS — vide si tout va bien
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user