From 803a256baec3405167f24d77f87fba8083da1f66 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Sun, 16 Nov 2025 17:48:37 -0500 Subject: [PATCH 1/3] feat: update ghostty-web to next tag and upgrade node-pty - Track the next tag for ghostty-web to get latest development features - Upgrade @homebridge/node-pty-prebuilt-multiarch from 0.11.14 to 0.13.1 to get better Electron prebuild support Currently installs: - ghostty-web@0.1.1-next.18.g98ed4f1 - @homebridge/node-pty-prebuilt-multiarch@0.13.1 --- bun.lock | 14 +++++++------- package.json | 4 ++-- vite.config.ts | 7 +++++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/bun.lock b/bun.lock index c1643b2ca4..25fb58949e 100644 --- a/bun.lock +++ b/bun.lock @@ -7,7 +7,7 @@ "dependencies": { "@ai-sdk/anthropic": "^2.0.44", "@ai-sdk/openai": "^2.0.66", - "@homebridge/node-pty-prebuilt-multiarch": "^0.11.14", + "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1", "@openrouter/ai-sdk-provider": "^1.2.2", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", @@ -27,7 +27,7 @@ "disposablestack": "^1.1.7", "electron-updater": "^6.6.2", "express": "^5.1.0", - "ghostty-web": "^0.1.1", + "ghostty-web": "next", "jsonc-parser": "^3.3.1", "lru-cache": "^11.2.2", "markdown-it": "^14.1.0", @@ -335,7 +335,7 @@ "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], - "@homebridge/node-pty-prebuilt-multiarch": ["@homebridge/node-pty-prebuilt-multiarch@0.11.14", "", { "dependencies": { "nan": "^2.19.0", "prebuild-install": "^7.1.2" } }, "sha512-fuiq5kb4i0Ao0BTf7O6kvtwUhCCCJHLhWLWaaUaLuniDGS4xmj+gxvkidJpxYVT/zTXdbcLuCY44UnoWC7xODg=="], + "@homebridge/node-pty-prebuilt-multiarch": ["@homebridge/node-pty-prebuilt-multiarch@0.13.1", "", { "dependencies": { "node-addon-api": "^7.1.0", "prebuild-install": "^7.1.2" } }, "sha512-ccQ60nMcbEGrQh0U9E6x0ajW9qJNeazpcM/9CH6J8leyNtJgb+gu24WTBAfBUVeO486ZhscnaxLEITI2HXwhow=="], "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], @@ -1763,7 +1763,7 @@ "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], - "ghostty-web": ["ghostty-web@0.1.1", "", {}, "sha512-uPlk+EDNtA0uS47yxsn9VpRIFC57rm1zoRf1vCZ0Lh8DN5kw+Szyof591G+RFYNBqL1FJxMFGVzVjY8ykzteiw=="], + "ghostty-web": ["ghostty-web@0.1.1-next.18.g98ed4f1", "", {}, "sha512-jDt9BUwvWx5IpesmuHAV/L7wY7zh0WX8eyPniRXeQF77PfpcY4ED+XQs4V5ofzXJE1Bg2BwgFb0nmzeRHIQKyQ=="], "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], @@ -2379,8 +2379,6 @@ "mylas": ["mylas@2.1.14", "", {}, "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog=="], - "nan": ["nan@2.23.1", "", {}, "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], @@ -2399,7 +2397,7 @@ "node-abi": ["node-abi@4.24.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-u2EC1CeNe25uVtX3EZbdQ275c74zdZmmpzrHEQh2aIYqoVjlglfUpOX9YY85x1nlBydEKDVaSmMNhR7N82Qj8A=="], - "node-addon-api": ["node-addon-api@3.2.1", "", {}, "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="], + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], "node-api-version": ["node-api-version@0.2.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="], @@ -3459,6 +3457,8 @@ "log-symbols/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "lzma-native/node-addon-api": ["node-addon-api@3.2.1", "", {}, "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="], + "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "make-fetch-happen/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], diff --git a/package.json b/package.json index 6285be4739..79e9290c0e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@ai-sdk/anthropic": "^2.0.44", "@ai-sdk/openai": "^2.0.66", "@openrouter/ai-sdk-provider": "^1.2.2", - "ghostty-web": "^0.1.1", + "ghostty-web": "next", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-scroll-area": "^1.2.10", @@ -72,7 +72,7 @@ "minimist": "^1.2.8", "motion": "^12.23.24", "ollama-ai-provider-v2": "^1.5.4", - "@homebridge/node-pty-prebuilt-multiarch": "^0.11.14", + "@homebridge/node-pty-prebuilt-multiarch": "^0.13.1", "rehype-harden": "^1.1.5", "shescape": "^2.1.6", "source-map-support": "^0.5.21", diff --git a/vite.config.ts b/vite.config.ts index 8a189eda31..8635ffe9de 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -136,11 +136,14 @@ export default defineConfig(({ mode }) => ({ target: "esnext", }, - // Include only what's actually imported to reduce scanning - entries: ['src/**/*.{ts,tsx}'], + // Only scan renderer code, not main/preload + entries: ['src/renderer/**/*.{ts,tsx}', 'src/components/**/*.{ts,tsx}', 'src/App.tsx'], // Force re-optimize dependencies force: false, + + // Exclude native modules from optimization + exclude: ['@homebridge/node-pty-prebuilt-multiarch'], }, assetsInclude: ["**/*.wasm"], })); From 3c69a54bacd701f9703353d4a005c1a2944b083e Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Sun, 16 Nov 2025 18:23:49 -0500 Subject: [PATCH 2/3] feat: automate node-pty prebuild installation Add postinstall script that automatically downloads node-pty prebuilt binaries after bun install. This eliminates the manual step developers previously had to run. Why this is needed: - Bun blocks npm postinstall scripts by default for security - node-pty requires native .node binaries compiled for specific ABIs - Without prebuilds, terminals don't work in packaged Electron app How it works: - scripts/postinstall.sh runs after bun install (via Makefile) - Detects node or bun in PATH (with fallback to common locations) - Runs prebuild-install to download binaries from GitHub releases - Checks for build/Release/pty.node to verify success - Gracefully degrades if download fails (build continues) Benefits: - No manual steps for developers after git pull + bun install - Works with bun, node, or npm as package manager - Caches downloads in ~/.npm/_prebuilds for faster reinstalls - Clear error messages if manual intervention needed --- Makefile | 2 ++ package.json | 1 + scripts/postinstall.sh | 63 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100755 scripts/postinstall.sh diff --git a/Makefile b/Makefile index 00009f2e60..bb1ad43f58 100644 --- a/Makefile +++ b/Makefile @@ -90,6 +90,8 @@ all: build node_modules/.installed: package.json bun.lock @echo "Dependencies out of date or missing, running bun install..." @bun install + @echo "Running postinstall scripts..." + @./scripts/postinstall.sh @touch node_modules/.installed # Legacy target for backwards compatibility diff --git a/package.json b/package.json index 79e9290c0e..3d3f276ca2 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "access": "public" }, "scripts": { + "postinstall": "./scripts/postinstall.sh", "dev": "make dev", "prebuild:main": "./scripts/generate-version.sh", "build": "make build", diff --git a/scripts/postinstall.sh b/scripts/postinstall.sh new file mode 100755 index 0000000000..cc28a3c39f --- /dev/null +++ b/scripts/postinstall.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# Postinstall script to handle native module prebuilds +# Bun blocks postinstall scripts by default, so we need to manually trigger them +set -euo pipefail + +# Find node-compatible runtime (prefer node, fallback to bun) +if command -v node &> /dev/null; then + NODE_BIN="node" +elif command -v bun &> /dev/null; then + NODE_BIN="bun" +elif [ -f "/usr/local/bin/bun" ]; then + NODE_BIN="/usr/local/bin/bun" +elif [ -f "$HOME/.bun/bin/bun" ]; then + NODE_BIN="$HOME/.bun/bin/bun" +else + echo "Error: Neither node nor bun found in PATH" + exit 1 +fi + +# Color output for better visibility +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo "Running postinstall tasks..." + +# Install node-pty prebuilds +# The package has an install script that downloads prebuilt binaries from GitHub +if [ -d "node_modules/@homebridge/node-pty-prebuilt-multiarch" ]; then + echo -e "${GREEN}Installing node-pty prebuilds...${NC}" + cd node_modules/@homebridge/node-pty-prebuilt-multiarch + + # Run the install script using prebuild-install (downloads prebuilts from GitHub) + # Check if already installed first + if [ -f "build/Release/pty.node" ]; then + echo -e "${GREEN}✓ node-pty prebuild already exists (build/Release/pty.node)${NC}" + else + echo -e "${YELLOW}Downloading node-pty prebuilds...${NC}" + # Run prebuild-install (may crash with bun, but still downloads the binary) + $NODE_BIN ../../prebuild-install/bin.js --verbose > /tmp/node-pty-install.log 2>&1 || true + + # Check if the binary was actually installed + if [ -f "build/Release/pty.node" ]; then + echo -e "${GREEN}✓ node-pty prebuilds downloaded successfully${NC}" + else + echo -e "${YELLOW}⚠ Failed to install node-pty prebuilds${NC}" + echo -e "${YELLOW}Terminals may not work in packaged Electron app${NC}" + echo -e "${YELLOW}To fix manually, run:${NC}" + echo -e "${YELLOW} cd node_modules/@homebridge/node-pty-prebuilt-multiarch${NC}" + echo -e "${YELLOW} node ../../prebuild-install/bin.js --verbose${NC}" + # Don't exit 1 - let the build continue, terminals will just be degraded + fi + fi + + cd ../.. +else + echo -e "${YELLOW}Warning: @homebridge/node-pty-prebuilt-multiarch not found in node_modules${NC}" + echo -e "${YELLOW}Run 'bun install' first${NC}" + exit 1 +fi + +echo -e "${GREEN}Postinstall completed successfully${NC}" From 08045de7fbbc78cd72e7e1c01152727068265573 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Sun, 16 Nov 2025 18:28:10 -0500 Subject: [PATCH 3/3] refactor: improve postinstall platform detection Detect bundled prebuilds to avoid unnecessary downloads on Linux: - Linux: Prebuilds are bundled in npm package (prebuilds/linux-*) Script detects these and skips download entirely - macOS/Windows: No bundled prebuilds, downloads to build/Release/ Script downloads from GitHub releases as before Benefits: - Zero network calls on Linux VMs (instant postinstall) - Covers 15+ Node.js ABI versions for Linux out of box - Platform/arch detection matches node conventions (x86_64->x64, etc) - Clear messaging shows which path was taken This ensures remote Linux VMs running server mode aren't blocked by unnecessary downloads or network issues. --- scripts/postinstall.sh | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/scripts/postinstall.sh b/scripts/postinstall.sh index cc28a3c39f..0b8aa862b9 100755 --- a/scripts/postinstall.sh +++ b/scripts/postinstall.sh @@ -31,12 +31,31 @@ if [ -d "node_modules/@homebridge/node-pty-prebuilt-multiarch" ]; then echo -e "${GREEN}Installing node-pty prebuilds...${NC}" cd node_modules/@homebridge/node-pty-prebuilt-multiarch - # Run the install script using prebuild-install (downloads prebuilts from GitHub) - # Check if already installed first - if [ -f "build/Release/pty.node" ]; then - echo -e "${GREEN}✓ node-pty prebuild already exists (build/Release/pty.node)${NC}" + # Check if prebuilds are already available (bundled with package or previously downloaded) + # The package looks for binaries in two locations: + # 1. prebuilds/-/node.abi*.node (bundled for Linux in npm package) + # 2. build/Release/pty.node (downloaded via prebuild-install for macOS/Windows) + + PLATFORM=$(uname -s | tr '[:upper:]' '[:lower:]') + ARCH=$(uname -m) + + # Normalize arch names to match node conventions + case "$ARCH" in + x86_64) ARCH="x64" ;; + aarch64) ARCH="arm64" ;; + armv7l) ARCH="arm" ;; + i686) ARCH="ia32" ;; + esac + + # Check if bundled prebuilds exist (Linux has these in the npm package) + if ls prebuilds/${PLATFORM}-${ARCH}/*.node > /dev/null 2>&1; then + echo -e "${GREEN}✓ node-pty prebuilds bundled with package (prebuilds/${PLATFORM}-${ARCH})${NC}" + elif [ -f "build/Release/pty.node" ]; then + # Downloaded prebuild already exists + echo -e "${GREEN}✓ node-pty prebuild already downloaded (build/Release/pty.node)${NC}" else - echo -e "${YELLOW}Downloading node-pty prebuilds...${NC}" + # Need to download prebuilds (macOS/Windows don't ship with bundled binaries) + echo -e "${YELLOW}Downloading node-pty prebuilds for ${PLATFORM}-${ARCH}...${NC}" # Run prebuild-install (may crash with bun, but still downloads the binary) $NODE_BIN ../../prebuild-install/bin.js --verbose > /tmp/node-pty-install.log 2>&1 || true