diff --git a/Program.cs b/Program.cs index 42b585a..b9d1435 100644 --- a/Program.cs +++ b/Program.cs @@ -96,9 +96,15 @@ var openAiClient = new OpenAIClient(new ApiKeyCredential(apiKey), new OpenAIClie IChatClient innerClient = openAiClient.GetChatClient(model).AsIChatClient(); // ── Tool call logging via Spectre ─────────────────────────────────────── -static void ToolLog(string message) +object consoleLock = new object(); + +void ToolLog(string message) { - AnsiConsole.MarkupLine($"[dim grey] ● {Markup.Escape(message)}[/]"); + lock (consoleLock) + { + Console.Write("\r" + new string(' ', 40) + "\r"); + AnsiConsole.MarkupLine($"[dim grey] ● {Markup.Escape(message)}[/]"); + } } CommandTool.Log = @@ -244,12 +250,18 @@ while (true) CommandTool.PauseSpinner = () => { - showSpinner = false; - Console.Write("\r" + new string(' ', 40) + "\r"); + lock (consoleLock) + { + showSpinner = false; + Console.Write("\r" + new string(' ', 40) + "\r"); + } }; CommandTool.ResumeSpinner = () => { - showSpinner = true; + lock (consoleLock) + { + showSpinner = true; + } }; var spinnerTask = Task.Run(async () => @@ -264,11 +276,14 @@ while (true) { while (!spinnerCts.Token.IsCancellationRequested) { - if (showSpinner) + lock (consoleLock) { - var frame = frames[i % frames.Count]; - Console.Write($"\r\x1b[38;5;69m{frame}\x1b[0m Thinking..."); - i++; + if (showSpinner && !spinnerCts.Token.IsCancellationRequested) + { + var frame = frames[i % frames.Count]; + Console.Write($"\r\x1b[38;5;69m{frame}\x1b[0m Thinking..."); + i++; + } } try { await Task.Delay(interval, spinnerCts.Token); } catch { } } @@ -276,9 +291,12 @@ while (true) finally { // Clear the spinner line and show cursor - if (showSpinner) - Console.Write("\r" + new string(' ', 40) + "\r"); - Console.Write("\x1b[?25h"); + lock (consoleLock) + { + if (showSpinner) + Console.Write("\r" + new string(' ', 40) + "\r"); + Console.Write("\x1b[?25h"); + } } });