Remote-Keep-Alive gegen 180s-Timeout + System-Prompt via Datei
Task 1 – Remote-Befehle laufen nicht mehr in einen starren 180s-Timeout:
- RemoteConnectionManager.ExecuteCommand nutzt jetzt einen INAKTIVITÄTS-
Timeout (Watchdog auf LastProgressAt) statt hartem Wall-Clock-Limit; ein
Befehl darf beliebig lange laufen, solange der Client Progress-Frames sendet.
- RemoteEndpoint: neuer "progress"-Case setzt die Frist zurück.
- InternalEndpoint (MCP-Pfad remote_execute): hartes CancellationTokenSource(180s)
entfernt → nutzt konfigurierbares ExecuteTimeout-Setting + RequestAborted.
- remote.ps1 / remote.sh: senden während laufender Befehle alle 15s ein
{"type":"progress"}-Keep-Alive; async stdout/stderr-Lesen gegen Pipe-Deadlocks.
- ToolService: Tool-Beschreibungen erklären den Inaktivitäts-Timeout.
Task 2 – System-Prompt über --system-prompt-file statt CLI-Argument:
- ClaudeCliService schreibt den vollen System-Prompt in eine Temp-Datei und
übergibt --system-prompt-file, um das Windows-Kommandozeilen-Längenlimit zu
umgehen. Cleanup im finally. Agent-Verhalten unverändert (MEMORY.md bleibt inline).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
9db9bd4cc7
commit
ace5036f00
7 files changed
+118
-26
No files matched your search
@@ -466,10 +466,19 @@ public class ClaudeCliService
|
||||
args.Add(modelId);
|
||||
}
|
||||
|
||||
// System-Prompt NICHT als CLI-Argument, sondern über eine Temp-Datei übergeben.
|
||||
// Grund: Der volle System-Prompt (Identity + Soul + Memory/MEMORY.md + Skills +
|
||||
// recalled_context) kann sehr groß werden und unter Windows das Kommandozeilen-
|
||||
// Längenlimit (~32k Zeichen bzw. 8191 bei cmd.exe-Shims) sprengen → CLI-Start scheitert.
|
||||
// --system-prompt-file umgeht das komplett (CLI v2.1.183+ unterstützt das Flag,
|
||||
// verifiziert am Binary). Semantik identisch zu --system-prompt (Override, kein Append).
|
||||
string systemPromptFile = null;
|
||||
if (!string.IsNullOrEmpty(systemPrompt))
|
||||
{
|
||||
args.Add("--system-prompt");
|
||||
args.Add(systemPrompt);
|
||||
systemPromptFile = Path.Combine(Path.GetTempPath(), $"gott-sysprompt-{Guid.NewGuid():N}.txt");
|
||||
await File.WriteAllTextAsync(systemPromptFile, systemPrompt); // UTF-8 ohne BOM
|
||||
args.Add("--system-prompt-file");
|
||||
args.Add(systemPromptFile);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(mcpConfigPath))
|
||||
@@ -478,7 +487,18 @@ public class ClaudeCliService
|
||||
args.Add(mcpConfigPath);
|
||||
}
|
||||
|
||||
return await RunCliStreamingAsync(args, prompt, onEvent, cancellationToken, effortToUse, workspace, modelId, sessionId, chainId);
|
||||
try
|
||||
{
|
||||
return await RunCliStreamingAsync(args, prompt, onEvent, cancellationToken, effortToUse, workspace, modelId, sessionId, chainId);
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Temp-Datei nach CLI-Ende wieder entfernen
|
||||
if (systemPromptFile != null)
|
||||
{
|
||||
try { File.Delete(systemPromptFile); } catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<CliChatResult> RunCliStreamingAsync(
|
||||
|
||||
Reference in new issue
Block a user