Something went wrong. Try again.
more up to date at codeberg https://codeberg.org/cowie/tau.git
Something went wrong. Try again.
2.9 kB · 97 lines
TypeScript
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798/** * Debug script to reproduce streaming rendering issues. * Uses real fixture data that caused the bug. * Run with: npx tsx test/streaming-render-debug.ts */
import type { AssistantMessage } from "@earendil-works/pi-ai";import { ProcessTerminal, TUI } from "@earendil-works/pi-tui";import { readFileSync } from "fs";import { dirname, join } from "path";import { fileURLToPath } from "url";import { AssistantMessageComponent } from "../src/modes/interactive/components/assistant-message.ts";import { initTheme } from "../src/modes/interactive/theme/theme.ts";
const __filename = fileURLToPath(import.meta.url);const __dirname = dirname(__filename);
// Initialize dark theme with full color supportprocess.env.COLORTERM = "truecolor";initTheme("dark");
// Load the real fixture that caused the bugconst fixtureMessage: AssistantMessage = JSON.parse( readFileSync(join(__dirname, "fixtures/assistant-message-with-thinking-code.json"), "utf-8"),);
// Extract thinking and text contentconst thinkingContent = fixtureMessage.content.find((c) => c.type === "thinking");const textContent = fixtureMessage.content.find((c) => c.type === "text");
if (!thinkingContent || thinkingContent.type !== "thinking") { console.error("No thinking content in fixture"); process.exit(1);}
const fullThinkingText = thinkingContent.thinking;const fullTextContent = textContent && textContent.type === "text" ? textContent.text : "";
async function sleep(ms: number): Promise<void> { return new Promise((resolve) => setTimeout(resolve, ms));}
async function main() { const terminal = new ProcessTerminal(); const tui = new TUI(terminal);
// Start with empty message const message = { role: "assistant", content: [{ type: "thinking", thinking: "" }], } as AssistantMessage;
const component = new AssistantMessageComponent(message, false); tui.addChild(component); tui.start();
// Simulate streaming thinking content let thinkingBuffer = ""; const chunkSize = 10; // characters per "token"
for (let i = 0; i < fullThinkingText.length; i += chunkSize) { thinkingBuffer += fullThinkingText.slice(i, i + chunkSize);
// Update message content const updatedMessage = { role: "assistant", content: [{ type: "thinking", thinking: thinkingBuffer }], } as AssistantMessage;
component.updateContent(updatedMessage); tui.requestRender();
await sleep(15); // Simulate token delay }
// Now add the text content await sleep(500);
const finalMessage = { role: "assistant", content: [ { type: "thinking", thinking: fullThinkingText }, { type: "text", text: fullTextContent }, ], } as AssistantMessage;
component.updateContent(finalMessage); tui.requestRender();
// Keep alive for a moment to see the result await sleep(3000);
tui.stop(); process.exit(0);}
main().catch(console.error);