feat: display stream for half of terminal until finished, then display

This commit is contained in:
mitchell 2026-04-15 15:03:33 -04:00
parent b0e7eb2a3d
commit d29fc20681

View file

@ -13,19 +13,65 @@ const { fullStream, reasoningText, text } = streamText({
prompt: Bun.argv[2]!, prompt: Bun.argv[2]!,
}); });
const moveCursor = (x: number, y: number) =>
new Promise<void>((resolve) => process.stdout.moveCursor(x, y, resolve));
const clearScreenDown = () =>
new Promise<void>((resolve) => process.stdout.clearScreenDown(resolve));
let lineCount = 0;
let charsSinceNL = 0;
const [numColumns, numRows] = process.stdout.getWindowSize();
for await (const part of fullStream) { for await (const part of fullStream) {
if (part.type === "reasoning-start") { if (part.type === "reasoning-start") {
process.stdout.write("\u001b[2m\n"); process.stdout.write("\u001b[2m\n");
} else if (part.type === "reasoning-delta") { } else if (part.type === "reasoning-delta") {
process.stdout.write(part.text.replaceAll('\n', '\n ')); process.stdout.write(part.text);
charsSinceNL += part.text.length;
if (part.text.includes("\n")) {
lineCount += part.text.match(/\n/g)?.length ?? 1;
charsSinceNL = 0;
} else if (charsSinceNL >= numColumns) {
lineCount++;
charsSinceNL = charsSinceNL - numColumns;
}
if (lineCount >= numRows / 2) {
await moveCursor(0, -lineCount);
await clearScreenDown();
lineCount = 0;
charsSinceNL = 0;
}
} else if (part.type === "reasoning-end") { } else if (part.type === "reasoning-end") {
process.stdout.write("\n\u001b[22m"); process.stdout.write("\n\u001b[22m");
await moveCursor(0, -lineCount - 2);
await clearScreenDown();
lineCount = 0;
charsSinceNL = 0;
} else if (part.type === "text-start") { } else if (part.type === "text-start") {
process.stdout.write("\n"); process.stdout.write("\n");
} else if (part.type === "text-delta") { } else if (part.type === "text-delta") {
process.stdout.write(part.text); process.stdout.write(part.text);
charsSinceNL += part.text.length;
if (part.text.includes("\n")) {
lineCount += part.text.match(/\n/g)?.length ?? 1;
charsSinceNL = 0;
} else if (charsSinceNL >= numColumns) {
lineCount++;
charsSinceNL = charsSinceNL - numColumns;
}
if (lineCount >= numRows / 2) {
await moveCursor(0, -lineCount);
await clearScreenDown();
lineCount = 0;
charsSinceNL = 0;
}
} else if (part.type === "text-end") { } else if (part.type === "text-end") {
process.stdout.write("\n"); await moveCursor(0, -lineCount - 1);
await clearScreenDown();
} }
} }
@ -34,3 +80,8 @@ const response = await text;
Bun.file("reasoning.md").write(reasoning ?? ""); Bun.file("reasoning.md").write(reasoning ?? "");
Bun.file("response.md").write(response); Bun.file("response.md").write(response);
Bun.spawnSync({
cmd: ["glow", "response.md"],
stdio: ["inherit", "inherit", "inherit"],
});