From 774ee48f190d5cbc698aa22f03d37d10ab4f4180 Mon Sep 17 00:00:00 2001 From: nntrivi2001 Date: Thu, 13 Aug 2026 08:54:42 +0700 Subject: [PATCH] fix(run): switch node-pty to @lydell/node-pty for the plugin's --ignore-scripts install path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit node-pty ships prebuilt binaries for darwin/win32 only — on Linux it needs a native build via its install script. The plugin's --ignore-scripts install (scripts/plugin-bootstrap.js, deliberately skipped to avoid requiring a build toolchain) silently left node-pty unusable: server/lib/pty-attach.js's require() threw "Cannot find module './prebuilds/linux-x64//pty.node'" the moment a terminal was attached, leaving TerminalView permanently blank with no visible error. @lydell/node-pty is an API-compatible fork that ships each platform's binary as a regular optionalDependency instead of a postinstall build step, so a plain --ignore-scripts install resolves a working native binding on Linux with no compiler needed. Verified by installing with the exact `npm install --omit=dev --ignore-scripts` invocation the plugin bootstrap uses and confirming require() succeeds. --- package-lock.json | 110 +++++++++++++++++++++++++++++++++------ package.json | 2 +- server/lib/pty-attach.js | 14 +++-- 3 files changed, 105 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16bcd97..f0b820b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,12 @@ "hasInstallScript": true, "license": "UNLICENSED", "dependencies": { + "@lydell/node-pty": "^1.2.0-beta.15", "adm-zip": "^0.5.16", "cors": "^2.8.5", "cross-spawn": "^7.0.6", "express": "^4.21.2", "multer": "^2.0.0", - "node-pty": "^1.1.0", "redoc": "^2.5.3", "swagger-ui-express": "^5.0.1", "tar": "^7.4.3", @@ -82,6 +82,98 @@ "node": ">=18.0.0" } }, + "node_modules/@lydell/node-pty": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty/-/node-pty-1.2.0-beta.15.tgz", + "integrity": "sha512-Br8wBxzbxFwdWgk9uQ+rdzE0xfoxOK4QuGH54swhRwc5IxP6H9Y1/bcyazRGvNUs6XkB5qNVkezuKSRxUwZe7A==", + "license": "MIT", + "optionalDependencies": { + "@lydell/node-pty-darwin-arm64": "1.2.0-beta.15", + "@lydell/node-pty-darwin-x64": "1.2.0-beta.15", + "@lydell/node-pty-linux-arm64": "1.2.0-beta.15", + "@lydell/node-pty-linux-x64": "1.2.0-beta.15", + "@lydell/node-pty-win32-arm64": "1.2.0-beta.15", + "@lydell/node-pty-win32-x64": "1.2.0-beta.15" + } + }, + "node_modules/@lydell/node-pty-darwin-arm64": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty-darwin-arm64/-/node-pty-darwin-arm64-1.2.0-beta.15.tgz", + "integrity": "sha512-6TSBbzdcLiNTHl1mTuzflqXrkmcC36USVGvERoDgvHk2ItEDaMaFZuAJ1CqPmwYj0DyhCS16TVS8OGK9xZnjyQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lydell/node-pty-darwin-x64": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty-darwin-x64/-/node-pty-darwin-x64-1.2.0-beta.15.tgz", + "integrity": "sha512-yDT2oqPqYMBScyuk1U9Rg5VKcrbMOD9o9jWYYamDADA3NSbUISroPChrqYRQ74Y7BQtNH4gqYAiWOZRi5uQZ0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lydell/node-pty-linux-arm64": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty-linux-arm64/-/node-pty-linux-arm64-1.2.0-beta.15.tgz", + "integrity": "sha512-wkbNF7dYAmtJv+o2+iztVlNwnUB4B0uX0wh/UD+mwMcmE2gNMnW9GChXO7fEE5XJokD0vB5idiHpGegaN+G/sg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lydell/node-pty-linux-x64": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty-linux-x64/-/node-pty-linux-x64-1.2.0-beta.15.tgz", + "integrity": "sha512-+U/5AVvHT6W+8OCYcnJgN0Qgc0ycO3TfD6aaFJHK+WHij797f8gsi5dV1HEO9l6YQmWCD+VL5gaLDhx3mxHwCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lydell/node-pty-win32-arm64": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty-win32-arm64/-/node-pty-win32-arm64-1.2.0-beta.15.tgz", + "integrity": "sha512-pyAk91w7wnnKrD4mrHXtIXRfmzSWV5bEzvRhurXcMCtCc2TJ424ciUskIgWMhAPP6y3KyUnqElj+U6kY3iOt0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lydell/node-pty-win32-x64": { + "version": "1.2.0-beta.15", + "resolved": "https://registry.npmjs.org/@lydell/node-pty-win32-x64/-/node-pty-win32-x64-1.2.0-beta.15.tgz", + "integrity": "sha512-2f8twEmDVxZ7drchAXjtevpmSPhFok0avAnzXro4t5gmz0xsPNKkoZvymwtuIS3xo7PzQqZOPQ/YzwEMb7oIzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@nodable/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", @@ -1670,12 +1762,6 @@ "node": ">=10" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -1708,16 +1794,6 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/node-pty": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.1.0.tgz", - "integrity": "sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.1.0" - } - }, "node_modules/node-readfiles": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", diff --git a/package.json b/package.json index e1c6c3a..ad1a6fe 100644 --- a/package.json +++ b/package.json @@ -89,12 +89,12 @@ "docker:down": "docker compose down" }, "dependencies": { + "@lydell/node-pty": "^1.2.0-beta.15", "adm-zip": "^0.5.16", "cors": "^2.8.5", "cross-spawn": "^7.0.6", "express": "^4.21.2", "multer": "^2.0.0", - "node-pty": "^1.1.0", "redoc": "^2.5.3", "swagger-ui-express": "^5.0.1", "tar": "^7.4.3", diff --git a/server/lib/pty-attach.js b/server/lib/pty-attach.js index ed1948f..96527d3 100644 --- a/server/lib/pty-attach.js +++ b/server/lib/pty-attach.js @@ -1,6 +1,6 @@ /** * @file pty-attach.js - * @description Bridges one WebSocket connection to a `node-pty`-backed + * @description Bridges one WebSocket connection to an `@lydell/node-pty`-backed * `tmux attach-session` process. Binary WS frames carry raw PTY bytes in * both directions; text WS frames carry small JSON control messages * (`resize`, and an outbound `exit` sent once when the pane process/tmux @@ -98,7 +98,15 @@ function attach(ws, runId, { cols, rows }) { } // Real spawn implementation — lazy-required so unit tests never load the -// native node-pty addon unless they explicitly opt in. -__setSpawnImpl((...args) => require("node-pty").spawn(...args)); +// native PTY addon unless they explicitly opt in. Uses @lydell/node-pty (a +// drop-in-API-compatible fork of node-pty) rather than node-pty itself: +// node-pty ships prebuilt binaries for darwin/win32 only, so on Linux it +// needs a native build via its install script — but the plugin install path +// runs `npm install --ignore-scripts` deliberately (see plugin-bootstrap.js) +// to avoid requiring a build toolchain on the user's machine. @lydell/node-pty +// instead ships the platform binary as a regular optionalDependency +// (@lydell/node-pty-linux-x64 etc.), so a plain --ignore-scripts install still +// resolves a working native binding with no compiler needed. +__setSpawnImpl((...args) => require("@lydell/node-pty").spawn(...args)); module.exports = { attach, validateRunId, __setSpawnImpl };