mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Sélecteur Chat|Code par discussion dans le pied du composeur ; en mode chat, une détection serveur suggère la bascule (puce ignorable, jamais automatique). Conception reprise d'OpenFox (MIT), réécrite en Go — voir NOTICE.md. - Outils fichiers : read (lignes numérotées, borné), grep, glob, et le tracker « lu avant d'écrire » qui refuse write/edit sur un fichier non lu ou modifié depuis la lecture ; edit préserve les fins de ligne CRLF. - Politique d'exécution : commandes catastrophiques refusées (rm -rf /, mkfs, reboot…), chemins bornés au dossier de la discussion en mode code, mutex par fichier. - Critères d'acceptation : contrat posé via l'outil criteria (éditable dans l'UI), passe de vérification indépendante sur contexte isolé — seule habilitée à marquer « passed » — puis corrections plafonnées. - Rôles embarqués (agents/*.md) : builder, planner, verifier, explorer, code-reviewer ; badge de rôle dans le fil. - LSP : gopls / typescript-language-server / pyright (inclus dans l'image), diagnostics injectés dans le retour de write/edit. - Git natif : git_status, git_diff, git_clone (borné à la discussion). - Jobs d'arrière-plan bash_bg/bash_tail (serveur de dev, build long). - Auto-retry : un appel d'outil écrit en texte (default_api:…, <tool_call>…) relance le tour une fois avec consigne corrective. - Outil ask : question à choix rendue en carte à boutons. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.6 KiB
Go
45 lines
1.6 KiB
Go
package loki
|
|
|
|
// code_roles.go — registre des rôles du mode code. Chaque rôle est un prompt
|
|
// Markdown EMBARQUÉ dans le binaire (agents/*.md), comme le catalogue MCP :
|
|
// pas d'appel réseau, pour en changer on édite le fichier et on recompile.
|
|
// Démarche reprise du registre d'agents d'OpenFox (builder/planner/explorer/
|
|
// verifier/code-reviewer — voir NOTICE.md), prompts réécrits COURTS : un
|
|
// préambule verbeux fait sur-raisonner les modèles locaux (voir le commentaire
|
|
// de baseSystemPrompt).
|
|
|
|
import (
|
|
"embed"
|
|
"strings"
|
|
)
|
|
|
|
//go:embed agents/*.md
|
|
var rolesFS embed.FS
|
|
|
|
// roleNames : les rôles connus. builder et verifier sont pilotés par la boucle
|
|
// du mode code (code_verify.go) ; planner s'active quand l'utilisateur demande
|
|
// un plan ; explorer et code-reviewer sont disponibles pour des passes
|
|
// manuelles futures.
|
|
var roleNames = []string{"builder", "planner", "explorer", "verifier", "code-reviewer"}
|
|
|
|
// rolePrompt renvoie le prompt d'un rôle, "" si inconnu.
|
|
func rolePrompt(name string) string {
|
|
b, err := rolesFS.ReadFile("agents/" + name + ".md")
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(string(b))
|
|
}
|
|
|
|
// planIntentRe-like : l'utilisateur demande-t-il un PLAN plutôt qu'une
|
|
// implémentation ? Heuristique simple sur le début du message.
|
|
func wantsPlan(text string) bool {
|
|
low := strings.ToLower(text)
|
|
for _, kw := range []string{"fais un plan", "fait un plan", "propose un plan", "planifie", "plan d'implémentation", "plan d'action", "make a plan", "plan first"} {
|
|
if strings.Contains(low, kw) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|