mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 15:08:16 +02:00
v0.5.1 : accès distant ajean.link depuis l'UI + app Windows sans console
- Panneau « Accès distant » dans l'UI web : abonnement + liaison ajean.link en un clic (popup connect.html → clé remise à l'agent local), sans terminal. Endpoints locaux /api/link/status|connect|disconnect|paircode (web_link_api.go). - Accès OpenAI public : refuse d'être activé sans accès distant, avec message. - Windows : binaire compilé en sous-système GUI (-H=windowsgui) → plus aucune fenêtre de console au double-clic ; rattachement à la console parente en CLI (sys_console_windows.go). Suppression du hack relaunchDetachedApp. - Windows : masquage (CREATE_NO_WINDOW) de TOUS les sous-process — git/vswhere du panneau MOTEUR (flash à chaque refresh), llama-server, MCP stdio, winget… - Vouvoiement du nouveau parcours.
This commit is contained in:
1 parent
8e57685b19
commit
d8b08dbb89
22 files changed
+444
-103
No files matched your search
@@ -0,0 +1,60 @@
|
||||
//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))
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user