electron: bundle node-pty properly (#21148)

pull/17803/head
Brendan Allan 2026-04-06 11:28:05 +08:00 committed by Brendan Allan
parent b797a14857
commit eb30104732
No known key found for this signature in database
GPG Key ID: 41E835AEA046A32E
7 changed files with 34 additions and 25 deletions

View File

@ -71,7 +71,8 @@
"@solidjs/router": "0.15.4", "@solidjs/router": "0.15.4",
"@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020", "@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020",
"solid-js": "1.9.10", "solid-js": "1.9.10",
"vite-plugin-solid": "2.11.10" "vite-plugin-solid": "2.11.10",
"@lydell/node-pty": "1.2.0-beta.10"
} }
}, },
"devDependencies": { "devDependencies": {

View File

@ -10,6 +10,8 @@ const channel = (() => {
const OPENCODE_SERVER_DIST = "../opencode/dist/node" const OPENCODE_SERVER_DIST = "../opencode/dist/node"
const nodePtyPkg = `@lydell/node-pty-${process.platform}-${process.arch}`
export default defineConfig({ export default defineConfig({
main: { main: {
define: { define: {
@ -19,8 +21,16 @@ export default defineConfig({
rollupOptions: { rollupOptions: {
input: { index: "src/main/index.ts" }, input: { index: "src/main/index.ts" },
}, },
externalizeDeps: { include: [nodePtyPkg] },
}, },
plugins: [ plugins: [
{
name: "opencode:node-pty-narrower",
enforce: "pre",
resolveId(s) {
if (s === "@lydell/node-pty") return nodePtyPkg
},
},
{ {
name: "opencode:virtual-server-module", name: "opencode:virtual-server-module",
enforce: "pre", enforce: "pre",

View File

@ -13,7 +13,7 @@
"typecheck": "tsgo -b", "typecheck": "tsgo -b",
"predev": "bun ./scripts/predev.ts", "predev": "bun ./scripts/predev.ts",
"dev": "electron-vite dev", "dev": "electron-vite dev",
"prebuild": "bun ./scripts/copy-icons.ts", "prebuild": "bun ./scripts/prebuild.ts",
"build": "electron-vite build", "build": "electron-vite build",
"preview": "electron-vite preview", "preview": "electron-vite preview",
"package": "electron-builder --config electron-builder.config.ts", "package": "electron-builder --config electron-builder.config.ts",
@ -45,6 +45,7 @@
}, },
"devDependencies": { "devDependencies": {
"@actions/artifact": "4.0.0", "@actions/artifact": "4.0.0",
"@lydell/node-pty": "catalog:",
"@types/bun": "catalog:", "@types/bun": "catalog:",
"@types/node": "catalog:", "@types/node": "catalog:",
"@typescript/native-preview": "catalog:", "@typescript/native-preview": "catalog:",
@ -53,5 +54,13 @@
"electron-vite": "^5", "electron-vite": "^5",
"typescript": "~5.6.2", "typescript": "~5.6.2",
"vite": "catalog:" "vite": "catalog:"
},
"optionalDependencies": {
"@lydell/node-pty-darwin-arm64": "1.2.0-beta.10",
"@lydell/node-pty-darwin-x64": "1.2.0-beta.10",
"@lydell/node-pty-linux-arm64": "1.2.0-beta.10",
"@lydell/node-pty-linux-x64": "1.2.0-beta.10",
"@lydell/node-pty-win32-arm64": "1.2.0-beta.10",
"@lydell/node-pty-win32-x64": "1.2.0-beta.10"
} }
} }

View File

@ -0,0 +1,9 @@
#!/usr/bin/env bun
import { $ } from "bun"
import { resolveChannel } from "./utils"
const channel = resolveChannel()
await $`bun ./scripts/copy-icons.ts ${channel}`
await $`cd ../opencode && bun script/build-node.ts`

View File

@ -1,15 +1,9 @@
#!/usr/bin/env bun #!/usr/bin/env bun
import { $ } from "bun"
import { Script } from "@opencode-ai/script" import { Script } from "@opencode-ai/script"
import { resolveChannel } from "./utils"
const channel = resolveChannel() await import("./prebuild")
await $`bun ./scripts/copy-icons.ts ${channel}`
const pkg = await Bun.file("./package.json").json() const pkg = await Bun.file("./package.json").json()
pkg.version = Script.version pkg.version = Script.version
await Bun.write("./package.json", JSON.stringify(pkg, null, 2) + "\n") await Bun.write("./package.json", JSON.stringify(pkg, null, 2) + "\n")
console.log(`Updated package.json version to ${Script.version}`) console.log(`Updated package.json version to ${Script.version}`)
await $`cd ../opencode && bun script/build-node.ts`

View File

@ -106,7 +106,7 @@
"@hono/node-ws": "1.3.0", "@hono/node-ws": "1.3.0",
"@hono/standard-validator": "0.1.5", "@hono/standard-validator": "0.1.5",
"@hono/zod-validator": "catalog:", "@hono/zod-validator": "catalog:",
"@lydell/node-pty": "1.2.0-beta.10", "@lydell/node-pty": "catalog:",
"@modelcontextprotocol/sdk": "1.27.1", "@modelcontextprotocol/sdk": "1.27.1",
"@npmcli/arborist": "9.4.0", "@npmcli/arborist": "9.4.0",
"@octokit/graphql": "9.0.2", "@octokit/graphql": "9.0.2",

View File

@ -1,6 +1,5 @@
#!/usr/bin/env bun #!/usr/bin/env bun
import { $ } from "bun"
import { Script } from "@opencode-ai/script" import { Script } from "@opencode-ai/script"
import fs from "fs" import fs from "fs"
import path from "path" import path from "path"
@ -9,15 +8,6 @@ import { fileURLToPath } from "url"
const __filename = fileURLToPath(import.meta.url) const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename) const __dirname = path.dirname(__filename)
const dir = path.resolve(__dirname, "..") const dir = path.resolve(__dirname, "..")
const root = path.resolve(dir, "../..")
function linker(): "hoisted" | "isolated" {
// jsonc-parser is only declared in packages/opencode, so its install location
// tells us whether Bun used a hoisted or isolated workspace layout.
if (fs.existsSync(path.join(dir, "node_modules", "jsonc-parser"))) return "isolated"
if (fs.existsSync(path.join(root, "node_modules", "jsonc-parser"))) return "hoisted"
throw new Error("Could not detect Bun linker from jsonc-parser")
}
process.chdir(dir) process.chdir(dir)
@ -51,17 +41,13 @@ const migrations = await Promise.all(
) )
console.log(`Loaded ${migrations.length} migrations`) console.log(`Loaded ${migrations.length} migrations`)
const link = linker()
await $`bun install --linker=${link} --os="*" --cpu="*" @lydell/node-pty@1.2.0-beta.10`
await Bun.build({ await Bun.build({
target: "node", target: "node",
entrypoints: ["./src/node.ts"], entrypoints: ["./src/node.ts"],
outdir: "./dist/node", outdir: "./dist/node",
format: "esm", format: "esm",
sourcemap: "linked", sourcemap: "linked",
external: ["jsonc-parser"], external: ["jsonc-parser", "@lydell/node-pty"],
define: { define: {
OPENCODE_MIGRATIONS: JSON.stringify(migrations), OPENCODE_MIGRATIONS: JSON.stringify(migrations),
OPENCODE_CHANNEL: `'${Script.channel}'`, OPENCODE_CHANNEL: `'${Script.channel}'`,