From 56f2b972f00ff34e3490803f4c37ba384ebc6340 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Mon, 3 Aug 2026 23:38:01 +0300 Subject: [PATCH] chore(deps): drop better-sqlite3 and its desktop packaging support The SQLite write into OpenCode's database was the only consumer of better-sqlite3 in the repository. Everything that existed to ship its native binary went with it: - the dependency in @openchamber/web and @openchamber/electron - the afterPack hook staging better_sqlite3.node into app.asar.unpacked - a dedicated @electron/rebuild pass (onlyModules) and its binary assertion, so desktop packaging now runs one native rebuild instead of two - the bundler external entry and the AppImage required-native-module check Desktop packaging, the AppImage verification tests, and the extension bundle were re-validated after a clean reinstall, so no stale module could satisfy a missed import. --- .github/workflows/release.yml | 4 ++-- bun.lock | 8 -------- packages/electron/README.md | 2 +- packages/electron/package.json | 1 - packages/electron/scripts/after-pack.cjs | 17 ----------------- packages/electron/scripts/bundle-main.mjs | 1 - packages/electron/scripts/rebuild-native.mjs | 13 ------------- .../electron/scripts/verify-linux-appimage.mjs | 2 +- .../scripts/verify-linux-appimage.test.mjs | 4 ++-- packages/web/package.json | 1 - 10 files changed, 6 insertions(+), 47 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 47dbb0c5..28a3afc8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -204,8 +204,8 @@ jobs: bun run bundle:main # npmRebuild=false in package.json, so electron-builder won't # recompile native deps on its own — we must rebuild against the - # target Electron ABI before packaging, otherwise better-sqlite3/ - # node-pty/bun-pty crash on require inside the packaged app. + # target Electron ABI before packaging, otherwise node-pty/bun-pty + # crash on require inside the packaged app. bun run rebuild:native bunx electron-builder --mac --${{ matrix.arch }} --publish=never bun run verify:opencode-cli:packaged diff --git a/bun.lock b/bun.lock index 2209fc6d..370b1124 100644 --- a/bun.lock +++ b/bun.lock @@ -98,7 +98,6 @@ "version": "1.17.2", "dependencies": { "@openchamber/web": "workspace:*", - "better-sqlite3": "^12.10.0", "electron-context-menu": "^4.1.2", "electron-log": "^5.4.3", "electron-updater": "^6.8.3", @@ -270,7 +269,6 @@ "@opencode-ai/sdk": "1.18.11", "@simplewebauthn/server": "13.3.1", "adm-zip": "^0.5.16", - "better-sqlite3": "^12.10.0", "bun-pty": "^0.4.5", "compression": "^1.8.1", "cron-parser": "^4.9.0", @@ -1583,16 +1581,12 @@ "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], - "better-sqlite3": ["better-sqlite3@12.10.0", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ=="], - "big-integer": ["big-integer@1.6.52", "", {}, "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "binaryextensions": ["binaryextensions@6.11.0", "", { "dependencies": { "editions": "^6.21.0" } }, "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw=="], - "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], - "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], "bn.js": ["bn.js@4.12.3", "", {}, "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g=="], @@ -2005,8 +1999,6 @@ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], - "filelist": ["filelist@1.0.6", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], diff --git a/packages/electron/README.md b/packages/electron/README.md index 45722457..a2d4924e 100644 --- a/packages/electron/README.md +++ b/packages/electron/README.md @@ -67,7 +67,7 @@ That runs, in order: 2. `prepare:opencode-cli` to download/cache the pinned OpenCode CLI and copy it into `packages/electron/resources/opencode-cli`. 3. `bundle:main` to create `packages/electron/dist-bundle/main.mjs`. 4. `rebuild:native` to rebuild native modules for Electron. -5. `package.mjs` to run `electron-builder`; its `afterPack` hook stages the rebuilt `better-sqlite3` binary that Electron Builder's Bun dependency collector otherwise omits. +5. `package.mjs` to run `electron-builder`; its `afterPack` hook stages the compiled macOS icon asset catalog. Build output goes to `packages/electron/dist`. diff --git a/packages/electron/package.json b/packages/electron/package.json index 1ba7d13b..28755e6d 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -8,7 +8,6 @@ "main": "./dist-bundle/main.mjs", "dependencies": { "@openchamber/web": "workspace:*", - "better-sqlite3": "^12.10.0", "electron-context-menu": "^4.1.2", "electron-log": "^5.4.3", "electron-updater": "^6.8.3" diff --git a/packages/electron/scripts/after-pack.cjs b/packages/electron/scripts/after-pack.cjs index 542ea614..22b43ba3 100644 --- a/packages/electron/scripts/after-pack.cjs +++ b/packages/electron/scripts/after-pack.cjs @@ -5,23 +5,6 @@ module.exports = (context) => { const resourcesPath = context.electronPlatformName === 'darwin' ? path.join(context.appOutDir, `${context.packager.appInfo.productFilename}.app`, 'Contents', 'Resources') : path.join(context.appOutDir, 'resources'); - const betterSqliteDir = path.dirname(require.resolve('better-sqlite3/package.json')); - const betterSqliteBinary = path.join(betterSqliteDir, 'build', 'Release', 'better_sqlite3.node'); - if (!fs.existsSync(betterSqliteBinary)) { - throw new Error(`Missing rebuilt better-sqlite3 binary at ${betterSqliteBinary}`); - } - const packagedBetterSqliteBinary = path.join( - resourcesPath, - 'app.asar.unpacked', - 'node_modules', - 'better-sqlite3', - 'build', - 'Release', - 'better_sqlite3.node', - ); - fs.mkdirSync(path.dirname(packagedBetterSqliteBinary), { recursive: true }); - fs.copyFileSync(betterSqliteBinary, packagedBetterSqliteBinary); - if (context.electronPlatformName !== 'darwin') return; const sourceAssetsPath = path.join(__dirname, '..', 'resources', 'icons', 'Assets.car'); diff --git a/packages/electron/scripts/bundle-main.mjs b/packages/electron/scripts/bundle-main.mjs index 1c867134..5d925d9c 100644 --- a/packages/electron/scripts/bundle-main.mjs +++ b/packages/electron/scripts/bundle-main.mjs @@ -30,7 +30,6 @@ const result = await Bun.build({ '@openchamber/web/*', 'bun-pty', 'node-pty', - 'better-sqlite3', ], minify: false, sourcemap: 'none', diff --git a/packages/electron/scripts/rebuild-native.mjs b/packages/electron/scripts/rebuild-native.mjs index 47039cc5..f57ee368 100644 --- a/packages/electron/scripts/rebuild-native.mjs +++ b/packages/electron/scripts/rebuild-native.mjs @@ -133,19 +133,6 @@ const ensureWindowsNodeAddonApiForNodePty = async (rebuildRootPath) => { console.log(`[electron] rebuilding native modules against Electron ${electronVersion}...`); -await rebuild({ - buildPath: electronDir, - electronVersion, - force: true, - arch: targetArchitecture.electronBuilder, - onlyModules: ['better-sqlite3'], -}); -const betterSqliteDir = path.dirname(require.resolve('better-sqlite3/package.json')); -const betterSqliteBinary = path.join(betterSqliteDir, 'build', 'Release', 'better_sqlite3.node'); -if (!existsSync(betterSqliteBinary)) { - throw new Error(`better-sqlite3 rebuild did not produce ${betterSqliteBinary}`); -} - // Rebuild against the hoisted root node_modules (bun workspace layout). // force=true re-links regardless of cached state; prebuild-install lookup is // bypassed by @electron/rebuild in favor of direct node-gyp builds. diff --git a/packages/electron/scripts/verify-linux-appimage.mjs b/packages/electron/scripts/verify-linux-appimage.mjs index 97da9a05..697f7882 100644 --- a/packages/electron/scripts/verify-linux-appimage.mjs +++ b/packages/electron/scripts/verify-linux-appimage.mjs @@ -13,7 +13,7 @@ const ELF_MACHINE = { x64: 62, arm64: 183 }; // sherpa-onnx-node loads this Node-API addon from its platform-specific prebuilt // package in the separate server worker, so verify its architecture here rather // than Electron-rebuilding it with the source-built modules. -const REQUIRED_NATIVE_MODULES = ['better_sqlite3.node', 'pty.node', 'sherpa-onnx.node']; +const REQUIRED_NATIVE_MODULES = ['pty.node', 'sherpa-onnx.node']; /** electron-builder AppImage arch token: x64 → x86_64, arm64 → arm64 */ export const linuxAppImageArchSuffix = (architecture) => ( diff --git a/packages/electron/scripts/verify-linux-appimage.test.mjs b/packages/electron/scripts/verify-linux-appimage.test.mjs index 3ba2084d..7ed98c90 100644 --- a/packages/electron/scripts/verify-linux-appimage.test.mjs +++ b/packages/electron/scripts/verify-linux-appimage.test.mjs @@ -21,7 +21,7 @@ const createPayload = () => { ].join('\n')); writeElf(path.join(root, 'openchamber'), 'x64'); writeElf(path.join(root, 'resources/opencode-cli/opencode'), 'x64'); - for (const name of ['better_sqlite3.node', 'pty.node', 'sherpa-onnx.node']) { + for (const name of ['pty.node', 'sherpa-onnx.node']) { writeElf(path.join(root, 'resources/app.asar.unpacked/node_modules', name), 'x64'); } return root; @@ -53,7 +53,7 @@ test('verifies identity, version, and native payload architecture', () => { expectedOpenCodeVersion: '1.17.18', runCliVersion: () => '1.17.18', }); - assert.equal(result.nativeModuleCount, 3); + assert.equal(result.nativeModuleCount, 2); } finally { fs.rmSync(root, { recursive: true, force: true }); } diff --git a/packages/web/package.json b/packages/web/package.json index f5afcf43..86d3489b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -28,7 +28,6 @@ "@opencode-ai/sdk": "1.18.11", "@simplewebauthn/server": "13.3.1", "adm-zip": "^0.5.16", - "better-sqlite3": "^12.10.0", "bun-pty": "^0.4.5", "compression": "^1.8.1", "cron-parser": "^4.9.0",