preserve thinking delta whitespace in runlog streaming

This commit is contained in:
Dotta
2026-03-05 09:25:03 -06:00
parent 34d9122b45
commit d37e1d3dc3
4 changed files with 20 additions and 7 deletions

View File

@@ -218,11 +218,13 @@ export function parseCursorStdoutLine(line: string, ts: string): TranscriptEntry
}
if (type === "thinking") {
const text = asString(parsed.text).trim() || asString(asRecord(parsed.delta)?.text).trim();
const textFromTopLevel = asString(parsed.text);
const textFromDelta = asString(asRecord(parsed.delta)?.text);
const text = textFromTopLevel.length > 0 ? textFromTopLevel : textFromDelta;
const subtype = asString(parsed.subtype).trim().toLowerCase();
const isDelta = subtype === "delta" || asRecord(parsed.delta) !== null;
if (!text) return [];
return [{ kind: "thinking", ts, text, ...(isDelta ? { delta: true } : {}) }];
if (!text.trim()) return [];
return [{ kind: "thinking", ts, text: isDelta ? text : text.trim(), ...(isDelta ? { delta: true } : {}) }];
}
if (type === "tool_call") {

View File

@@ -164,6 +164,17 @@ describe("cursor ui stdout parser", () => {
),
).toEqual([{ kind: "thinking", ts, text: "planning next command", delta: true }]);
expect(
parseCursorStdoutLine(
JSON.stringify({
type: "thinking",
subtype: "delta",
text: " with preserved leading space",
}),
ts,
),
).toEqual([{ kind: "thinking", ts, text: " with preserved leading space", delta: true }]);
expect(
parseCursorStdoutLine(
JSON.stringify({

View File

@@ -100,8 +100,8 @@ function parseStdoutChunk(
const summarized: Array<{ text: string; tone: FeedTone; thinkingDelta?: boolean }> = [];
const appendSummary = (entry: TranscriptEntry) => {
if (entry.kind === "thinking" && entry.delta) {
const text = entry.text.trim();
if (!text) return;
const text = entry.text;
if (!text.trim()) return;
const last = summarized[summarized.length - 1];
if (last && last.thinkingDelta) {
last.text += text;

View File

@@ -111,8 +111,8 @@ function parseStdoutChunk(
const summarized: Array<{ text: string; tone: FeedTone; thinkingDelta?: boolean }> = [];
const appendSummary = (entry: TranscriptEntry) => {
if (entry.kind === "thinking" && entry.delta) {
const text = entry.text.trim();
if (!text) return;
const text = entry.text;
if (!text.trim()) return;
const last = summarized[summarized.length - 1];
if (last && last.thinkingDelta) {
last.text += text;