mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-21 14:08:11 +02:00
Terminal : le vrai code de sortie, la sortie gardée au délai, sans ANSI
Repris de shell.ts / shell-tail.ts et diagnostics.ts d'OpenFox (2.0.160). - « cmd | tail -N » : le code de sortie devenait celui de tail (0) et un build en échec passait pour réussi. Le tail est retiré de la commande et Loki garde lui-même les N dernières lignes : même sortie, vrai code. - Délai dépassé : la sortie déjà produite est rendue (où en était le build, quel test bloquait) au lieu d'un « [timeout] » sec, avec le conseil de passer par bash_bg pour un serveur. - Couleurs et séquences ANSI retirées : du bruit en tokens. - La durée suit le code de sortie (« exit: 0 · 1.2s »). - Mode Code : « cmd & » refusé, avec renvoi vers bash_bg — le process orphelin n'avait ni sortie lisible ni moyen d'être arrêté. - Diagnostics LSP : erreurs d'abord, avec le compte total ; au-delà de la limite, des indices de style passaient devant l'erreur de compilation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a745d2399e
commit
2e0356cd6c
5 files changed
+175
-4
No files matched your search
@@ -224,6 +224,10 @@ func runShell(parent context.Context, command string, timeoutSec int) string {
|
||||
if timeoutSec > toolMaxTimeout {
|
||||
timeoutSec = toolMaxTimeout
|
||||
}
|
||||
// « … | tail -N » final : retiré, on garde nous-mêmes les N dernières lignes
|
||||
// (chat_shell_hygiene.go) — sinon le code de sortie est celui de tail.
|
||||
command, keepLines := splitTailPipe(command)
|
||||
start := time.Now()
|
||||
ctx, cancel := context.WithTimeout(parent, time.Duration(timeoutSec)*time.Second)
|
||||
defer cancel()
|
||||
cmd := newShellCmd(ctx, command)
|
||||
@@ -254,9 +258,27 @@ func runShell(parent context.Context, command string, timeoutSec int) string {
|
||||
// issue connue était de redémarrer loki-ui.
|
||||
cmd.WaitDelay = 2 * time.Second
|
||||
err := cmd.Run()
|
||||
// Sortie nettoyée (couleurs ANSI retirées), réduite à la fin si la commande
|
||||
// demandait un tail.
|
||||
clean := func(s string) string { return tailOutput(stripANSI(s)) }
|
||||
out := stdout.String()
|
||||
if keepLines > 0 {
|
||||
out = tailLines(out, keepLines)
|
||||
}
|
||||
out = clean(out)
|
||||
errOut := clean(stderr.String())
|
||||
switch {
|
||||
case errors.Is(ctx.Err(), context.DeadlineExceeded):
|
||||
return fmt.Sprintf("[timeout après %ds]", timeoutSec)
|
||||
// La sortie déjà produite reste utile (où le build en était, quel test
|
||||
// bloquait) : on la rend au lieu d'un « timeout » sec (OpenFox).
|
||||
msg := fmt.Sprintf("[timeout après %ds — commande arrêtée ; pour un serveur ou une tâche longue, utilise bash_bg]", timeoutSec)
|
||||
if out != "" {
|
||||
msg += "\n\nstdout (partiel):\n" + out
|
||||
}
|
||||
if errOut != "" {
|
||||
msg += "\n\nstderr (partiel):\n" + errOut
|
||||
}
|
||||
return msg
|
||||
case errors.Is(parent.Err(), context.Canceled):
|
||||
return "[commande interrompue]"
|
||||
}
|
||||
@@ -268,9 +290,8 @@ func runShell(parent context.Context, command string, timeoutSec int) string {
|
||||
return fmt.Sprintf("[erreur: %v]", err)
|
||||
}
|
||||
}
|
||||
out := tailOutput(stdout.String())
|
||||
errOut := tailOutput(stderr.String())
|
||||
parts := []string{fmt.Sprintf("exit: %d", exit)}
|
||||
// « exit: N » en tête : tasks_script.go s'y fie. La durée suit.
|
||||
parts := []string{fmt.Sprintf("exit: %d · %s", exit, time.Since(start).Round(100*time.Millisecond))}
|
||||
if out != "" {
|
||||
parts = append(parts, "stdout:\n"+out)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user