From 10253cfe3c13c8487908684c3297821fdc08868a Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 21:21:22 +0530 Subject: [PATCH 1/8] Fix image input in Chat UI and silence extension console errors --- core/nextEdit/DocumentHistoryTracker.ts | 12 +++++-- extensions/vscode/src/activation/activate.ts | 31 ++++++++++--------- .../mainInput/TipTapEditor/TipTapEditor.tsx | 16 +++++----- .../TipTapEditor/utils/editorConfig.ts | 5 +-- 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/core/nextEdit/DocumentHistoryTracker.ts b/core/nextEdit/DocumentHistoryTracker.ts index 7cca91f5653..cb65a4338c5 100644 --- a/core/nextEdit/DocumentHistoryTracker.ts +++ b/core/nextEdit/DocumentHistoryTracker.ts @@ -61,7 +61,9 @@ export class DocumentHistoryTracker { const documentHistory = this.documentContentHistoryMap.get(documentPath); if (!astHistory || !documentHistory) { - console.error(`Document ${documentPath} not found in AST tracker`); + if (!documentPath.endsWith(".yaml") && !documentPath.endsWith(".json") && !documentPath.endsWith(".md")) { + console.error(`Document ${documentPath} not found in AST tracker`); + } this.addDocument(documentPath, documentContent, ast); return; // Early return - document was added with initial state } @@ -82,7 +84,9 @@ export class DocumentHistoryTracker { const astHistory = this.documentAstMap.get(documentPath); if (!astHistory) { - console.error(`Document ${documentPath} not found in AST tracker`); + if (!documentPath.endsWith(".yaml") && !documentPath.endsWith(".json") && !documentPath.endsWith(".md")) { + console.error(`Document ${documentPath} not found in AST tracker`); + } return null; } if (astHistory.length === 0) { @@ -105,7 +109,9 @@ export class DocumentHistoryTracker { const documentHistory = this.documentContentHistoryMap.get(documentPath); if (!documentHistory) { - console.error(`Document ${documentPath} not found in AST tracker`); + if (!documentPath.endsWith(".yaml") && !documentPath.endsWith(".json") && !documentPath.endsWith(".md")) { + console.error(`Document ${documentPath} not found in AST tracker`); + } return null; } if (documentHistory.length === 0) { diff --git a/extensions/vscode/src/activation/activate.ts b/extensions/vscode/src/activation/activate.ts index 8aef69fdcf6..0f10f1297ae 100644 --- a/extensions/vscode/src/activation/activate.ts +++ b/extensions/vscode/src/activation/activate.ts @@ -48,20 +48,23 @@ export async function activateExtension(context: vscode.ExtensionContext) { "config-yaml-schema.json", ).toString(); - try { - await yamlConfig.update( - "schemas", - { - ...yamlSchemas, - [newPath]: [yamlMatcher], - }, - vscode.ConfigurationTarget.Global, - ); - } catch (error) { - console.error( - "Failed to register Continue config.yaml schema, most likely, YAML extension is not installed", - error, - ); + const yamlExtension = vscode.extensions.getExtension("redhat.vscode-yaml"); + if (yamlExtension) { + try { + await yamlConfig.update( + "schemas", + { + ...yamlSchemas, + [newPath]: [yamlMatcher], + }, + vscode.ConfigurationTarget.Global, + ); + } catch (error) { + console.error( + "Failed to register Continue config.yaml schema", + error, + ); + } } const api = new VsCodeContinueApi(vscodeExtension); diff --git a/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx b/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx index c19ae0af242..a9647dec3b1 100644 --- a/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx +++ b/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx @@ -255,10 +255,10 @@ function TipTapEditorInner(props: TipTapEditorProps) { } if (result) { const [_, dataUrl] = result; - const { schema } = editor.state; - const node = schema.nodes.image.create({ src: dataUrl }); - const tr = editor.state.tr.insert(0, node); - editor.view.dispatch(tr); + editor.commands.insertContent({ + type: "image", + attrs: { src: dataUrl } + }); } }); event.preventDefault(); @@ -287,11 +287,9 @@ function TipTapEditorInner(props: TipTapEditorProps) { } if (result) { const [_, dataUrl] = result; - const { schema } = editor.state; - const node = schema.nodes.image.create({ src: dataUrl }); - editor.commands.command(({ tr }) => { - tr.insert(0, node); - return true; + editor.commands.insertContent({ + type: "image", + attrs: { src: dataUrl } }); } }); diff --git a/gui/src/components/mainInput/TipTapEditor/utils/editorConfig.ts b/gui/src/components/mainInput/TipTapEditor/utils/editorConfig.ts index 3a79c07b83a..ddfc5b0d0bb 100644 --- a/gui/src/components/mainInput/TipTapEditor/utils/editorConfig.ts +++ b/gui/src/components/mainInput/TipTapEditor/utils/editorConfig.ts @@ -161,7 +161,8 @@ export function createEditorConfig(options: { if (!model) return; const items = event.clipboardData?.items; if (items) { - for (const item of items) { + for (let i = 0; i < items.length; i++) { + const item = items[i]; const file = item.getAsFile(); file && modelSupportsImages( @@ -178,7 +179,7 @@ export function createEditorConfig(options: { const node = schema.nodes.image.create({ src: dataUrl, }); - const tr = view.state.tr.insert(0, node); + const tr = view.state.tr.replaceSelectionWith(node); view.dispatch(tr); }, ); From 757524370bb0281657a08dca5ac703164721ce91 Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 21:30:21 +0530 Subject: [PATCH 2/8] style: Apply prettier formatting to fix CI checks --- core/nextEdit/DocumentHistoryTracker.ts | 18 +++++++++++++++--- extensions/vscode/src/activation/activate.ts | 5 +---- .../mainInput/TipTapEditor/TipTapEditor.tsx | 4 ++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/core/nextEdit/DocumentHistoryTracker.ts b/core/nextEdit/DocumentHistoryTracker.ts index cb65a4338c5..5049be86e3e 100644 --- a/core/nextEdit/DocumentHistoryTracker.ts +++ b/core/nextEdit/DocumentHistoryTracker.ts @@ -61,7 +61,11 @@ export class DocumentHistoryTracker { const documentHistory = this.documentContentHistoryMap.get(documentPath); if (!astHistory || !documentHistory) { - if (!documentPath.endsWith(".yaml") && !documentPath.endsWith(".json") && !documentPath.endsWith(".md")) { + if ( + !documentPath.endsWith(".yaml") && + !documentPath.endsWith(".json") && + !documentPath.endsWith(".md") + ) { console.error(`Document ${documentPath} not found in AST tracker`); } this.addDocument(documentPath, documentContent, ast); @@ -84,7 +88,11 @@ export class DocumentHistoryTracker { const astHistory = this.documentAstMap.get(documentPath); if (!astHistory) { - if (!documentPath.endsWith(".yaml") && !documentPath.endsWith(".json") && !documentPath.endsWith(".md")) { + if ( + !documentPath.endsWith(".yaml") && + !documentPath.endsWith(".json") && + !documentPath.endsWith(".md") + ) { console.error(`Document ${documentPath} not found in AST tracker`); } return null; @@ -109,7 +117,11 @@ export class DocumentHistoryTracker { const documentHistory = this.documentContentHistoryMap.get(documentPath); if (!documentHistory) { - if (!documentPath.endsWith(".yaml") && !documentPath.endsWith(".json") && !documentPath.endsWith(".md")) { + if ( + !documentPath.endsWith(".yaml") && + !documentPath.endsWith(".json") && + !documentPath.endsWith(".md") + ) { console.error(`Document ${documentPath} not found in AST tracker`); } return null; diff --git a/extensions/vscode/src/activation/activate.ts b/extensions/vscode/src/activation/activate.ts index 0f10f1297ae..48a562381b1 100644 --- a/extensions/vscode/src/activation/activate.ts +++ b/extensions/vscode/src/activation/activate.ts @@ -60,10 +60,7 @@ export async function activateExtension(context: vscode.ExtensionContext) { vscode.ConfigurationTarget.Global, ); } catch (error) { - console.error( - "Failed to register Continue config.yaml schema", - error, - ); + console.error("Failed to register Continue config.yaml schema", error); } } diff --git a/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx b/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx index a9647dec3b1..76b2e78360d 100644 --- a/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx +++ b/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx @@ -257,7 +257,7 @@ function TipTapEditorInner(props: TipTapEditorProps) { const [_, dataUrl] = result; editor.commands.insertContent({ type: "image", - attrs: { src: dataUrl } + attrs: { src: dataUrl }, }); } }); @@ -289,7 +289,7 @@ function TipTapEditorInner(props: TipTapEditorProps) { const [_, dataUrl] = result; editor.commands.insertContent({ type: "image", - attrs: { src: dataUrl } + attrs: { src: dataUrl }, }); } }); From 3ee98939f5b6179e34ec8dd1536293f779979065 Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 21:41:54 +0530 Subject: [PATCH 3/8] fix: address Copilot review comments (chain focus, add .yml) --- core/nextEdit/DocumentHistoryTracker.ts | 24 ++++++++++++------- .../mainInput/TipTapEditor/TipTapEditor.tsx | 24 ++++++++++++------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/core/nextEdit/DocumentHistoryTracker.ts b/core/nextEdit/DocumentHistoryTracker.ts index 5049be86e3e..5cae278ffad 100644 --- a/core/nextEdit/DocumentHistoryTracker.ts +++ b/core/nextEdit/DocumentHistoryTracker.ts @@ -61,10 +61,12 @@ export class DocumentHistoryTracker { const documentHistory = this.documentContentHistoryMap.get(documentPath); if (!astHistory || !documentHistory) { + const lowerPath = documentPath.toLowerCase(); if ( - !documentPath.endsWith(".yaml") && - !documentPath.endsWith(".json") && - !documentPath.endsWith(".md") + !lowerPath.endsWith(".yaml") && + !lowerPath.endsWith(".yml") && + !lowerPath.endsWith(".json") && + !lowerPath.endsWith(".md") ) { console.error(`Document ${documentPath} not found in AST tracker`); } @@ -88,10 +90,12 @@ export class DocumentHistoryTracker { const astHistory = this.documentAstMap.get(documentPath); if (!astHistory) { + const lowerPath = documentPath.toLowerCase(); if ( - !documentPath.endsWith(".yaml") && - !documentPath.endsWith(".json") && - !documentPath.endsWith(".md") + !lowerPath.endsWith(".yaml") && + !lowerPath.endsWith(".yml") && + !lowerPath.endsWith(".json") && + !lowerPath.endsWith(".md") ) { console.error(`Document ${documentPath} not found in AST tracker`); } @@ -117,10 +121,12 @@ export class DocumentHistoryTracker { const documentHistory = this.documentContentHistoryMap.get(documentPath); if (!documentHistory) { + const lowerPath = documentPath.toLowerCase(); if ( - !documentPath.endsWith(".yaml") && - !documentPath.endsWith(".json") && - !documentPath.endsWith(".md") + !lowerPath.endsWith(".yaml") && + !lowerPath.endsWith(".yml") && + !lowerPath.endsWith(".json") && + !lowerPath.endsWith(".md") ) { console.error(`Document ${documentPath} not found in AST tracker`); } diff --git a/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx b/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx index 76b2e78360d..2c82bd2ba00 100644 --- a/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx +++ b/gui/src/components/mainInput/TipTapEditor/TipTapEditor.tsx @@ -255,10 +255,14 @@ function TipTapEditorInner(props: TipTapEditorProps) { } if (result) { const [_, dataUrl] = result; - editor.commands.insertContent({ - type: "image", - attrs: { src: dataUrl }, - }); + editor + .chain() + .focus() + .insertContent({ + type: "image", + attrs: { src: dataUrl }, + }) + .run(); } }); event.preventDefault(); @@ -287,10 +291,14 @@ function TipTapEditorInner(props: TipTapEditorProps) { } if (result) { const [_, dataUrl] = result; - editor.commands.insertContent({ - type: "image", - attrs: { src: dataUrl }, - }); + editor + .chain() + .focus() + .insertContent({ + type: "image", + attrs: { src: dataUrl }, + }) + .run(); } }); }} From 42fdec02f2e56717b1626cd711b1fd8154d7e76c Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 21:49:35 +0530 Subject: [PATCH 4/8] test: stabilize Autocomplete test and add debug context --- .../continueintellijextension/Autocomplete.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt index beca6683933..b21da7010a7 100644 --- a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt +++ b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt @@ -35,11 +35,18 @@ class Autocomplete { enterText("TEST_USER_MESSAGE_0") space() } - wait(2.seconds) + wait(5.seconds) keyboard { tab() } - assertTrue(text.contains("TEST_LLM_RESPONSE_0")) + var attempts = 0 + while (!text.contains("TEST_LLM_RESPONSE_0") && attempts < 10) { + wait(1.seconds) + attempts++ + } + assertTrue(text.contains("TEST_LLM_RESPONSE_0")) { + "Autocomplete mismatch.\nEditor=${text.take(500)}" + } } } } From c532d0f0446993f2fa418a183f9fd349de103a2b Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 22:02:52 +0530 Subject: [PATCH 5/8] test: use retry loop in Autocomplete test --- .../continueintellijextension/Autocomplete.kt | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt index b21da7010a7..9876e114738 100644 --- a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt +++ b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt @@ -31,20 +31,25 @@ class Autocomplete { clickTab("Main.java") } codeEditor { - keyboard { - enterText("TEST_USER_MESSAGE_0") - space() + var success = false + for (i in 1..10) { + keyboard { + enterText("TEST_USER_MESSAGE_0") + space() + } + wait(2.seconds) + keyboard { + tab() + } + if (text.contains("TEST_LLM_RESPONSE_0")) { + success = true + break + } + keyboard { + enter() + } } - wait(5.seconds) - keyboard { - tab() - } - var attempts = 0 - while (!text.contains("TEST_LLM_RESPONSE_0") && attempts < 10) { - wait(1.seconds) - attempts++ - } - assertTrue(text.contains("TEST_LLM_RESPONSE_0")) { + assertTrue(success) { "Autocomplete mismatch.\nEditor=${text.take(500)}" } } From 6424e05dcfef740eda28fab34c8b69c2c100822e Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 22:18:35 +0530 Subject: [PATCH 6/8] test: add explicit exception for debugging and clean start line --- .../continueintellijextension/Autocomplete.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt index 9876e114738..4d388dfddb5 100644 --- a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt +++ b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt @@ -31,6 +31,13 @@ class Autocomplete { clickTab("Main.java") } codeEditor { + keyboard { + escape() // close any popups + pageDown() + pageDown() + end() + enter() + } var success = false for (i in 1..10) { keyboard { @@ -49,8 +56,8 @@ class Autocomplete { enter() } } - assertTrue(success) { - "Autocomplete mismatch.\nEditor=${text.take(500)}" + if (!success) { + throw Exception("DEBUG_TEXT: ${text.take(500)}") } } } From c0be23d219331cff66460cc39a9788ec4209a058 Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 22:30:43 +0530 Subject: [PATCH 7/8] test: fix unused import breaking kotlin compilation --- .../github/continuedev/continueintellijextension/Autocomplete.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt index 4d388dfddb5..329b730ab1b 100644 --- a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt +++ b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt @@ -10,7 +10,6 @@ import com.intellij.ide.starter.plugins.PluginConfigurator import com.intellij.ide.starter.project.NoProject import com.intellij.ide.starter.runner.Starter import org.junit.jupiter.api.Test -import org.junit.jupiter.api.Assertions.assertTrue import java.io.File import kotlin.time.Duration.Companion.seconds From 813b5d7375e01e0535445685fde2cd1117841806 Mon Sep 17 00:00:00 2001 From: Arnav Garg Date: Tue, 23 Jun 2026 22:42:53 +0530 Subject: [PATCH 8/8] test: use enter keys instead of unresolved SDK commands for clean line --- .../continuedev/continueintellijextension/Autocomplete.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt index 329b730ab1b..1a6d74e75b9 100644 --- a/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt +++ b/extensions/intellij/src/testIntegration/kotlin/com/github/continuedev/continueintellijextension/Autocomplete.kt @@ -32,9 +32,8 @@ class Autocomplete { codeEditor { keyboard { escape() // close any popups - pageDown() - pageDown() - end() + enter() + enter() enter() } var success = false