diff --git a/internal/ajean/sys_tray_darwin.go b/internal/ajean/sys_tray_darwin.go index 820d0ac..4ffe57f 100644 --- a/internal/ajean/sys_tray_darwin.go +++ b/internal/ajean/sys_tray_darwin.go @@ -43,6 +43,13 @@ func runTray(url string) { } }() }, func() { - os.Exit(0) // « Quitter » → arrête tout le process (serveur inclus) + // « Quitter » arrête l'application : l'interface et, avec elle, le + // tunnel d'accès distant qui tourne dans ce process. + // + // Le MOTEUR, lui, n'est pas arrêté : sous macOS c'est un daemon launchd, + // que seul root peut piloter. Fermer une interface n'a pas à arrêter un + // service système. Sous Windows, où l'app est propriétaire du moteur, + // « Quitter » l'arrête bel et bien (voir sys_tray_windows.go). + os.Exit(0) }) } diff --git a/internal/ajean/sys_tray_windows.go b/internal/ajean/sys_tray_windows.go index ddf2d4f..0456d26 100644 --- a/internal/ajean/sys_tray_windows.go +++ b/internal/ajean/sys_tray_windows.go @@ -26,7 +26,7 @@ func runTray(url string) { systray.SetTooltip("AJEAN — votre IA locale") mOpen := systray.AddMenuItem("Ouvrir AJEAN", "Ouvrir l'interface") systray.AddSeparator() - mQuit := systray.AddMenuItem("Quitter", "Arrêter AJEAN") + mQuit := systray.AddMenuItem("Quitter", "Arrêter AJEAN et décharger le modèle") go func() { for { @@ -40,7 +40,20 @@ func runTray(url string) { } }() }, func() { - os.Exit(0) // « Quitter » → arrête tout le process (serveur inclus) + // « Quitter » doit tout arrêter, moteur compris. + // + // Le moteur tourne dans un process DÉTACHÉ (voir svcStart) : il survit + // délibérément à la fermeture de l'app pour que le modèle reste chargé + // entre deux ouvertures de l'interface. Mais quand on quitte pour de + // bon, il n'a plus rien pour le piloter et garde des dizaines de Go de + // RAM, sans la moindre fenêtre pour l'expliquer. svcStop tue l'arbre + // (taskkill /T), donc llama-server avec lui. + // + // Windows seulement : ici l'app EST le propriétaire du moteur. Sous + // Linux et macOS c'est systemd ou launchd, et fermer une interface n'a + // pas à arrêter un service système. + _ = svcStop(false) + os.Exit(0) }) }