Impostazioni: controllo e aggiornamento dei CLI con pulsante evidenziato
Sezione Aggiornamenti nel riquadro Impostazioni: per ogni CLI installato versione, esito del controllo (disponibile, aggiornato, non riuscito) e pulsante Aggiorna che esegue il comando ufficiale. Il pulsante e un puntino sul pulsante Impostazioni si evidenziano solo se c'è una versione nuova. Il controllo legge l'ultima versione dalle sorgenti ufficiali (downloads.claude.ai e release GitHub di Codex), parte all'avvio e all'apertura del riquadro con cache di 5 minuti e non fallisce mai in modo invasivo. L'aggiornamento ha tempo massimo di 10 minuti, blocca invio e cambio CLI, e in caso di errore suggerisce il comando manuale per npm, Homebrew, WinGet o installazione nativa. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6498e45a0d
commit
8b20f5224e
7 files changed
+328
-16
No files matched your search
+24
-2
@@ -5,7 +5,10 @@ namespace AgentWikiUi.Core;
|
||||
// Unico punto di avvio dei motori, condiviso da CLI e GUI.
|
||||
static class EngineRunner
|
||||
{
|
||||
public static ProcessStartInfo CreateStart(Engine engine, string prompt, bool captured, string? sessionId = null, bool resume = false, string model = "", string effort = "")
|
||||
public static ProcessStartInfo CreateStart(Engine engine, string prompt, bool captured, string? sessionId = null, bool resume = false, string model = "", string effort = "") =>
|
||||
CreateStart(engine, engine.BuildArgs(prompt, sessionId, resume, model, effort, structured: captured), captured);
|
||||
|
||||
public static ProcessStartInfo CreateStart(Engine engine, IEnumerable<string> args, bool captured)
|
||||
{
|
||||
var psi = new ProcessStartInfo(engine.Executable)
|
||||
{
|
||||
@@ -16,7 +19,7 @@ static class EngineRunner
|
||||
RedirectStandardError = captured,
|
||||
CreateNoWindow = true,
|
||||
};
|
||||
foreach (var a in engine.BuildArgs(prompt, sessionId, resume, model, effort, structured: captured)) psi.ArgumentList.Add(a);
|
||||
foreach (var a in args) psi.ArgumentList.Add(a);
|
||||
return psi;
|
||||
}
|
||||
|
||||
@@ -47,4 +50,23 @@ static class EngineRunner
|
||||
await p.WaitForExitAsync();
|
||||
return engine.Parse(p.ExitCode, await o, await e);
|
||||
}
|
||||
|
||||
// Comandi di servizio del motore (--version, update): output catturato, tempo massimo, nessuna chat.
|
||||
// Win32Exception se l'eseguibile non è nel PATH; allo scadere il processo e i suoi figli sono terminati.
|
||||
public static async Task<(int Code, string Out, string Err, bool TimedOut)> RunToolAsync(Engine engine, IEnumerable<string> args, TimeSpan timeout)
|
||||
{
|
||||
using var p = Process.Start(CreateStart(engine, args, captured: true))!;
|
||||
p.StandardInput.Close();
|
||||
var o = p.StandardOutput.ReadToEndAsync();
|
||||
var e = p.StandardError.ReadToEndAsync();
|
||||
using var cts = new CancellationTokenSource(timeout);
|
||||
try { await p.WaitForExitAsync(cts.Token); }
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
try { p.Kill(entireProcessTree: true); } catch (InvalidOperationException) { }
|
||||
await p.WaitForExitAsync();
|
||||
return (-1, await o, await e, true);
|
||||
}
|
||||
return (p.ExitCode, await o, await e, false);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user