From 44f3df8b895d97ff9aa4f5cbeb96174592a41dcd Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 14:26:04 +0100 Subject: [PATCH 1/8] Revert PR #3533 and fix SQLite bundling This commit reverts PR #3533 which disabled NewAutocompleteProvider due to SQLite bundling issues. The proper fix is to bundle SQLite native binaries following Continue's approach. Changes: - Restored NewAutocompleteProvider in GhostServiceManager.ts - Added .node loader to esbuild.mjs to handle native binary modules - Added build step to copy sqlite3 and sqlite modules to dist/node_modules/ - Updated .vscodeignore to include SQLite modules in VSIX package - Fixed sqlite3 mock in AutocompleteLruCache.spec.ts to include default export The extension will now properly load SQLite at runtime from the bundled node_modules, allowing NewAutocompleteProvider to work in production. --- src/.vscodeignore | 4 +++ src/esbuild.mjs | 43 +++++++++++++++++++++++ src/services/ghost/GhostServiceManager.ts | 28 +++++++-------- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/.vscodeignore b/src/.vscodeignore index 9695b185a62..4e0004b1cd9 100644 --- a/src/.vscodeignore +++ b/src/.vscodeignore @@ -13,6 +13,10 @@ # Include the built extension !dist +# Include sqlite3 and sqlite native bindings +!dist/node_modules/sqlite3/** +!dist/node_modules/sqlite/** + # Include the built webview !**/*.map !webview-ui/audio diff --git a/src/esbuild.mjs b/src/esbuild.mjs index 24ab512dcd2..e68fcc1cfc9 100644 --- a/src/esbuild.mjs +++ b/src/esbuild.mjs @@ -29,6 +29,9 @@ async function main() { format: "cjs", sourcesContent: false, platform: "node", + loader: { + ".node": "file", + }, } const srcDir = __dirname @@ -67,6 +70,46 @@ async function main() { // Copy tree-sitter files to dist directory copyPaths([["services/continuedev/tree-sitter", "tree-sitter"]], srcDir, distDir) + // Copy sqlite3 and sqlite native bindings to dist directory + // This is necessary because they are marked as external in esbuild + // and contain platform-specific .node binaries that must be included + const sqlite3Source = path.join( + srcDir, + "../node_modules/.pnpm/sqlite3@5.1.7/node_modules/sqlite3", + ) + const sqlite3Dest = path.join(distDir, "node_modules/sqlite3") + + const sqliteSource = path.join( + srcDir, + "../node_modules/.pnpm/sqlite@5.1.1/node_modules/sqlite", + ) + const sqliteDest = path.join(distDir, "node_modules/sqlite") + + if (fs.existsSync(sqlite3Source)) { + try { + // Copy the entire sqlite3 module to preserve directory structure + // This includes build/Release/node_sqlite3.node and package.json + fs.cpSync(sqlite3Source, sqlite3Dest, { recursive: true }) + console.log(`[${name}] Copied sqlite3 bindings to dist/node_modules/sqlite3`) + } catch (err) { + console.error(`[${name}] Failed to copy sqlite3 bindings:`, err) + } + } else { + console.warn(`[${name}] sqlite3 source not found at: ${sqlite3Source}`) + } + + if (fs.existsSync(sqliteSource)) { + try { + // Copy the sqlite wrapper module + fs.cpSync(sqliteSource, sqliteDest, { recursive: true }) + console.log(`[${name}] Copied sqlite wrapper to dist/node_modules/sqlite`) + } catch (err) { + console.error(`[${name}] Failed to copy sqlite wrapper:`, err) + } + } else { + console.warn(`[${name}] sqlite source not found at: ${sqliteSource}`) + } + // Copy JSDOM xhr-sync-worker.js to fix runtime resolution const jsdomWorkerDest = path.join(distDir, "xhr-sync-worker.js") diff --git a/src/services/ghost/GhostServiceManager.ts b/src/services/ghost/GhostServiceManager.ts index 0c30be50ffc..603632f1e85 100644 --- a/src/services/ghost/GhostServiceManager.ts +++ b/src/services/ghost/GhostServiceManager.ts @@ -6,7 +6,7 @@ import { GhostModel } from "./GhostModel" import { GhostStatusBar } from "./GhostStatusBar" import { GhostCodeActionProvider } from "./GhostCodeActionProvider" import { GhostInlineCompletionProvider } from "./classic-auto-complete/GhostInlineCompletionProvider" -//import { NewAutocompleteProvider } from "./new-auto-complete/NewAutocompleteProvider" +import { NewAutocompleteProvider } from "./new-auto-complete/NewAutocompleteProvider" import { GhostServiceSettings, TelemetryEventName } from "@roo-code/types" import { ContextProxy } from "../../core/config/ContextProxy" import { ProviderSettingsManager } from "../../core/config/ProviderSettingsManager" @@ -36,7 +36,7 @@ export class GhostServiceManager { // VSCode Providers public codeActionProvider: GhostCodeActionProvider public inlineCompletionProvider: GhostInlineCompletionProvider - //private newAutocompleteProvider: NewAutocompleteProvider | null = null + private newAutocompleteProvider: NewAutocompleteProvider | null = null private inlineCompletionProviderDisposable: vscode.Disposable | null = null private ignoreController?: Promise @@ -126,18 +126,18 @@ export class GhostServiceManager { } // Dispose new autocomplete provider if switching away from it - //if (!useNewAutocomplete && this.newAutocompleteProvider) { - // this.newAutocompleteProvider.dispose() - // this.newAutocompleteProvider = null - //} + if (!useNewAutocomplete && this.newAutocompleteProvider) { + this.newAutocompleteProvider.dispose() + this.newAutocompleteProvider = null + } if (shouldBeRegistered) { if (useNewAutocomplete) { // Initialize new autocomplete provider if not already created - //if (!this.newAutocompleteProvider) { - // this.newAutocompleteProvider = new NewAutocompleteProvider(this.context, this.cline) - // await this.newAutocompleteProvider.load() - //} + if (!this.newAutocompleteProvider) { + this.newAutocompleteProvider = new NewAutocompleteProvider(this.context, this.cline) + await this.newAutocompleteProvider.load() + } // New autocomplete provider registers itself internally } else { // Register classic provider @@ -458,10 +458,10 @@ export class GhostServiceManager { } // Dispose new autocomplete provider if it exists - //if (this.newAutocompleteProvider) { - // this.newAutocompleteProvider.dispose() - // this.newAutocompleteProvider = null - //} + if (this.newAutocompleteProvider) { + this.newAutocompleteProvider.dispose() + this.newAutocompleteProvider = null + } this.disposeIgnoreController() From db8025bf2565cc313809c65e32c042852f755e69 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 15:36:34 +0100 Subject: [PATCH 2/8] also add bindings --- src/esbuild.mjs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/esbuild.mjs b/src/esbuild.mjs index e68fcc1cfc9..63ebbc0e865 100644 --- a/src/esbuild.mjs +++ b/src/esbuild.mjs @@ -110,6 +110,43 @@ async function main() { console.warn(`[${name}] sqlite source not found at: ${sqliteSource}`) } + // Copy bindings package (required by sqlite3) + // Find bindings package dynamically to avoid hardcoding version + let bindingsSource = null + try { + const require = createRequire(import.meta.url) + const bindingsModulePath = require.resolve("bindings/package.json") + bindingsSource = path.dirname(bindingsModulePath) + } catch (err) { + // Fallback: try to find it in pnpm structure by searching for bindings directories + const pnpmDir = path.join(srcDir, "../node_modules/.pnpm") + if (fs.existsSync(pnpmDir)) { + const entries = fs.readdirSync(pnpmDir) + for (const entry of entries) { + if (entry.startsWith("bindings@")) { + const bindingsPath = path.join(pnpmDir, entry, "node_modules/bindings") + if (fs.existsSync(bindingsPath)) { + bindingsSource = bindingsPath + break + } + } + } + } + } + + const bindingsDest = path.join(distDir, "node_modules/bindings") + + if (bindingsSource && fs.existsSync(bindingsSource)) { + try { + fs.cpSync(bindingsSource, bindingsDest, { recursive: true }) + console.log(`[${name}] Copied bindings package to dist/node_modules/bindings`) + } catch (err) { + console.error(`[${name}] Failed to copy bindings package:`, err) + } + } else { + console.warn(`[${name}] bindings source not found`) + } + // Copy JSDOM xhr-sync-worker.js to fix runtime resolution const jsdomWorkerDest = path.join(distDir, "xhr-sync-worker.js") From f17bf9a8b9c183c1c550a17bd4b1a10dc510b087 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 15:54:13 +0100 Subject: [PATCH 3/8] fix --- src/esbuild.mjs | 67 ++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/src/esbuild.mjs b/src/esbuild.mjs index 63ebbc0e865..cda6779aadf 100644 --- a/src/esbuild.mjs +++ b/src/esbuild.mjs @@ -110,43 +110,52 @@ async function main() { console.warn(`[${name}] sqlite source not found at: ${sqliteSource}`) } - // Copy bindings package (required by sqlite3) - // Find bindings package dynamically to avoid hardcoding version - let bindingsSource = null - try { - const require = createRequire(import.meta.url) - const bindingsModulePath = require.resolve("bindings/package.json") - bindingsSource = path.dirname(bindingsModulePath) - } catch (err) { - // Fallback: try to find it in pnpm structure by searching for bindings directories - const pnpmDir = path.join(srcDir, "../node_modules/.pnpm") - if (fs.existsSync(pnpmDir)) { - const entries = fs.readdirSync(pnpmDir) - for (const entry of entries) { - if (entry.startsWith("bindings@")) { - const bindingsPath = path.join(pnpmDir, entry, "node_modules/bindings") - if (fs.existsSync(bindingsPath)) { - bindingsSource = bindingsPath - break + // Helper function to find and copy a package + const copyPackage = (packageName) => { + let packageSource = null + try { + const require = createRequire(import.meta.url) + const packagePath = require.resolve(`${packageName}/package.json`) + packageSource = path.dirname(packagePath) + } catch (err) { + // Fallback: try to find it in pnpm structure + const pnpmDir = path.join(srcDir, "../node_modules/.pnpm") + if (fs.existsSync(pnpmDir)) { + const entries = fs.readdirSync(pnpmDir) + for (const entry of entries) { + if (entry.startsWith(`${packageName}@`)) { + const packagePath = path.join(pnpmDir, entry, "node_modules", packageName) + if (fs.existsSync(packagePath)) { + packageSource = packagePath + break + } } } } } - } - - const bindingsDest = path.join(distDir, "node_modules/bindings") - if (bindingsSource && fs.existsSync(bindingsSource)) { - try { - fs.cpSync(bindingsSource, bindingsDest, { recursive: true }) - console.log(`[${name}] Copied bindings package to dist/node_modules/bindings`) - } catch (err) { - console.error(`[${name}] Failed to copy bindings package:`, err) + if (packageSource && fs.existsSync(packageSource)) { + const packageDest = path.join(distDir, "node_modules", packageName) + try { + fs.cpSync(packageSource, packageDest, { recursive: true }) + console.log(`[${name}] Copied ${packageName} package to dist/node_modules/${packageName}`) + return true + } catch (err) { + console.error(`[${name}] Failed to copy ${packageName} package:`, err) + return false + } + } else { + console.warn(`[${name}] ${packageName} source not found`) + return false } - } else { - console.warn(`[${name}] bindings source not found`) } + // Copy bindings package (required by sqlite3) + copyPackage("bindings") + + // Copy file-uri-to-path (required by bindings) + copyPackage("file-uri-to-path") + // Copy JSDOM xhr-sync-worker.js to fix runtime resolution const jsdomWorkerDest = path.join(distDir, "xhr-sync-worker.js") From e5d2b687dc0da47f122aaf56f302d68de6e1fb8f Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 16:03:55 +0100 Subject: [PATCH 4/8] add debug --- .../src/components/kilocode/settings/GhostServiceSettings.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx b/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx index f51093b3831..b7207200584 100644 --- a/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx +++ b/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx @@ -75,6 +75,7 @@ export const GhostServiceSettingsView = ({
{t("kilocode:ghost.title")}
+ IK BEN MARK
From 41287f98fc16df164a788c1616bb87e230e5d103 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 16:26:33 +0100 Subject: [PATCH 5/8] simplify --- src/esbuild.mjs | 47 +++++++---------------------------------------- 1 file changed, 7 insertions(+), 40 deletions(-) diff --git a/src/esbuild.mjs b/src/esbuild.mjs index cda6779aadf..abb9d07a005 100644 --- a/src/esbuild.mjs +++ b/src/esbuild.mjs @@ -70,47 +70,8 @@ async function main() { // Copy tree-sitter files to dist directory copyPaths([["services/continuedev/tree-sitter", "tree-sitter"]], srcDir, distDir) - // Copy sqlite3 and sqlite native bindings to dist directory - // This is necessary because they are marked as external in esbuild - // and contain platform-specific .node binaries that must be included - const sqlite3Source = path.join( - srcDir, - "../node_modules/.pnpm/sqlite3@5.1.7/node_modules/sqlite3", - ) - const sqlite3Dest = path.join(distDir, "node_modules/sqlite3") - - const sqliteSource = path.join( - srcDir, - "../node_modules/.pnpm/sqlite@5.1.1/node_modules/sqlite", - ) - const sqliteDest = path.join(distDir, "node_modules/sqlite") - - if (fs.existsSync(sqlite3Source)) { - try { - // Copy the entire sqlite3 module to preserve directory structure - // This includes build/Release/node_sqlite3.node and package.json - fs.cpSync(sqlite3Source, sqlite3Dest, { recursive: true }) - console.log(`[${name}] Copied sqlite3 bindings to dist/node_modules/sqlite3`) - } catch (err) { - console.error(`[${name}] Failed to copy sqlite3 bindings:`, err) - } - } else { - console.warn(`[${name}] sqlite3 source not found at: ${sqlite3Source}`) - } - - if (fs.existsSync(sqliteSource)) { - try { - // Copy the sqlite wrapper module - fs.cpSync(sqliteSource, sqliteDest, { recursive: true }) - console.log(`[${name}] Copied sqlite wrapper to dist/node_modules/sqlite`) - } catch (err) { - console.error(`[${name}] Failed to copy sqlite wrapper:`, err) - } - } else { - console.warn(`[${name}] sqlite source not found at: ${sqliteSource}`) - } - // Helper function to find and copy a package + // This dynamically resolves package locations to avoid hardcoded version numbers const copyPackage = (packageName) => { let packageSource = null try { @@ -150,6 +111,12 @@ async function main() { } } + // Copy sqlite3 and sqlite native bindings to dist directory + // This is necessary because they are marked as external in esbuild + // and contain platform-specific .node binaries that must be included + copyPackage("sqlite3") + copyPackage("sqlite") + // Copy bindings package (required by sqlite3) copyPackage("bindings") From ffa350cb24ace77b031f9a0bf5679cd0b349d3ca Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 16:27:02 +0100 Subject: [PATCH 6/8] update debug --- .../src/components/kilocode/settings/GhostServiceSettings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx b/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx index b7207200584..c618528e94e 100644 --- a/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx +++ b/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx @@ -75,7 +75,7 @@ export const GhostServiceSettingsView = ({
{t("kilocode:ghost.title")}
- IK BEN MARK + IK BEN MARK 2
From 341ba999f830627d7b444fb739fa7d07f2e6c1c9 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 16:47:23 +0100 Subject: [PATCH 7/8] begone --- src/.vscodeignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/.vscodeignore b/src/.vscodeignore index 4e0004b1cd9..9695b185a62 100644 --- a/src/.vscodeignore +++ b/src/.vscodeignore @@ -13,10 +13,6 @@ # Include the built extension !dist -# Include sqlite3 and sqlite native bindings -!dist/node_modules/sqlite3/** -!dist/node_modules/sqlite/** - # Include the built webview !**/*.map !webview-ui/audio From 7ea14057237bf7ae376594140de662dfdc2899ea Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 6 Nov 2025 16:47:40 +0100 Subject: [PATCH 8/8] update debug --- .../src/components/kilocode/settings/GhostServiceSettings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx b/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx index c618528e94e..8ee5fae749b 100644 --- a/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx +++ b/webview-ui/src/components/kilocode/settings/GhostServiceSettings.tsx @@ -75,7 +75,7 @@ export const GhostServiceSettingsView = ({
{t("kilocode:ghost.title")}
- IK BEN MARK 2 + IK BEN MARK 3