diff --git a/Makefile b/Makefile index 00009f2e6..bb1ad43f5 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/bun.lock b/bun.lock index c1643b2ca..25fb58949 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 6285be473..3d3f276ca 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", @@ -47,7 +48,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 +73,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/scripts/postinstall.sh b/scripts/postinstall.sh new file mode 100755 index 000000000..0b8aa862b --- /dev/null +++ b/scripts/postinstall.sh @@ -0,0 +1,82 @@ +#!/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 + + # 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 + # 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 + + # 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}" diff --git a/vite.config.ts b/vite.config.ts index 8a189eda3..8635ffe9d 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"], }));