fix: UTF-8-Encoding gehärtet (SSE-Reader + CLI-Workspace)

- AnthropicService.Streaming.cs + OpenAiService.cs: SSE-StreamReader nutzt
  jetzt expliziten UTF-8-Encoder mit 16-KB-Buffer (statt default 1 KB) und
  ohne BOM-Detection. Verhindert intermittierende Replacement-Chars (�),
  die entstehen können, wenn Multi-Byte-UTF-8-Sequenzen ungünstig über die
  Read-Boundary eines NetworkStreams gesplittet werden.
- ClaudeCliService.cs: cmd.exe-Wrapper jetzt mit /D (AutoRun-Skripte aus
  Registry deaktivieren) und WorkingDirectory wird auf den Session-Workspace
  gesetzt. Vorher erbte der Child-Prozess das CWD von gott (bei Windows-
  Diensten C:\WINDOWS\system32).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
MelekiandClaude Opus 4.7 committed 2026-04-26 12:08:56 +02:00
1 parent 32aad7feef
commit bfd550e090
3 files changed
+36 -6

No files matched your search

+11 -1
View File
@@ -402,7 +402,17 @@ public partial class AnthropicService
// an den underlying NetworkStream – der Read blockiert sonst bis Anthropic
// das nächste Chunk sendet (kann bei extended thinking Minuten dauern).
using var ctReg = workCt.Register(() => { try { stream.Dispose(); } catch { } });
using var reader = new StreamReader(stream);
// Explizit UTF-8 ohne BOM-Detection, größerer Buffer (16 KB statt default 1024).
// Verhindert intermittierende Replacement-Chars (�) für Multi-Byte-Sequenzen
// (ü, ö, ä, ß, em-dash …), die entstehen können, wenn ein Multi-Byte-UTF-8-Char
// ungünstig über die Read-Boundary eines NetworkStreams gesplittet wird und der
// Decoder bei kleinem Buffer den State verliert.
using var reader = new StreamReader(
stream,
encoding: new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: false),
detectEncodingFromByteOrderMarks: false,
bufferSize: 16384,
leaveOpen: false);
var stopReason = "";
var assistantContent = new List<object>();