mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Surface visible passee en AJEAN : aide de la CLI, messages, invite du chat terminal, commentaires, README, metadonnees Windows du binaire (InternalName / OriginalFilename). Les reglages s'appellent desormais AJEAN_* (AJEAN_HOME, AJEAN_MODEL_DIRS, AJEAN_DL_CONNS, AJEAN_LINK_URL, AJEAN_ACME_EMAIL, AJEAN_SERVICE), avec l'ancien nom JEAN_* toujours lu en second via envAny(). Ces variables sont posees a la main dans des shells, des units, des docker-compose et des scripts de deploiement qu'on ne peut pas retrouver : cesser de les lire ferait retomber silencieusement un reglage sur sa valeur par defaut. Migration one-shot du dossier de donnees retentee dans la fenetre ou l'installateur Windows a arrete toutes les instances, seule fenetre ou le rename peut aboutir. Le chemin du binaire est recalcule juste apres, sinon on reinstallerait dans le dossier qu'on vient de deplacer. Deux choses volontairement NON renommees, parce que les renommer casserait des utilisateurs sans rien apporter : - "model": "jean", le nom expose sur l'endpoint compatible OpenAI. Des integrations externes le configurent en dur. - les cles localStorage (jean-theme, jean.sys...). Les renommer reinitialiserait theme, preferences d'affichage et prompt systeme dans le navigateur de chaque utilisateur. Le plist launchd recevait /usr/local/bin/jean en dur : le chemin est desormais injecte, sinon le daemon macOS aurait refuse de demarrer apres le renommage. index.html regenere depuis ui/src via go generate.
85 lines
2.4 KiB
Go
85 lines
2.4 KiB
Go
package ajean
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// Le « mode agent » est l'unique interrupteur qui donne à l'IA l'accès à ses
|
|
// outils. Quand il est actif, l'IA dispose du shell (run_shell) et de sa
|
|
// mémoire (mem_search/mem_read/mem_add/mem_edit) — les anciens « skills » ont
|
|
// été fondus dans la mémoire. Plus de drapeaux machine/skills séparés : un seul
|
|
// fichier .agent_enabled.
|
|
|
|
func agentEnabled() bool {
|
|
if _, err := os.Stat(agentFlag()); err == nil {
|
|
return true
|
|
}
|
|
// Migration : si l'un des anciens drapeaux séparés traîne encore, on
|
|
// considère le mode agent comme actif (et on le matérialise au prochain set).
|
|
if _, err := os.Stat(legacyToolsFlag()); err == nil {
|
|
return true
|
|
}
|
|
if _, err := os.Stat(legacySkillsFlag()); err == nil {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func setAgentEnabled(on bool) error {
|
|
_ = os.MkdirAll(AjeanHome(), 0o755)
|
|
// On nettoie systématiquement les anciens drapeaux pour ne pas garder un
|
|
// état fantôme « à moitié activé » hérité de l'ancien modèle à deux toggles.
|
|
_ = os.Remove(legacyToolsFlag())
|
|
_ = os.Remove(legacySkillsFlag())
|
|
if on {
|
|
f, err := os.Create(agentFlag())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return f.Close()
|
|
}
|
|
if err := os.Remove(agentFlag()); err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func cmdAgent(args []string) error {
|
|
sub := ""
|
|
if len(args) > 0 {
|
|
sub = args[0]
|
|
}
|
|
switch sub {
|
|
case "on":
|
|
if err := setAgentEnabled(true); err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(green("[ok]") + " mode agent activé — l'IA dispose du shell complet (" + shellName() + "), de l'écriture de fichiers et de sa mémoire")
|
|
case "off":
|
|
if err := setAgentEnabled(false); err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(green("[ok]") + " mode agent désactivé")
|
|
case "", "status", "list":
|
|
state := dim("off")
|
|
if agentEnabled() {
|
|
state = green("on")
|
|
}
|
|
fmt.Printf("%s état: %s\n", cyan("Mode agent"), state)
|
|
fmt.Printf(" outils : %s (timeout %ds, max %ds) + write/edit + mémoire (mem_search/mem_read/mem_add/mem_edit)\n", shellName(), toolDefaultTimeout, toolMaxTimeout)
|
|
mem := MemList()
|
|
if len(mem) == 0 {
|
|
fmt.Printf(" mémoire : aucune page — crée %s/<nom>.md\n", memoryDir())
|
|
return nil
|
|
}
|
|
fmt.Printf(" mémoire (%s) :\n", memoryDir())
|
|
for _, p := range mem {
|
|
fmt.Printf(" %s %s\n", bold(p.Name), p.Title)
|
|
}
|
|
default:
|
|
return fmt.Errorf("usage: ajean agent [on|off|status]")
|
|
}
|
|
return nil
|
|
}
|