diff --git a/eslint.config.mjs b/eslint.config.mjs index 0f7fb55..8bb04cf 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -114,6 +114,7 @@ export default tseslint.config( renderTable: "writable", renderTextBlock: "writable", renderThinkingText: "writable", + renderedAssistantText: "writable", renderToolCall: "writable", resolveAsideTurn: "writable", resolveToolResult: "writable", @@ -141,6 +142,7 @@ export default tseslint.config( thinkingStartedAt: "writable", thinkingTimer: "writable", toolIcon: "writable", + turnEndSeen: "writable", updateCommandMenu: "writable", vscode: "writable", }, diff --git a/media/app.js b/media/app.js index 0727c9d..8a1b592 100644 --- a/media/app.js +++ b/media/app.js @@ -76,11 +76,26 @@ window.addEventListener("message", (event) => { case "retry": addSystemNote("Retrying (" + message.attempt + "/3) — " + message.error, true); break; - case "done": - finishAssistantTurn(turnEndSeen ? undefined : message.text); + case "done": { + let fallback = message.text; + if (turnEndSeen) { + if (message.text.startsWith(renderedAssistantText)) { + const remainder = message.text.slice(renderedAssistantText.length); + fallback = remainder.trim() ? remainder : ""; + } else { + console.warn( + "[vscodeloop] done: text/renderedAssistantText mismatch — using full text as fallback", + { textLen: message.text.length, renderedLen: renderedAssistantText.length } + ); + fallback = message.text; + } + } + finishAssistantTurn(fallback || undefined); turnEndSeen = false; + renderedAssistantText = ""; setBusy(false); break; + } case "error": finishAssistantTurn(); addErrorNote(message.message); diff --git a/media/chat-turns.js b/media/chat-turns.js index 3ef6cad..7d36397 100644 --- a/media/chat-turns.js +++ b/media/chat-turns.js @@ -244,6 +244,9 @@ function finishAssistantTurn(fallbackText) { } else if (!assistantTurn.rawText.trim()) { assistantTurn.turnEl.remove(); } + if (assistantTurn && assistantTurn.rawText) { + renderedAssistantText += assistantTurn.rawText; + } assistantTurn = null; } diff --git a/media/composer.js b/media/composer.js index 8189a69..1115ec2 100644 --- a/media/composer.js +++ b/media/composer.js @@ -66,6 +66,7 @@ function send() { renderAttachmentsPreview(); assistantTurn = null; turnEndSeen = false; + renderedAssistantText = ""; setBusy(true); showThinkingIndicator(); vscode.postMessage({ type: "sendPrompt", prompt, images }); diff --git a/media/dom.js b/media/dom.js index b07ba02..a539481 100644 --- a/media/dom.js +++ b/media/dom.js @@ -54,6 +54,7 @@ const sessionGalleryNew = document.getElementById("session-gallery-new"); let assistantTurn = null; let pendingAssistantText = ""; let turnEndSeen = false; +let renderedAssistantText = ""; let isBusy = false; const pendingToolCards = new Map(); let currentModel = "";