Files
Loki/internal/jean/sys_console_windows.go
T
nathaninline e7d837d17e 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
2026-07-25 12:39:04 +02:00

65 lines
2.5 KiB
Go

//go:build windows
package jean
// sys_console_windows.go — gestion de la console sous Windows.
//
// Le binaire est compilé en sous-système GUI (`-H=windowsgui`) : au double-clic,
// Windows n'alloue AUCUNE console → plus jamais de « fenêtre noire de terminal »
// qui s'ouvre et se ferme. En contrepartie, un binaire GUI lancé depuis un
// terminal (cmd/PowerShell) n'écrit nulle part par défaut : on se rattache alors
// explicitement à la console du parent et on réouvre stdout/stderr/stdin dessus,
// pour que l'usage CLI (`jean web`, `jean status`, …) reste lisible.
import (
"os"
"syscall"
"unsafe"
)
// setupConsole rattache le process à la console de son parent si elle existe.
// Retourne true si on dispose d'une console (→ usage CLI), false sinon (double-
// clic sans console → expérience « application »).
func setupConsole() bool {
const attachParentProcess = ^uintptr(0) // (DWORD)-1 = ATTACH_PARENT_PROCESS
k := syscall.NewLazyDLL("kernel32.dll")
r, _, _ := k.NewProc("AttachConsole").Call(attachParentProcess)
if r == 0 {
return false // aucune console parente = lancé par double-clic (mode app)
}
// Réouvre les flux standard sur la console fraîchement rattachée : sans ça,
// os.Stdout/Stderr pointent sur des handles invalides (sous-système GUI).
if con, err := os.OpenFile("CONOUT$", os.O_WRONLY, 0); err == nil {
os.Stdout = con
os.Stderr = con
}
if cin, err := os.OpenFile("CONIN$", os.O_RDONLY, 0); err == nil {
os.Stdin = cin
}
configureConsole()
return true
}
// configureConsole passe la console en UTF-8 + traitement des séquences ANSI
// (couleurs/curseur), comme le faisait l'init() au chargement — mais APRÈS le
// rattachement, sinon ça ciblait une console encore inexistante.
func configureConsole() {
const (
cpUTF8 = 65001
enableVirtualTerminalProcessing = 0x0004
stdOutputHandle = ^uintptr(10) // -11
)
k := syscall.NewLazyDLL("kernel32.dll")
_, _, _ = k.NewProc("SetConsoleOutputCP").Call(uintptr(cpUTF8))
_, _, _ = k.NewProc("SetConsoleCP").Call(uintptr(cpUTF8))
h, _, _ := k.NewProc("GetStdHandle").Call(stdOutputHandle)
var mode uint32
if r, _, _ := k.NewProc("GetConsoleMode").Call(h, uintptr(unsafe.Pointer(&mode))); r != 0 {
_, _, _ = 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 "" }