Files
Loki/internal/loki/code_retry_test.go
T
MichaelandClaude Opus 5 901d518f70 Mode Code : agent de code avec critères, vérification et LSP
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>
2026-08-18 21:58:57 +02:00

35 lines
997 B
Go

package loki
import "testing"
// Les appels d'outils écrits en texte doivent être détectés…
func TestAppelOutilTextuelDetecte(t *testing.T) {
for _, s := range []string{
"<tool_call>{\"name\":\"bash\"}</tool_call>",
"Je vais lancer default_api:bash pour vérifier.",
"default_api.run_shell(command='ls')",
"functions.bash({\"command\": \"ls\"})",
"```tool_code\nprint('x')\n```",
"{\"name\": \"bash\", \"arguments\": {\"command\": \"ls\"}}",
} {
if !textualToolCall(s) {
t.Errorf("non détecté : %q", s)
}
}
}
// … sans jamais relancer un tour normal (code cité, JSON quelconque).
func TestReponseNormaleNonRelancee(t *testing.T) {
for _, s := range []string{
"Voici la réponse : le fichier contient trois fonctions.",
"```go\nfunc main() {}\n```",
"Le JSON de config : {\"name\": \"loki\", \"port\": 8090}",
"La fonction bash() de ce script accepte un paramètre.",
"",
} {
if textualToolCall(s) {
t.Errorf("relance à tort : %q", s)
}
}
}