diff --git a/README.md b/README.md index 8c01ca33..87b1ce9a 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,27 @@ Ever wanted to check on your AI agents while you're away? Need to monitor that long-running build from your phone? Want to share a terminal session with a colleague without complex SSH setups? VibeTunnel makes it happen with zero friction. +## Installation Options + +### macOS App (Recommended for Mac users) +The native macOS app provides the best experience with menu bar integration and automatic updates. + +### npm Package (Linux & Headless Systems) +For Linux servers, Docker containers, or headless macOS systems, install via npm: + +```bash +npm install -g vibetunnel +``` + +This gives you the full VibeTunnel server with web UI, just without the macOS menu bar app. See the [npm Package section](#npm-package) for detailed usage. + ## Quick Start ### Requirements -**VibeTunnel requires an Apple Silicon Mac (M1+).** Intel Macs are not supported. +**macOS App**: Requires an Apple Silicon Mac (M1+). Intel Macs are not supported for the native app. + +**npm Package**: Works on any system with Node.js 20+, including Intel Macs and Linux. Windows is not yet supported ([#252](https://github.com/amantus-ai/vibetunnel/issues/252)). ### 1. Download & Install @@ -38,6 +54,24 @@ VibeTunnel lives in your menu bar. Click the icon to start the server. ### 3. Use the `vt` Command +The `vt` command is a smart wrapper that forwards your terminal sessions through VibeTunnel: + +**How it works**: +- `vt` is a bash script that internally calls `vibetunnel fwd` to forward terminal output +- It provides additional features like shell alias resolution and session title management +- Available from both the Mac app and npm package installations + +**Installation sources**: +- **macOS App**: Creates `/usr/local/bin/vt` symlink during installation +- **npm Package**: Installs `vt` globally, with intelligent Mac app detection + +**Smart detection**: +When you run `vt` from the npm package, it: +1. Checks if the Mac app is installed at `/Applications/VibeTunnel.app` +2. If found, forwards to the Mac app's `vt` for the best experience +3. If not found, uses the npm-installed `vibetunnel fwd` +4. This ensures `vt` always uses the best available implementation + ```bash # Run any command in the browser vt pnpm run dev @@ -67,11 +101,11 @@ Visit [http://localhost:4020](http://localhost:4020) to see all your terminal se - **🚀 Zero Configuration** - No SSH keys, no port forwarding, no complexity - **🤖 AI Agent Friendly** - Perfect for monitoring Claude Code, ChatGPT, or any terminal-based AI tools - **📊 Dynamic Terminal Titles** - Real-time activity tracking shows what's happening in each session -- **🔒 Secure by Design** - Password protection, localhost-only mode, or secure tunneling via Tailscale/ngrok +- **🔒 Secure by Design** - Multiple authentication modes, localhost-only mode, or secure tunneling via Tailscale/ngrok - **📱 Mobile Ready** - Native iOS app and responsive web interface for phones and tablets - **🎬 Session Recording** - All sessions recorded in asciinema format for later playback -- **⚡ High Performance** - Powered by Bun runtime for blazing-fast JavaScript execution -- **🍎 Apple Silicon Native** - Optimized for M1/M2/M3 Macs with ARM64-only binaries +- **⚡ High Performance** - Optimized Node.js server with minimal resource usage +- **🍎 Apple Silicon Native** - Optimized for Apple Silicon (M1+) Macs with ARM64-only binaries - **🐚 Shell Alias Support** - Your custom aliases and shell functions work automatically > **Note**: The iOS app and Tauri-based components are still work in progress and not recommended for production use yet. @@ -81,10 +115,10 @@ Visit [http://localhost:4020](http://localhost:4020) to see all your terminal se VibeTunnel consists of three main components: 1. **macOS Menu Bar App** - Native Swift application that manages the server lifecycle -2. **Node.js/Bun Server** - High-performance TypeScript server handling terminal sessions +2. **Node.js Server** - High-performance TypeScript server handling terminal sessions 3. **Web Frontend** - Modern web interface using Lit components and xterm.js -The server runs as a standalone Bun executable with embedded Node.js modules, providing excellent performance and minimal resource usage. +The server runs as a standalone Node.js executable with embedded modules, providing excellent performance and minimal resource usage. ## Remote Access Options @@ -132,7 +166,7 @@ The server runs as a standalone Bun executable with embedded Node.js modules, pr **Note**: Free ngrok URLs change each time you restart the tunnel. You can claim one free static domain per user, or upgrade to a paid plan for multiple domains. ### Option 3: Local Network -1. Set a dashboard password in settings +1. Configure authentication (see Authentication section) 2. Switch to "Network" mode 3. Access via `http://[your-mac-ip]:4020` @@ -165,13 +199,224 @@ Dynamic mode includes real-time activity detection: - Shows `•` when there's terminal output within 5 seconds - Claude commands show specific status (Crafting, Transitioning, etc.) - Extensible system for future app-specific detectors + +## Authentication + +VibeTunnel provides multiple authentication modes to secure your terminal sessions: + +### Authentication Modes + +#### 1. System Authentication (Default) +Uses your operating system's native authentication: +- **macOS**: Authenticates against local user accounts +- **Linux**: Uses PAM (Pluggable Authentication Modules) +- Login with your system username and password + +#### 2. Environment Variable Authentication +Simple authentication for deployments: +```bash +export VIBETUNNEL_USERNAME=admin +export VIBETUNNEL_PASSWORD=your-secure-password +npm run start +``` + +#### 3. SSH Key Authentication +Use Ed25519 SSH keys from `~/.ssh/authorized_keys`: +```bash +# Enable SSH key authentication +npm run start -- --enable-ssh-keys + +# Make SSH keys mandatory (disable password auth) +npm run start -- --enable-ssh-keys --disallow-user-password +``` + +#### 4. No Authentication +For trusted environments only: +```bash +npm run start -- --no-auth +``` + +#### 5. Local Bypass (Development Only) +Allow localhost connections to bypass authentication: +```bash +# Basic local bypass (DEVELOPMENT ONLY - NOT FOR PRODUCTION) +npm run start -- --allow-local-bypass + +# With token for additional security (minimum for production) +npm run start -- --allow-local-bypass --local-auth-token mytoken +``` + +**Security Note**: Local bypass uses `req.socket.remoteAddress` which cannot be spoofed remotely due to TCP's three-way handshake. The implementation also rejects requests with proxy headers (`X-Forwarded-For`, etc.) to prevent header injection attacks. However: +- **Development only**: Basic bypass without token should never be used in production +- **Local processes**: Any process on the same machine can access the API +- **Always use tokens**: In production, always require `--local-auth-token` +- **Consider alternatives**: For production, use proper authentication instead of local bypass + +### macOS App Authentication + +The macOS menu bar app supports these authentication modes: +- **No Authentication**: For trusted environments only +- **System Authentication**: Uses your macOS user account credentials +- **SSH Key Authentication**: Uses Ed25519 SSH keys from `~/.ssh/authorized_keys` +- Configure via Settings → Security when in "Network" mode + +### Security Best Practices + +1. **Always use authentication** when binding to network interfaces (`--bind 0.0.0.0`) +2. **Use HTTPS** in production with a reverse proxy (nginx, Caddy) +3. **Rotate credentials** regularly +4. **Consider SSH keys** for stronger security +5. **Never use local bypass without tokens** in production environments +6. **Monitor access logs** for suspicious authentication patterns +7. **Default to secure** - explicitly enable less secure options only when needed + + +## npm Package + +The VibeTunnel npm package provides the full server functionality for Linux, Docker, CI/CD environments, and headless macOS systems. + +### Installation + +```bash +# Install globally via npm +npm install -g vibetunnel + +# Or with yarn +yarn global add vibetunnel + +# Or with pnpm +pnpm add -g vibetunnel +``` + +**Requirements**: Node.js 20.0.0 or higher + +### Running the VibeTunnel Server + +#### Basic Usage + +```bash +# Start with default settings (localhost:4020) +vibetunnel + +# Bind to all network interfaces +vibetunnel --bind 0.0.0.0 + +# Use a custom port +vibetunnel --port 8080 + +# With authentication +VIBETUNNEL_USERNAME=admin VIBETUNNEL_PASSWORD=secure vibetunnel --bind 0.0.0.0 + +# Enable debug logging +VIBETUNNEL_DEBUG=1 vibetunnel + +# Run without authentication (trusted networks only!) +vibetunnel --no-auth +``` + +#### Using the `vt` Command + +The `vt` command wrapper makes it easy to forward terminal sessions: + +```bash +# Monitor AI agents with automatic activity tracking +vt claude +vt claude --dangerously-skip-permissions +vt --title-mode dynamic claude # See real-time Claude status + +# Run any command and see it in the browser +vt npm test +vt python script.py +vt cargo build --release + +# Open an interactive shell +vt --shell +vt -i # short form + +# Control terminal titles +vt --title-mode static npm run dev # Shows path and command +vt --title-mode dynamic python app.py # Shows path, command, and activity +vt --title-mode filter vim # Blocks vim from changing title + +# Shell aliases work automatically! +vt claude-danger # Your custom alias for claude --dangerously-skip-permissions + +# Update session title (inside a VibeTunnel session) +vt title "My Project - Testing" +``` + +### Mac App Interoperability + +The npm package is designed to work seamlessly alongside the Mac app: + +#### Smart Command Routing +- The `vt` command automatically detects if the Mac app is installed +- If found at `/Applications/VibeTunnel.app`, it defers to the Mac app +- If not found, it uses the npm-installed server +- This ensures you always get the best available implementation + +#### Installation Behavior +- If `/usr/local/bin/vt` already exists (from another tool), npm won't overwrite it +- You'll see a helpful warning with alternatives: `vibetunnel` or `npx vt` +- The installation always succeeds, even if the `vt` symlink can't be created + +#### When to Use Each Version +- **Mac app only**: Best for macOS users who want menu bar integration +- **npm only**: Perfect for Linux, Docker, CI/CD, or headless servers +- **Both installed**: Mac app takes precedence, npm serves as fallback +- **Development**: npm package useful for testing without affecting Mac app + +### Package Contents + +The npm package includes: +- Full VibeTunnel server with web UI +- CLI tools (`vibetunnel` and `vt` commands) +- Native PTY support via node-pty +- Pre-built binaries for common platforms +- Complete feature parity with macOS app (minus menu bar) + +### Building the npm Package + +For maintainers who need to build the npm package: + +#### Unified Build (Multi-Platform by Default) +```bash +# Build with prebuilt binaries for all platforms +# Requires Docker for Linux cross-compilation +npm run build:npm +``` + +This creates prebuilt binaries for: +- macOS (x64, arm64) - Node.js 20, 22, 23, 24 +- Linux (x64, arm64) - Node.js 20, 22, 23, 24 + +#### Build Options +```bash +# Current platform only (faster for development) +node scripts/build-npm.js --current-only + +# Specific platform/architecture +node scripts/build-npm.js --platform darwin --arch arm64 + +# Skip Docker builds +node scripts/build-npm.js --no-docker +``` + +#### Publishing +```bash +# Test the package locally +npm pack + +# Publish to npm +npm publish +``` + ## Building from Source ### Prerequisites -- macOS 14.0+ (Sonoma) on Apple Silicon (M1/M2/M3) +- macOS 14.0+ (Sonoma) on Apple Silicon (M1+) - Xcode 16.0+ -- Node.js 20+ -- Bun runtime +- Node.js 20+ (minimum supported version) ### Build Steps diff --git a/mac/scripts/build-web-frontend.sh b/mac/scripts/build-web-frontend.sh index 90aef9b5..748fc391 100755 --- a/mac/scripts/build-web-frontend.sh +++ b/mac/scripts/build-web-frontend.sh @@ -282,7 +282,17 @@ else echo "Warning: authenticate_pam.node not found. PAM authentication may not work." fi -echo "✓ Native executable and modules copied successfully" +# Copy unified vt script +if [ -f "${WEB_DIR}/bin/vt" ]; then + echo "Copying unified vt script..." + cp "${WEB_DIR}/bin/vt" "${APP_RESOURCES}/" + chmod +x "${APP_RESOURCES}/vt" +else + echo "error: Unified vt script not found at ${WEB_DIR}/bin/vt" + exit 1 +fi + +echo "✓ Native executable, modules, and vt script copied successfully" # Sanity check: Verify all required binaries are present in the app bundle echo "Performing final sanity check..." @@ -314,6 +324,16 @@ if [ -f "${APP_RESOURCES}/spawn-helper" ] && [ ! -x "${APP_RESOURCES}/spawn-help MISSING_FILES+=("spawn-helper is not executable") fi +# Check for vt script +if [ ! -f "${APP_RESOURCES}/vt" ]; then + MISSING_FILES+=("vt script") +fi + +# Check if vt script is executable +if [ -f "${APP_RESOURCES}/vt" ] && [ ! -x "${APP_RESOURCES}/vt" ]; then + MISSING_FILES+=("vt script is not executable") +fi + # If any files are missing, fail the build if [ ${#MISSING_FILES[@]} -gt 0 ]; then echo "error: Build sanity check failed! Missing required files:" @@ -323,7 +343,7 @@ if [ ${#MISSING_FILES[@]} -gt 0 ]; then echo "Build artifacts in ${NATIVE_DIR}:" ls -la "${NATIVE_DIR}" || echo " Directory does not exist" echo "App resources in ${APP_RESOURCES}:" - ls -la "${APP_RESOURCES}/vibetunnel" "${APP_RESOURCES}/pty.node" "${APP_RESOURCES}/spawn-helper" 2>/dev/null || true + ls -la "${APP_RESOURCES}/vibetunnel" "${APP_RESOURCES}/pty.node" "${APP_RESOURCES}/spawn-helper" "${APP_RESOURCES}/vt" 2>/dev/null || true exit 1 fi diff --git a/web/.gitignore b/web/.gitignore index 393b1341..0f7b0512 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -121,6 +121,10 @@ native/ # Custom Node.js builds .node-builds/ +# Prebuild binaries (generated) +prebuilds/ +prebuilds-linux/ + # Bun lockfile (generated during native build) bun.lock @@ -137,3 +141,17 @@ coverage-summary.json # Playwright traces and test data data/ trace/ + +# Compiled binaries (should not be in git) +bin-macos/ +*.dylib +*.so +*.exe +spawn-helper* + +# Test recordings and artifacts +*.cast +test.cast + +# Temporary build directories +temp-spawn-helper/ diff --git a/web/.npm-lock-notice b/web/.npm-lock-notice new file mode 100644 index 00000000..2228ac0d --- /dev/null +++ b/web/.npm-lock-notice @@ -0,0 +1 @@ +This package was built for npm distribution. Some dev files are excluded. diff --git a/web/.npmignore b/web/.npmignore new file mode 100644 index 00000000..1f678285 --- /dev/null +++ b/web/.npmignore @@ -0,0 +1,65 @@ +# Development and build files +src/ +scripts/ +docs/ +test/ +playwright/ +coverage/ +.husky/ + +# Config files not needed in production +.gitignore +.prettierignore +.prettierrc +biome.json +vitest.config.ts +playwright.config.ts +playwright.config.skip-failing.ts +tsconfig.*.json +tsconfig.json +postcss.config.js +tailwind.config.js + +# Build artifacts and temp files +build/ +*.log +*.tmp +.DS_Store +node_modules/ +pnpm-lock.yaml + +# Native build scripts - not needed for npm package +build-native.js +build-native-clean.sh +build-custom-node.js +custom-node.md +native/ + +# Development files +CLAUDE.md +DEVELOPMENT.md +LOGGING_STYLE_GUIDE.md +SECURITY.md +fwd-test.ts +spec.md + +# Only include the built node-pty, not source +node-pty/src/ +node-pty/tsconfig.json +node-pty/*.ts +node-pty/node_modules/ + +# Test files +public/bundle/test.js +public/bundle/screencap.js +public/test/ +public/test.cast + +# Keep: +# - dist/ (compiled server code) +# - public/ (web interface) +# - bin/ (CLI entry points) +# - node-pty/build/ (native module) +# - node-pty/lib/ (JS files) +# - package.json +# - README.md \ No newline at end of file diff --git a/web/.npmrc b/web/.npmrc index f4ba3a6d..07255dce 100644 --- a/web/.npmrc +++ b/web/.npmrc @@ -3,6 +3,4 @@ # - enable-pre-post-scripts (pre/post scripts are enabled by default in npm 7+) # - auto-install-peers (use --legacy-peer-deps if needed) # - unsafe-perm (no longer needed in npm 7+) - -# Approve builds for vendored packages -side-effects-cache-unsafe=@vibetunnel/vendored-pty \ No newline at end of file +# - side-effects-cache-unsafe (deprecated in npm 9+) \ No newline at end of file diff --git a/web/.prebuildrc b/web/.prebuildrc new file mode 100644 index 00000000..736af564 --- /dev/null +++ b/web/.prebuildrc @@ -0,0 +1,35 @@ +{ + "targets": [ + { + "runtime": "node", + "target": "20.0.0" + }, + { + "runtime": "node", + "target": "22.0.0" + }, + { + "runtime": "node", + "target": "23.0.0" + }, + { + "runtime": "node", + "target": "24.0.0" + } + ], + "include": [ + "node-pty/build/Release/pty.node" + ], + "prebuild": [ + { + "name": "node-pty", + "binary": { + "module_name": "pty", + "module_path": "./node-pty/build/Release/", + "remote_path": "{version}", + "package_name": "{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz", + "host": "https://github.com/amantus-ai/vibetunnel/releases/download/" + } + } + ] +} \ No newline at end of file diff --git a/web/README.md b/web/README.md index df10ad6d..367d9fe7 100644 --- a/web/README.md +++ b/web/README.md @@ -1,81 +1,99 @@ -# VibeTunnel Web +# VibeTunnel CLI -Web terminal interface and server for VibeTunnel. +Full-featured terminal sharing server with web interface for macOS and Linux. Windows not yet supported. -## Quick Start - -Production users: Use the pre-built VibeTunnel executable from the main app. - -## Development +## Installation ```bash -pnpm install -pnpm run dev # Watch mode: server + client -pnpm run dev:client # Watch mode: client only (for debugging server) +npm install -g vibetunnel ``` -Open http://localhost:3000 +## Requirements -### Pre-commit Hooks +- Node.js >= 20.0.0 +- macOS or Linux (Windows not yet supported) +- Build tools for native modules (Xcode on macOS, build-essential on Linux) -This project uses husky and lint-staged to enforce code quality standards. After running `pnpm install`, pre-commit hooks will automatically: +## Usage -- Format code with Biome -- Check for linting errors -- Run TypeScript type checking for all configs - -If your commit fails due to linting or type errors, fix the issues and try again. Many formatting issues will be auto-fixed. - -### Build Commands +### Start the server ```bash -pnpm run clean # Remove build artifacts -pnpm run build # Build everything (including native executable) -pnpm run lint # Check code style -pnpm run lint:fix # Fix code style -pnpm run typecheck # Type checking -pnpm run test # Run all tests (unit + e2e) -pnpm run format # Format code +# Start with default settings (port 4020) +vibetunnel + +# Start with custom port +vibetunnel --port 8080 + +# Start without authentication +vibetunnel --no-auth ``` -## Production Build +Then open http://localhost:4020 in your browser to access the web interface. + +### Use the vt command wrapper + +The `vt` command allows you to run commands with TTY forwarding: ```bash -pnpm run build # Creates Node.js SEA executable -./native/vibetunnel # Run standalone executable (no Node.js required) +# Monitor AI agents with automatic activity tracking +vt claude +vt claude --dangerously-skip-permissions + +# Run commands with output visible in VibeTunnel +vt npm test +vt python script.py +vt top + +# Launch interactive shell +vt --shell +vt -i + +# Update session title (inside a session) +vt title "My Project" ``` -## Architecture +### Forward commands to a session -See [spec.md](./spec.md) for detailed architecture documentation. +```bash +# Basic usage +vibetunnel fwd [args...] -## Key Features +# Examples +vibetunnel fwd --session-id abc123 ls -la +vibetunnel fwd --session-id abc123 npm test +vibetunnel fwd --session-id abc123 python script.py +``` -- Terminal sessions via node-pty -- Real-time streaming (SSE + WebSocket) -- Binary-optimized buffer updates -- Multi-session support -- File browser integration +## Features -## Terminal Resizing Behavior +- **Web-based terminal interface** - Access terminals from any browser +- **Multiple concurrent sessions** - Run multiple terminals simultaneously +- **Real-time synchronization** - See output in real-time +- **TTY forwarding** - Full terminal emulation support +- **Session management** - Create, list, and manage sessions +- **Cross-platform** - Works on macOS and Linux +- **No dependencies** - Just Node.js required -VibeTunnel intelligently handles terminal width based on how the session was created: +## Package Contents -### Tunneled Sessions (via `vt` command) -- Sessions created by running `vt` in a native terminal window -- Terminal width is automatically limited to the native terminal's width to prevent text overflow -- Prevents flickering and display issues in the native terminal -- Shows "≤120" (or actual width) in the width selector when limited -- Users can manually override this limit using the width selector +This npm package includes: +- Full VibeTunnel server with web UI +- Command-line tools (vibetunnel, vt) +- Native PTY support for terminal emulation +- Web interface with xterm.js +- Session management and forwarding -### Frontend-Created Sessions -- Sessions created directly from the web interface (using the "New Session" button) -- No width restrictions by default - uses full browser width -- Perfect for web-only workflows where no native terminal is involved -- Shows "∞" in the width selector for unlimited width +## Platform Support -### Manual Width Control -- Click the width indicator in the session header to open the width selector -- Choose from common terminal widths (80, 120, 132, etc.) or unlimited -- Width preferences are saved per session and persist across reloads -- Selecting any width manually overrides automatic limitations \ No newline at end of file +- macOS (Intel and Apple Silicon) +- Linux (x64 and ARM64) +- Windows: Not yet supported ([#252](https://github.com/amantus-ai/vibetunnel/issues/252)) + +## Documentation + +See the main repository for complete documentation: https://github.com/amantus-ai/vibetunnel + +## License + +MIT diff --git a/web/bin/vibetunnel b/web/bin/vibetunnel new file mode 100755 index 00000000..e6c099f6 --- /dev/null +++ b/web/bin/vibetunnel @@ -0,0 +1,4 @@ +#!/usr/bin/env node + +// Start the CLI - it handles all command routing including 'fwd' +require('../dist/cli.js'); \ No newline at end of file diff --git a/mac/VibeTunnel/vt b/web/bin/vt similarity index 50% rename from mac/VibeTunnel/vt rename to web/bin/vt index 6099e63f..c1c40faf 100755 --- a/mac/VibeTunnel/vt +++ b/web/bin/vt @@ -1,47 +1,107 @@ #!/bin/bash -# VibeTunnel CLI wrapper +# Unified VibeTunnel CLI wrapper - compatible with both Mac app and npm installations -# First, find the VibeTunnel app location -# Try standard locations first, but verify the binary exists -APP_PATH="" -for TRY_PATH in "/Applications/VibeTunnel.app" "$HOME/Applications/VibeTunnel.app"; do - if [ -d "$TRY_PATH" ] && [ -f "$TRY_PATH/Contents/Resources/vibetunnel" ]; then - APP_PATH="$TRY_PATH" - break - fi -done +# Only check for Mac app on macOS +if [[ "$OSTYPE" == "darwin"* ]]; then + # macOS symlink resolution function using BSD readlink + resolve_symlink_macos() { + local target="$1" + local current="$target" + while [ -L "$current" ]; do + current="$(readlink "$current")" + # Handle relative symlinks + if [[ "$current" != /* ]]; then + current="$(dirname "$target")/$current" + fi + done + echo "$current" + } -# If not found in standard locations with valid binary, search for it -if [ -z "$APP_PATH" ]; then - # First try DerivedData (for development) - for CANDIDATE in $(find ~/Library/Developer/Xcode/DerivedData -name "VibeTunnel.app" -type d 2>/dev/null | grep -v "\.dSYM" | grep -v "Index\.noindex"); do - if [ -f "$CANDIDATE/Contents/Resources/vibetunnel" ]; then - APP_PATH="$CANDIDATE" + # Get the real path of this script to avoid infinite recursion + SCRIPT_REAL_PATH="$(resolve_symlink_macos "${BASH_SOURCE[0]}")" + + # Comprehensive Mac app search - try standard locations first, then development locations + APP_PATH="" + + # First try standard locations with valid binary check + for TRY_PATH in "/Applications/VibeTunnel.app" "$HOME/Applications/VibeTunnel.app"; do + if [ -d "$TRY_PATH" ] && [ -f "$TRY_PATH/Contents/Resources/vibetunnel" ]; then + VT_SCRIPT="$TRY_PATH/Contents/Resources/vt" + if [ -f "$VT_SCRIPT" ] && [ -x "$VT_SCRIPT" ]; then + # Avoid infinite recursion by checking if this is the same script + VT_REAL_PATH="$(resolve_symlink_macos "$VT_SCRIPT")" + if [ "$SCRIPT_REAL_PATH" != "$VT_REAL_PATH" ]; then + exec "$VT_SCRIPT" "$@" + fi + fi + APP_PATH="$TRY_PATH" break fi done - # If still not found, use mdfind as last resort + # If not found in standard locations, search for development builds if [ -z "$APP_PATH" ]; then - for CANDIDATE in $(mdfind -name "VibeTunnel.app" 2>/dev/null | grep -v "\.dSYM"); do + # First try DerivedData (for development) + for CANDIDATE in $(find ~/Library/Developer/Xcode/DerivedData -name "VibeTunnel.app" -type d 2>/dev/null | grep -v "\.dSYM" | grep -v "Index\.noindex"); do if [ -f "$CANDIDATE/Contents/Resources/vibetunnel" ]; then + VT_SCRIPT="$CANDIDATE/Contents/Resources/vt" + if [ -f "$VT_SCRIPT" ] && [ -x "$VT_SCRIPT" ]; then + VT_REAL_PATH="$(resolve_symlink_macos "$VT_SCRIPT")" + if [ "$SCRIPT_REAL_PATH" != "$VT_REAL_PATH" ]; then + exec "$VT_SCRIPT" "$@" + fi + fi APP_PATH="$CANDIDATE" break fi done + + # If still not found, use mdfind as last resort + if [ -z "$APP_PATH" ]; then + for CANDIDATE in $(mdfind -name "VibeTunnel.app" 2>/dev/null | grep -v "\.dSYM"); do + if [ -f "$CANDIDATE/Contents/Resources/vibetunnel" ]; then + VT_SCRIPT="$CANDIDATE/Contents/Resources/vt" + if [ -f "$VT_SCRIPT" ] && [ -x "$VT_SCRIPT" ]; then + VT_REAL_PATH="$(resolve_symlink_macos "$VT_SCRIPT")" + if [ "$SCRIPT_REAL_PATH" != "$VT_REAL_PATH" ]; then + exec "$VT_SCRIPT" "$@" + fi + fi + APP_PATH="$CANDIDATE" + break + fi + done + fi fi - if [ -z "$APP_PATH" ]; then - echo "Error: VibeTunnel.app with vibetunnel binary not found anywhere on the system" >&2 - exit 1 + # If we found a Mac app but couldn't use its vt script, use its binary directly + if [ -n "$APP_PATH" ]; then + VIBETUNNEL_BIN="$APP_PATH/Contents/Resources/vibetunnel" + if [ -f "$VIBETUNNEL_BIN" ]; then + # Found Mac app bundle - will use this binary + echo "# Using VibeTunnel from Mac app bundle" >&2 + fi fi fi -# Execute vibetunnel from app bundle -VIBETUNNEL_BIN="$APP_PATH/Contents/Resources/vibetunnel" -if [ ! -f "$VIBETUNNEL_BIN" ]; then - echo "Error: vibetunnel binary not found in app bundle at $VIBETUNNEL_BIN" >&2 - exit 1 +# If we get here without a Mac app, use the npm-installed vibetunnel +if [ -z "$VIBETUNNEL_BIN" ]; then + # First, try to find vibetunnel in the same directory as this script + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + if [ -f "$SCRIPT_DIR/vibetunnel" ]; then + VIBETUNNEL_BIN="$SCRIPT_DIR/vibetunnel" + else + # Try to find vibetunnel in PATH + if command -v vibetunnel >/dev/null 2>&1; then + VIBETUNNEL_BIN="$(command -v vibetunnel)" + fi + fi + + if [ -z "$VIBETUNNEL_BIN" ] || [ ! -f "$VIBETUNNEL_BIN" ]; then + echo "Error: vibetunnel binary not found. Please ensure vibetunnel is installed." >&2 + echo "Install with: npm install -g vibetunnel" >&2 + exit 1 + fi fi # Check if we're already inside a VibeTunnel session @@ -115,8 +175,9 @@ TITLE MODES: dynamic Show directory, command, and live activity status (default for web UI) NOTE: - This script automatically uses the vibetunnel executable bundled with - VibeTunnel from the app bundle. + This script automatically detects and uses the best available VibeTunnel installation: + - Mac app bundle (preferred on macOS) + - npm package installation (fallback) EOF # Show path and version info @@ -124,20 +185,39 @@ EOF echo "VIBETUNNEL BINARY:" echo " Path: $VIBETUNNEL_BIN" if [ -f "$VIBETUNNEL_BIN" ]; then - # Extract version from the vibetunnel output + # Try to get version from binary output first (works for both Mac app and npm) VERSION_INFO=$("$VIBETUNNEL_BIN" --version 2>&1 | grep "^VibeTunnel Server" | head -n 1) BUILD_INFO=$("$VIBETUNNEL_BIN" --version 2>&1 | grep "^Built:" | head -n 1) PLATFORM_INFO=$("$VIBETUNNEL_BIN" --version 2>&1 | grep "^Platform:" | head -n 1) if [ -n "$VERSION_INFO" ]; then echo " Version: ${VERSION_INFO#VibeTunnel Server }" + else + # Fallback to package.json for npm installations + PACKAGE_JSON="$(dirname "$(dirname "$VIBETUNNEL_BIN")")/package.json" + if [ -f "$PACKAGE_JSON" ]; then + VERSION=$(grep '"version"' "$PACKAGE_JSON" | head -1 | sed 's/.*"version".*:.*"\(.*\)".*/\1/') + echo " Version: $VERSION" + fi fi + if [ -n "$BUILD_INFO" ]; then echo " ${BUILD_INFO}" fi if [ -n "$PLATFORM_INFO" ]; then echo " ${PLATFORM_INFO}" fi + + # Determine installation type + if [[ "$VIBETUNNEL_BIN" == */Applications/VibeTunnel.app/* ]]; then + echo " Status: Mac app bundle" + elif [[ "$VIBETUNNEL_BIN" == */DerivedData/* ]]; then + echo " Status: Development build" + elif [[ "$VIBETUNNEL_BIN" == *npm* ]] || [[ "$VIBETUNNEL_BIN" == */bin/vibetunnel ]]; then + echo " Status: Installed via npm" + else + echo " Status: Unknown installation" + fi else echo " Status: Not found" fi @@ -156,15 +236,15 @@ resolve_command() { case "$shell_name" in zsh) # For zsh, we need interactive mode to get aliases - exec "$VIBETUNNEL_BIN" fwd $TITLE_MODE_ARGS "$user_shell" -i -c "$(printf '%q ' "$cmd" "$@")" + exec "$VIBETUNNEL_BIN" fwd ${TITLE_MODE_ARGS:+"$TITLE_MODE_ARGS"} "$user_shell" -i -c "$(printf '%q ' "$cmd" "$@")" ;; bash) # For bash, expand aliases in non-interactive mode - exec "$VIBETUNNEL_BIN" fwd $TITLE_MODE_ARGS "$user_shell" -c "shopt -s expand_aliases; source ~/.bashrc 2>/dev/null || source ~/.bash_profile 2>/dev/null || true; $(printf '%q ' "$cmd" "$@")" + exec "$VIBETUNNEL_BIN" fwd ${TITLE_MODE_ARGS:+"$TITLE_MODE_ARGS"} "$user_shell" -c "shopt -s expand_aliases; source ~/.bashrc 2>/dev/null || source ~/.bash_profile 2>/dev/null || true; $(printf '%q ' "$cmd" "$@")" ;; *) # Generic shell handling - exec "$VIBETUNNEL_BIN" fwd $TITLE_MODE_ARGS "$user_shell" -c "$(printf '%q ' "$cmd" "$@")" + exec "$VIBETUNNEL_BIN" fwd ${TITLE_MODE_ARGS:+"$TITLE_MODE_ARGS"} "$user_shell" -c "$(printf '%q ' "$cmd" "$@")" ;; esac } @@ -207,12 +287,12 @@ fi if [ $# -gt 0 ] && [[ "$1" != -* ]]; then if [[ "$NO_SHELL_WRAP" == "true" ]]; then # Execute directly without shell wrapper - exec "$VIBETUNNEL_BIN" fwd $TITLE_MODE_ARGS "$@" + exec "$VIBETUNNEL_BIN" fwd ${TITLE_MODE_ARGS:+"$TITLE_MODE_ARGS"} "$@" else # Check if the first argument is a real binary if which "$1" >/dev/null 2>&1; then # It's a real binary, execute directly - exec "$VIBETUNNEL_BIN" fwd $TITLE_MODE_ARGS "$@" + exec "$VIBETUNNEL_BIN" fwd ${TITLE_MODE_ARGS:+"$TITLE_MODE_ARGS"} "$@" else # Not a real binary, try alias resolution resolve_command "$@" @@ -220,5 +300,5 @@ if [ $# -gt 0 ] && [[ "$1" != -* ]]; then fi else # Run with fwd command (original behavior for options) - exec "$VIBETUNNEL_BIN" fwd $TITLE_MODE_ARGS "$@" + exec "$VIBETUNNEL_BIN" fwd ${TITLE_MODE_ARGS:+"$TITLE_MODE_ARGS"} "$@" fi \ No newline at end of file diff --git a/web/docs/npm.md b/web/docs/npm.md new file mode 100644 index 00000000..dd48cf7b --- /dev/null +++ b/web/docs/npm.md @@ -0,0 +1,406 @@ +# VibeTunnel NPM Package Distribution + +This document explains the npm package build process, native module handling, and prebuild system for VibeTunnel. + +## Overview + +VibeTunnel is distributed as an npm package that includes: +- Full web server with terminal sharing capabilities +- Native modules for terminal (PTY) and authentication (PAM) support +- Cross-platform prebuilt binaries to avoid requiring build tools +- Command-line tools (`vibetunnel` and `vt`) + +## Package Structure + +``` +vibetunnel/ +├── dist/ # Compiled server code +├── public/ # Web interface assets +├── bin/ # CLI entry points +│ ├── vibetunnel # Main server executable +│ └── vt # Terminal wrapper command +├── node-pty/ # Vendored PTY implementation +│ ├── lib/ # TypeScript compiled code +│ └── package.json # PTY package configuration +├── prebuilds/ # Native module prebuilt binaries +│ ├── node-pty-* # PTY binaries for all platforms/Node versions +│ └── authenticate-pam-* # PAM binaries for all platforms/Node versions +└── README.md # Package documentation +``` + +## Native Modules + +VibeTunnel requires two native modules: + +### 1. node-pty (Terminal Support) +- **Purpose**: Provides pseudo-terminal (PTY) functionality +- **Components**: + - `pty.node`: Main Node.js addon for terminal operations + - `spawn-helper`: macOS-only C helper binary for process spawning +- **Platforms**: All (macOS, Linux) +- **Dependencies**: None (vendored implementation) + +### 2. authenticate-pam (Authentication) +- **Purpose**: PAM (Pluggable Authentication Modules) integration +- **Components**: + - `authenticate_pam.node`: Node.js addon for system authentication +- **Platforms**: Linux primarily, macOS for compatibility +- **Dependencies**: System PAM libraries + +## Prebuild System + +### Overview +We use `prebuild` and `prebuild-install` to provide precompiled native modules, eliminating the need for users to have build tools installed. + +### Coverage +- **Node.js versions**: 20, 22, 23, 24 +- **Platforms**: macOS (x64, arm64), Linux (x64, arm64) +- **Total prebuilds**: 32 binaries (16 per native module) + +### Prebuild Files +``` +prebuilds/ +├── node-pty-v1.0.0-node-v115-darwin-arm64.tar.gz +├── node-pty-v1.0.0-node-v115-darwin-x64.tar.gz +├── node-pty-v1.0.0-node-v115-linux-arm64.tar.gz +├── node-pty-v1.0.0-node-v115-linux-x64.tar.gz +├── authenticate-pam-v1.0.5-node-v115-darwin-arm64.tar.gz +├── authenticate-pam-v1.0.5-node-v115-darwin-x64.tar.gz +├── authenticate-pam-v1.0.5-node-v115-linux-arm64.tar.gz +├── authenticate-pam-v1.0.5-node-v115-linux-x64.tar.gz +└── ... (similar for node versions 22, 23, 24) +``` + +Note: Node version numbers map to internal versions (v115=Node 20, v127=Node 22, v131=Node 23, v134=Node 24) + +## Build Process + +### Unified Build (Multi-Platform by Default) +```bash +npm run build:npm +``` +- Compiles TypeScript and bundles client code +- Builds native modules for all supported platforms (macOS x64/arm64, Linux x64/arm64) +- Creates comprehensive prebuilds for zero-dependency installation +- Generates npm README optimized for package distribution + +### Build Options +The unified build script supports flexible targeting: + +```bash +# Default: All platforms +npm run build:npm + +# Current platform only (faster for development) +node scripts/build-npm.js --current-only + +# Specific platform/architecture +node scripts/build-npm.js --platform darwin --arch arm64 +node scripts/build-npm.js --platform linux + +# Skip Docker (Linux builds will be skipped) +node scripts/build-npm.js --no-docker +``` + +### Docker Requirements +For Linux builds, Docker is required: +- **Recommended**: [OrbStack](https://orbstack.dev/) +- **Alternative**: [Docker Desktop](https://www.docker.com/products/docker-desktop/) + +The build will fail with helpful error messages if Docker is not available. + +## Installation Process + +### For End Users +1. **Install package**: `npm install -g vibetunnel` +2. **Prebuild-install runs**: Attempts to download prebuilt binaries +3. **Fallback compilation**: If prebuilds fail, compiles from source +4. **Result**: Working VibeTunnel installation + +### Installation Scripts +The package uses a multi-stage installation approach: + +```json +{ + "scripts": { + "install": "prebuild-install || node scripts/postinstall-npm.js" + } +} +``` + +#### Stage 1: prebuild-install +- Downloads appropriate prebuilt binary for current platform/Node version +- Installs to standard locations +- **Success**: Installation complete, no compilation needed +- **Failure**: Proceeds to Stage 2 + +#### Stage 2: postinstall-npm.js +- **node-pty**: Essential module, installation fails if build fails +- **authenticate-pam**: Optional module, warns if build fails +- Provides helpful error messages about required build tools + +## Platform-Specific Details + +### macOS +- **spawn-helper**: Additional C binary needed for proper PTY operations +- **Built during install**: spawn-helper compiles via node-gyp when needed +- **Architecture**: Supports both Intel (x64) and Apple Silicon (arm64) +- **Build tools**: Requires Xcode Command Line Tools for source compilation + +### Linux +- **PAM libraries**: Requires `libpam0g-dev` for authenticate-pam compilation +- **spawn-helper**: Not used on Linux (macOS-only) +- **Build tools**: Requires `build-essential` package for source compilation + +### Docker Build Environment +Linux prebuilds are created using Docker with: +- **Base image**: `node:22-bookworm` +- **Dependencies**: `python3 make g++ git libpam0g-dev` +- **Package manager**: pnpm (more reliable than npm in Docker) +- **Environment**: `CI=true` to avoid interactive prompts + +## spawn-helper Binary + +### What is spawn-helper? +`spawn-helper` is a small C helper binary used by node-pty for proper terminal process spawning on macOS. + +### Key Facts +- **Size**: ~70KB pure C binary +- **Platform**: macOS only (Linux doesn't use it) +- **Purpose**: Handles terminal device attachment for spawned processes +- **Dependencies**: None (pure C, no Node.js dependencies) +- **Architecture**: Platform-specific (x64 vs arm64) + +### Source Code +```c +// Simplified version of spawn-helper functionality +int main (int argc, char** argv) { + char *slave_path = ttyname(STDIN_FILENO); + close(open(slave_path, O_RDWR)); // Attach to terminal + + char *cwd = argv[1]; + char *file = argv[2]; + argv = &argv[2]; + + if (strlen(cwd) && chdir(cwd) == -1) { + _exit(1); + } + + execvp(file, argv); // Execute the target command + return 1; +} +``` + +### Installation Handling +- **Current approach**: Universal spawn-helper binary included in prebuilds (macOS only) +- **Benefits**: No compilation needed, faster installation, works without build tools +- **Fallback path**: If prebuild fails, compilation happens automatically via node-gyp +- **Error handling**: Non-fatal if missing (warns but continues) + +### Universal Binary Implementation +spawn-helper is now shipped as a prebuilt universal binary in all macOS prebuilds: + +**Implementation**: +- Built for both x64 and arm64 architectures using clang++ +- Combined into universal binary with `lipo` +- Included in every macOS node-pty prebuild automatically + +**Benefits**: +- ✅ Faster installation (no compilation needed) +- ✅ Works without build tools (Xcode Command Line Tools) +- ✅ Universal compatibility across Intel and Apple Silicon Macs +- ✅ Smaller download than compiling during install + +**Build process**: +```bash +# Build for both architectures +clang++ -arch x86_64 -o spawn-helper-x64 spawn-helper.cc +clang++ -arch arm64 -o spawn-helper-arm64 spawn-helper.cc + +# Create universal binary +lipo -create spawn-helper-x64 spawn-helper-arm64 -output spawn-helper-universal + +# Include in all macOS prebuilds +``` + +## Package Optimization + +### File Exclusions +Development artifacts are excluded from the final package: +- Test files (`public/bundle/test.js`, `public/test/` directory) +- Recording files (`*.cast` prevented by .gitignore) +- Build artifacts (`dist/` selectively included via package.json `files` field) + +**Note**: `screencap.js` is kept as it provides screen capture functionality for the web interface. + +### Size Optimization +- **Final size**: ~8.5 MB +- **File count**: ~275 files +- **Prebuilds**: Included for zero-build installation experience +- **Source code**: Minimal, compiled assets only + +## Development Commands + +### Local Development +```bash +# Multi-platform build with prebuilds (default) +npm run build:npm + +# Single-platform build for local testing +node scripts/build-npm.js --current-only + +# Test package locally +npm pack + +# Verify package contents +tar -tzf vibetunnel-*.tgz | head -20 +``` + +### Quality Checks +Always run before publishing: +```bash +pnpm run lint # Check code style +pnpm run typecheck # Verify TypeScript +``` + +## Publishing + +### Prerequisites +1. Update version in `package.json` +2. Run multi-platform build +3. Test package locally +4. Verify all prebuilds are included + +### Publish Command +```bash +npm publish +``` + +## Usage After Installation + +### Installation +```bash +# Install globally +npm install -g vibetunnel +``` + +### Starting the Server +```bash +# Start with default settings (port 4020) +vibetunnel + +# Start with custom port +vibetunnel --port 8080 + +# Start without authentication +vibetunnel --no-auth +``` + +Then open http://localhost:4020 in your browser to access the web interface. + +### Using the vt Command +```bash +# Monitor AI agents with automatic activity tracking +vt claude +vt claude --dangerously-skip-permissions + +# Run commands with output visible in VibeTunnel +vt npm test +vt python script.py +vt top + +# Launch interactive shell +vt --shell +vt -i + +# Update session title (inside a session) +vt title "My Project" +``` + +### Command Forwarding +```bash +# Basic usage +vibetunnel fwd [args...] + +# Examples +vibetunnel fwd --session-id abc123 ls -la +vibetunnel fwd --session-id abc123 npm test +vibetunnel fwd --session-id abc123 python script.py +``` + +## Coexistence with Mac App + +The npm package works seamlessly alongside the Mac app: + +### Command Routing +- The `vt` command from npm automatically detects if the Mac app is installed +- If Mac app found at `/Applications/VibeTunnel.app`, npm `vt` defers to it +- Ensures you always get the best available implementation + +### Installation Behavior +- Won't overwrite existing `/usr/local/bin/vt` from other tools +- Provides helpful warnings if conflicts exist +- Installation always succeeds, even if `vt` symlink can't be created +- Use `vibetunnel` or `npx vt` as alternatives + +## Troubleshooting + +### Common Issues + +#### Missing Build Tools +**Error**: `gyp ERR! stack Error: not found: make` +**Solution**: Install build tools: +- **macOS**: `xcode-select --install` +- **Linux**: `apt-get install build-essential` + +#### Missing PAM Development Libraries +**Error**: `fatal error: security/pam_appl.h: No such file or directory` +**Solution**: Install PAM development libraries: +- **Linux**: `apt-get install libpam0g-dev` +- **macOS**: Usually available by default + +#### Docker Not Available +**Error**: `Docker is required for multi-platform builds` +**Solution**: Install Docker using OrbStack or Docker Desktop + +#### Prebuild Download Failures +**Error**: `prebuild-install warn install No prebuilt binaries found` +**Cause**: Network issues or unsupported platform/Node version +**Result**: Automatic fallback to source compilation + +### Debugging Installation +```bash +# Verbose npm install +npm install -g vibetunnel --verbose + +# Check prebuild availability +npx prebuild-install --list + +# Force source compilation +npm install -g vibetunnel --build-from-source +``` + +## Architecture Decisions + +### Why Prebuilds? +- **User experience**: No build tools required for most users +- **Installation speed**: Pre-compiled binaries install much faster +- **Reliability**: Eliminates compilation errors in user environments +- **Cross-platform**: Supports all target platforms without user setup + +### Why Docker for Linux Builds? +- **Cross-compilation**: Build Linux binaries from macOS development machine +- **Consistency**: Reproducible build environment +- **Dependencies**: Proper PAM library versions for Linux + +### Why Vendored node-pty? +- **Control**: Custom modifications for VibeTunnel's needs +- **Reliability**: Avoid external dependency issues +- **Optimization**: Minimal implementation without unnecessary features + +## Related Files + +- `scripts/build-npm.js` - Unified npm build process with multi-platform support +- `scripts/postinstall-npm.js` - Fallback compilation logic +- `.prebuildrc` - Prebuild configuration for target platforms +- `package.json` - Package configuration and file inclusions \ No newline at end of file diff --git a/web/node-pty/package.json b/web/node-pty/package.json index b9b4c9a2..a4123bf9 100644 --- a/web/node-pty/package.json +++ b/web/node-pty/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/node": "^24.0.3", "node-gyp": "^11.0.0", + "prebuild": "^13.0.1", "rimraf": "^5.0.5", "typescript": "^5.8.3" }, diff --git a/web/node-pty/pnpm-lock.yaml b/web/node-pty/pnpm-lock.yaml index 85e9aa14..7c7f7396 100644 --- a/web/node-pty/pnpm-lock.yaml +++ b/web/node-pty/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: node-gyp: specifier: ^11.0.0 version: 11.2.0 + prebuild: + specifier: ^13.0.1 + version: 13.0.1 rimraf: specifier: ^5.0.5 version: 5.0.10 @@ -35,10 +38,18 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/agent@3.0.0': resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@4.0.0': resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} engines: {node: ^18.17.0 || >=20.5.0} @@ -50,14 +61,35 @@ packages: '@types/node@24.0.13': resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} + after@0.8.2: + resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -74,20 +106,119 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansi@0.3.1: + resolution: {integrity: sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==} + + aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} + + are-we-there-yet@1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + deprecated: This package is no longer supported. + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + are-we-there-yet@4.0.2: + resolution: {integrity: sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + array-index@1.0.0: + resolution: {integrity: sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.6.0: + resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bl@3.0.1: + resolution: {integrity: sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==} + + block-stream@0.0.9: + resolution: {integrity: sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==} + engines: {node: 0.4 || >=0.5.8} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + buffer-from@0.1.2: + resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} + + cacache@18.0.4: + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} + engines: {node: ^16.14.0 || >=18.0.0} + cacache@19.0.1: resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} engines: {node: ^18.17.0 || >=20.5.0} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cmake-js@7.3.1: + resolution: {integrity: sha512-aJtHDrTFl8qovjSSqXT9aC2jdGfmP8JQsPtjdLAXFfH1BF4/ImZ27Jx0R61TFg8Apc3pl6e2yBKMveAeRXx2Rw==} + engines: {node: '>= 14.15.0'} + hasBin: true + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -95,10 +226,49 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -108,9 +278,38 @@ packages: supports-color: optional: true + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer2@0.0.2: + resolution: {integrity: sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==} + + each-series-async@1.0.1: + resolution: {integrity: sha512-G4zip/Ewpwr6JQxW7+2RNgkPd09h/UNec5UlvA/xKwl4qf5blyBNK6a/zjQc3MojgsxaOb93B9v3T92QU6IMVg==} + engines: {node: '>=0.10.0'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -127,9 +326,69 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + execspawn@1.0.1: + resolution: {integrity: sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==} + exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fdir@6.4.6: resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: @@ -138,21 +397,138 @@ packages: picomatch: optional: true + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs-minipass@3.0.3: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@1.2.7: + resolution: {integrity: sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==} + deprecated: This package is no longer supported. + + gauge@2.7.4: + resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} + deprecated: This package is no longer supported. + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + gauge@5.0.2: + resolution: {integrity: sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + ghreleases@3.0.2: + resolution: {integrity: sha512-QiR9mIYvRG7hd8JuQYoxeBNOelVuTp2DpdiByRywbCDBSJufK9Vq7VuhD8B+5uviMxZx2AEkCzye61Us9gYgnw==} + engines: {node: '>=6'} + + ghrepos@2.1.0: + resolution: {integrity: sha512-6GM0ohSDTAv7xD6GsKfxJiV/CajoofRyUwu0E8l29d1o6lFAUxmmyMP/FH33afA20ZrXzxxcTtN6TsYvudMoAg==} + + ghutils@3.2.6: + resolution: {integrity: sha512-WpYHgLQkqU7Cv147wKUEThyj6qKHCdnAG2CL9RRsRQImVdLGdVqblJ3JUnj3ToQwgm1ALPS+FXgR0448AgGPUg==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -160,10 +536,17 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + hyperquest@2.1.3: + resolution: {integrity: sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw==} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -172,14 +555,44 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -187,27 +600,93 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonist@2.1.2: + resolution: {integrity: sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + lodash.pad@4.5.1: + resolution: {integrity: sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==} + + lodash.padend@4.6.1: + resolution: {integrity: sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==} + + lodash.padstart@4.6.1: + resolution: {integrity: sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@14.0.3: resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} engines: {node: ^18.17.0 || >=20.5.0} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memory-stream@1.0.0: + resolution: {integrity: sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@2.0.1: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@4.0.1: resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -228,39 +707,161 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + minizlib@3.0.2: resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-api-headers@1.5.0: + resolution: {integrity: sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ==} + + node-gyp@10.3.1: + resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + node-gyp@11.2.0: resolution: {integrity: sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + node-ninja@1.0.2: + resolution: {integrity: sha512-wMtWsG2QZI1Z5V7GciX9OI2DVT0PuDRIDQfe3L3rJsQ1qN1Gm3QQhoNtb4PMRi7gq4ByvEIYtPwHC7YbEf5yxw==} + engines: {node: '>= 0.8.0'} + hasBin: true + + noop-logger@0.1.1: + resolution: {integrity: sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==} + + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + nopt@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + npm-path@2.0.4: + resolution: {integrity: sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==} + engines: {node: '>=0.8'} + hasBin: true + + npm-which@3.0.1: + resolution: {integrity: sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A==} + engines: {node: '>=4.2.0'} + hasBin: true + + npmlog@2.0.4: + resolution: {integrity: sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==} + deprecated: This package is no longer supported. + + npmlog@4.1.2: + resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + deprecated: This package is no longer supported. + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + npmlog@7.0.1: + resolution: {integrity: sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + nw-gyp@3.6.8: + resolution: {integrity: sha512-5aIDGPOlePxo0wBPzRDdOpgo/9Al+La0gCjKIjSl4K8FDvb5vFJB+H9SpBwBtXNpi2KEMImtvKwSkt85stNcCA==} + engines: {node: '>= 0.8.0'} + hasBin: true + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + osenv@0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + deprecated: This package is no longer supported. + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + p-map@7.0.3: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} @@ -268,6 +869,13 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + path-array@1.0.1: + resolution: {integrity: sha512-teWG2rJTJJZi2kINKOsHcdIuHP7jy3D7pAsVgdhxMq8kaL2RnS5sg7YTlrClMVCIItcVbPTPI6eMBEoNxYahLA==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -276,34 +884,114 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + prebuild@13.0.1: + resolution: {integrity: sha512-AR+ZoFfG2qQM5iCtNNBWlueuzlBWQdeiU+fBF7ZwbW2w5p/2Ep1+3G4AtAymrMfZn0yg3DoF+xCorh5hHOJY/Q==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@5.0.0: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@5.0.10: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + run-waterfall@1.1.7: + resolution: {integrity: sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + semver@5.3.0: + resolution: {integrity: sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==} + hasBin: true + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -312,10 +1000,17 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-mime@0.1.0: + resolution: {integrity: sha512-2EoTElzj77w0hV4lW6nWdA+MR+81hviMBhEc/ppUi0+Q311EFCvwKrGS7dcxqvGRKnUdbAyqPJtBQbRYgmtmvQ==} + engines: {'0': node >= 0.2.0} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -331,10 +1026,26 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@12.0.0: resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} engines: {node: ^18.17.0 || >=20.5.0} + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -343,6 +1054,19 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -351,14 +1075,48 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@2.2.2: + resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==} + deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -367,24 +1125,72 @@ packages: undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@4.0.0: resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} engines: {node: ^18.17.0 || >=20.5.0} + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@5.0.0: resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} engines: {node: ^18.17.0 || >=20.5.0} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util-extend@1.0.3: + resolution: {integrity: sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + which@5.0.0: resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -393,6 +1199,17 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -400,6 +1217,14 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + snapshots: '@isaacs/cliui@8.0.2': @@ -415,6 +1240,16 @@ snapshots: dependencies: minipass: 7.1.2 + '@npmcli/agent@2.2.2': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + '@npmcli/agent@3.0.0': dependencies: agent-base: 7.1.4 @@ -425,6 +1260,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@npmcli/fs@3.1.1': + dependencies: + semver: 7.7.2 + '@npmcli/fs@4.0.0': dependencies: semver: 7.7.2 @@ -436,10 +1275,30 @@ snapshots: dependencies: undici-types: 7.8.0 + abbrev@1.1.1: {} + + abbrev@2.0.0: {} + abbrev@3.0.1: {} + after@0.8.2: {} + agent-base@7.1.4: {} + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@2.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -450,12 +1309,96 @@ snapshots: ansi-styles@6.2.1: {} + ansi@0.3.1: {} + + aproba@1.2.0: {} + + aproba@2.1.0: {} + + are-we-there-yet@1.1.7: + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.8 + + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + are-we-there-yet@4.0.2: {} + + array-index@1.0.0: + dependencies: + debug: 2.6.9 + es6-symbol: 3.1.4 + transitivePeerDependencies: + - supports-color + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + axios@1.10.0(debug@4.4.1): + dependencies: + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.3 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + b4a@1.6.7: {} + balanced-match@1.0.2: {} + bare-events@2.6.0: + optional: true + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + bl@3.0.1: + dependencies: + readable-stream: 3.6.2 + + block-stream@0.0.9: + dependencies: + inherits: 2.0.4 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 + buffer-from@0.1.2: {} + + cacache@18.0.4: + dependencies: + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + cacache@19.0.1: dependencies: '@npmcli/fs': 4.0.0 @@ -471,26 +1414,116 @@ snapshots: tar: 7.4.3 unique-filename: 4.0.0 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + caseless@0.12.0: {} + + chownr@2.0.0: {} + chownr@3.0.0: {} + clean-stack@2.2.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cmake-js@7.3.1: + dependencies: + axios: 1.10.0(debug@4.4.1) + debug: 4.4.1 + fs-extra: 11.3.0 + memory-stream: 1.0.0 + node-api-headers: 1.5.0 + npmlog: 6.0.2 + rc: 1.2.8 + semver: 7.7.2 + tar: 6.2.1 + url-join: 4.0.1 + which: 2.0.2 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + code-point-at@1.1.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} + color-support@1.1.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.4.1: dependencies: ms: 2.1.3 + deep-extend@0.6.0: {} + + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + + detect-libc@2.0.4: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer2@0.0.2: + dependencies: + readable-stream: 1.1.14 + + each-series-async@1.0.1: {} + eastasianwidth@0.2.0: {} + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -504,21 +1537,212 @@ snapshots: err-code@2.0.3: {} + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + escalade@3.2.0: {} + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + execspawn@1.0.1: + dependencies: + util-extend: 1.0.3 + exponential-backoff@3.1.2: {} + ext@1.7.0: + dependencies: + type: 2.7.3 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-json-stable-stringify@2.1.0: {} + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 + follow-redirects@1.15.9(debug@4.4.1): + optionalDependencies: + debug: 4.4.1 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs-minipass@3.0.3: dependencies: minipass: 7.1.2 + fs.realpath@1.0.0: {} + + fstream@1.0.12: + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + + function-bind@1.1.2: {} + + gauge@1.2.7: + dependencies: + ansi: 0.3.1 + has-unicode: 2.0.1 + lodash.pad: 4.5.1 + lodash.padend: 4.6.1 + lodash.padstart: 4.6.1 + + gauge@2.7.4: + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.5 + + gauge@4.0.4: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + gauge@5.0.2: + dependencies: + aproba: 2.1.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 4.1.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + ghreleases@3.0.2: + dependencies: + after: 0.8.2 + ghrepos: 2.1.0 + ghutils: 3.2.6 + lodash.uniq: 4.5.0 + simple-mime: 0.1.0 + url-template: 2.0.8 + + ghrepos@2.1.0: + dependencies: + ghutils: 3.2.6 + + ghutils@3.2.6: + dependencies: + jsonist: 2.1.2 + xtend: 4.0.2 + + github-from-package@0.0.0: {} + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -528,8 +1752,38 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-unicode@2.0.1: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + http-cache-semantics@4.2.0: {} http-proxy-agent@7.0.2: @@ -539,6 +1793,12 @@ snapshots: transitivePeerDependencies: - supports-color + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -546,6 +1806,12 @@ snapshots: transitivePeerDependencies: - supports-color + hyperquest@2.1.3: + dependencies: + buffer-from: 0.1.2 + duplexer2: 0.0.2 + through2: 0.6.5 + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -553,27 +1819,105 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + is-fullwidth-code-point@3.0.0: {} + is-lambda@1.0.1: {} + + is-typedarray@1.0.0: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + isexe@2.0.0: {} isexe@3.1.1: {} + isstream@0.1.2: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jsbn@0.1.1: {} + jsbn@1.1.0: {} + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonist@2.1.2: + dependencies: + bl: 3.0.1 + hyperquest: 2.1.3 + json-stringify-safe: 5.0.1 + xtend: 4.0.2 + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + lodash.pad@4.5.1: {} + + lodash.padend@4.6.1: {} + + lodash.padstart@4.6.1: {} + + lodash.uniq@4.5.0: {} + lru-cache@10.4.3: {} + make-fetch-happen@13.0.1: + dependencies: + '@npmcli/agent': 2.2.2 + cacache: 18.0.4 + http-cache-semantics: 4.2.0 + is-lambda: 1.0.1 + minipass: 7.1.2 + minipass-fetch: 3.0.5 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + proc-log: 4.2.0 + promise-retry: 2.0.1 + ssri: 10.0.6 + transitivePeerDependencies: + - supports-color + make-fetch-happen@14.0.3: dependencies: '@npmcli/agent': 3.0.0 @@ -590,14 +1934,40 @@ snapshots: transitivePeerDependencies: - supports-color + math-intrinsics@1.1.0: {} + + memory-stream@1.0.0: + dependencies: + readable-stream: 3.6.2 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass-collect@2.0.1: dependencies: minipass: 7.1.2 + minipass-fetch@3.0.5: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + minipass-fetch@4.0.1: dependencies: minipass: 7.1.2 @@ -622,20 +1992,62 @@ snapshots: dependencies: yallist: 4.0.0 + minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + minizlib@3.0.2: dependencies: minipass: 7.1.2 + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + ms@2.0.0: {} + ms@2.1.3: {} + napi-build-utils@1.0.2: {} + + negotiator@0.6.4: {} + negotiator@1.0.0: {} + next-tick@1.1.0: {} + + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + node-addon-api@7.1.1: {} + node-api-headers@1.5.0: {} + + node-gyp@10.3.1: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.1 + nopt: 7.2.1 + proc-log: 4.2.0 + semver: 7.7.2 + tar: 6.2.1 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + node-gyp@11.2.0: dependencies: env-paths: 2.2.1 @@ -651,14 +2063,127 @@ snapshots: transitivePeerDependencies: - supports-color + node-ninja@1.0.2: + dependencies: + fstream: 1.0.12 + glob: 7.2.3 + graceful-fs: 4.2.11 + minimatch: 3.1.2 + mkdirp: 0.5.6 + nopt: 3.0.6 + npmlog: 2.0.4 + osenv: 0.1.5 + path-array: 1.0.1 + request: 2.88.2 + rimraf: 2.7.1 + semver: 5.7.2 + tar: 2.2.2 + which: 1.3.1 + transitivePeerDependencies: + - supports-color + + noop-logger@0.1.1: {} + + nopt@3.0.6: + dependencies: + abbrev: 1.1.1 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + nopt@8.1.0: dependencies: abbrev: 3.0.1 + npm-path@2.0.4: + dependencies: + which: 1.3.1 + + npm-which@3.0.1: + dependencies: + commander: 2.20.3 + npm-path: 2.0.4 + which: 1.3.1 + + npmlog@2.0.4: + dependencies: + ansi: 0.3.1 + are-we-there-yet: 1.1.7 + gauge: 1.2.7 + + npmlog@4.1.2: + dependencies: + are-we-there-yet: 1.1.7 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + + npmlog@7.0.1: + dependencies: + are-we-there-yet: 4.0.2 + console-control-strings: 1.1.0 + gauge: 5.0.2 + set-blocking: 2.0.0 + + number-is-nan@1.0.1: {} + + nw-gyp@3.6.8: + dependencies: + fstream: 1.0.12 + glob: 7.2.3 + graceful-fs: 4.2.11 + minimatch: 3.1.2 + mkdirp: 0.5.6 + nopt: 3.0.6 + npmlog: 4.1.2 + osenv: 0.1.5 + request: 2.88.2 + rimraf: 2.7.1 + semver: 5.3.0 + tar: 2.2.2 + which: 1.3.1 + + oauth-sign@0.9.0: {} + + object-assign@4.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + os-homedir@1.0.2: {} + + os-tmpdir@1.0.2: {} + + osenv@0.1.5: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@7.0.3: {} package-json-from-dist@1.0.1: {} + path-array@1.0.1: + dependencies: + array-index: 1.0.0 + transitivePeerDependencies: + - supports-color + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-scurry@1.11.1: @@ -666,34 +2191,155 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + performance-now@2.1.0: {} + picomatch@4.0.2: {} + prebuild@13.0.1: + dependencies: + cmake-js: 7.3.1 + detect-libc: 2.0.4 + each-series-async: 1.0.1 + execspawn: 1.0.1 + ghreleases: 3.0.2 + github-from-package: 0.0.0 + glob: 10.4.5 + minimist: 1.2.8 + napi-build-utils: 1.0.2 + node-abi: 3.75.0 + node-gyp: 10.3.1 + node-ninja: 1.0.2 + noop-logger: 0.1.1 + npm-which: 3.0.1 + npmlog: 7.0.1 + nw-gyp: 3.6.8 + rc: 1.2.8 + run-waterfall: 1.1.7 + tar-stream: 3.1.7 + transitivePeerDependencies: + - supports-color + + proc-log@4.2.0: {} + proc-log@5.0.0: {} + process-nextick-args@2.0.1: {} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 + proxy-from-env@1.1.0: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-directory@2.1.1: {} + retry@0.12.0: {} + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + rimraf@5.0.10: dependencies: glob: 10.4.5 - safer-buffer@2.1.2: - optional: true + run-waterfall@1.1.7: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@5.3.0: {} + + semver@5.7.2: {} semver@7.7.2: {} + set-blocking@2.0.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-mime@0.1.0: {} + smart-buffer@4.2.0: {} socks-proxy-agent@8.0.5: @@ -711,10 +2357,39 @@ snapshots: sprintf-js@1.1.3: {} + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + ssri@10.0.6: + dependencies: + minipass: 7.1.2 + ssri@12.0.0: dependencies: minipass: 7.1.2 + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.0 + + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -727,6 +2402,20 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -735,6 +2424,29 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-json-comments@2.0.1: {} + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + + tar@2.2.2: + dependencies: + block-stream: 0.0.9 + fstream: 1.0.12 + inherits: 2.0.4 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -744,31 +2456,95 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + through2@0.6.5: + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.2 + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type@2.7.3: {} + typescript@5.8.3: {} undici-types@7.8.0: {} + unique-filename@3.0.0: + dependencies: + unique-slug: 4.0.0 + unique-filename@4.0.0: dependencies: unique-slug: 5.0.0 + unique-slug@4.0.0: + dependencies: + imurmurhash: 0.1.4 + unique-slug@5.0.0: dependencies: imurmurhash: 0.1.4 + universalify@2.0.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-join@4.0.1: {} + + url-template@2.0.8: {} + + util-deprecate@1.0.2: {} + + util-extend@1.0.3: {} + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + which@5.0.0: dependencies: isexe: 3.1.1 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -781,6 +2557,24 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + yallist@4.0.0: {} yallist@5.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/web/package.json b/web/package.json index 80c60d67..faa893f6 100644 --- a/web/package.json +++ b/web/package.json @@ -1,10 +1,35 @@ { - "name": "@vibetunnel/vibetunnel-cli", + "name": "vibetunnel", "version": "1.0.0-beta.10", - "description": "Web frontend for terminal multiplexer", - "main": "dist/server.js", + "description": "Terminal sharing server with web interface - supports macOS, Linux, and headless environments", + "main": "dist/server/server.js", "bin": { - "vibetunnel": "./dist/vibetunnel-cli" + "vibetunnel": "./bin/vibetunnel" + }, + "files": [ + "dist/", + "public/", + "bin/", + "node-pty/lib/", + "node-pty/package.json", + "prebuilds/", + "README.md" + ], + "os": [ + "darwin", + "linux" + ], + "engines": { + "node": ">=20.0.0" + }, + "repository": { + "type": "git", + "url": "https://github.com/amantus-ai/vibetunnel.git", + "directory": "web" + }, + "homepage": "https://vibetunnel.sh", + "bugs": { + "url": "https://github.com/amantus-ai/vibetunnel/issues" }, "scripts": { "clean": "node scripts/clean.js", @@ -13,7 +38,11 @@ "dev:client": "node scripts/dev.js --client-only", "build": "node scripts/build.js", "build:ci": "node scripts/build-ci.js", + "build:npm": "node scripts/build-npm.js", + "prepublishOnly": "npm run build:npm", "postinstall": "node scripts/ensure-native-modules.js", + "prebuild": "echo 'Skipping prebuild - handled by build-npm.js'", + "prebuild:upload": "echo 'Skipping prebuild:upload - not used'", "lint": "concurrently -n biome,tsc-server,tsc-client,tsc-sw \"biome check src\" \"tsc --noEmit --project tsconfig.server.json\" \"tsc --noEmit --project tsconfig.client.json\" \"tsc --noEmit --project tsconfig.sw.json\"", "lint:fix": "biome check src --write", "lint:biome": "biome check src", diff --git a/web/scripts/build-npm.js b/web/scripts/build-npm.js new file mode 100755 index 00000000..34c23663 --- /dev/null +++ b/web/scripts/build-npm.js @@ -0,0 +1,601 @@ +#!/usr/bin/env node + +/** + * Unified npm build script for VibeTunnel + * Builds for all platforms by default with complete prebuild support + * + * Options: + * --current-only Build for current platform/arch only (legacy mode) + * --no-docker Skip Docker builds (Linux builds will be skipped) + * --platform Build for specific platform (darwin, linux) + * --arch Build for specific architecture (x64, arm64) + */ + +const { execSync, spawn } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const NODE_VERSIONS = ['20', '22', '23', '24']; +const ALL_PLATFORMS = { + darwin: ['x64', 'arm64'], + linux: ['x64', 'arm64'] +}; + +// Map Node.js versions to ABI versions +function getNodeAbi(nodeVersion) { + const abiMap = { + '20': '115', + '22': '127', + '23': '131', + '24': '134' + }; + return abiMap[nodeVersion]; +} + +// Parse command line arguments +const args = process.argv.slice(2); +const currentOnly = args.includes('--current-only'); +const noDocker = args.includes('--no-docker'); +const platformFilter = args.find(arg => arg.startsWith('--platform'))?.split('=')[1] || + (args.includes('--platform') ? args[args.indexOf('--platform') + 1] : null); +const archFilter = args.find(arg => arg.startsWith('--arch'))?.split('=')[1] || + (args.includes('--arch') ? args[args.indexOf('--arch') + 1] : null); + +let PLATFORMS = ALL_PLATFORMS; + +if (currentOnly) { + // Legacy mode: current platform/arch only + PLATFORMS = { [process.platform]: [process.arch] }; +} else { + // Apply filters + if (platformFilter) { + PLATFORMS = { [platformFilter]: ALL_PLATFORMS[platformFilter] || [] }; + } + if (archFilter) { + PLATFORMS = Object.fromEntries( + Object.entries(PLATFORMS).map(([platform, archs]) => [ + platform, + archs.filter(arch => arch === archFilter) + ]) + ); + } +} + +console.log('🚀 Building VibeTunnel for npm distribution...\n'); + +if (currentOnly) { + console.log(`📦 Legacy mode: Building for ${process.platform}/${process.arch} only\n`); +} else { + console.log('🌐 Multi-platform mode: Building for all supported platforms\n'); + console.log('Target platforms:', Object.entries(PLATFORMS) + .map(([platform, archs]) => `${platform}(${archs.join(',')})`) + .join(', ')); + console.log(''); +} + +// Check if Docker is available for Linux builds +function checkDocker() { + try { + execSync('docker --version', { stdio: 'pipe' }); + return true; + } catch (e) { + if (PLATFORMS.linux && !noDocker) { + console.error('❌ Docker is required for Linux builds but is not installed.'); + console.error('Please install Docker using one of these options:'); + console.error(' - OrbStack (recommended): https://orbstack.dev/'); + console.error(' - Docker Desktop: https://www.docker.com/products/docker-desktop/'); + console.error(' - Use --no-docker to skip Linux builds'); + process.exit(1); + } + return false; + } +} + +// Build for macOS locally +function buildMacOS() { + console.log('🍎 Building macOS binaries locally...\n'); + + // First ensure prebuild is available + try { + execSync('npx prebuild --version', { stdio: 'pipe' }); + } catch (e) { + console.log(' Installing prebuild dependencies...'); + execSync('npm install', { stdio: 'inherit' }); + } + + // Build node-pty + console.log(' Building node-pty...'); + const nodePtyDir = path.join(__dirname, '..', 'node-pty'); + + for (const nodeVersion of NODE_VERSIONS) { + for (const arch of PLATFORMS.darwin || []) { + console.log(` → node-pty for Node.js ${nodeVersion} ${arch}`); + try { + execSync(`npx prebuild --runtime node --target ${nodeVersion}.0.0 --arch ${arch}`, { + cwd: nodePtyDir, + stdio: 'pipe' + }); + } catch (error) { + console.error(` ❌ Failed to build node-pty for Node.js ${nodeVersion} ${arch}`); + console.error(` Error: ${error.message}`); + process.exit(1); + } + } + } + + // Build universal spawn-helper binaries for macOS + console.log(' Building universal spawn-helper binaries...'); + const spawnHelperSrc = path.join(nodePtyDir, 'src', 'unix', 'spawn-helper.cc'); + const tempDir = path.join(__dirname, '..', 'temp-spawn-helper'); + + // Ensure temp directory exists + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + + try { + // Build for x64 + console.log(` → spawn-helper for x64`); + execSync(`clang++ -arch x86_64 -o ${tempDir}/spawn-helper-x64 ${spawnHelperSrc}`, { + stdio: 'pipe' + }); + + // Build for arm64 + console.log(` → spawn-helper for arm64`); + execSync(`clang++ -arch arm64 -o ${tempDir}/spawn-helper-arm64 ${spawnHelperSrc}`, { + stdio: 'pipe' + }); + + // Create universal binary + console.log(` → Creating universal spawn-helper binary`); + execSync(`lipo -create ${tempDir}/spawn-helper-x64 ${tempDir}/spawn-helper-arm64 -output ${tempDir}/spawn-helper-universal`, { + stdio: 'pipe' + }); + + // Add universal spawn-helper to each macOS prebuild + for (const nodeVersion of NODE_VERSIONS) { + for (const arch of PLATFORMS.darwin || []) { + const prebuildFile = path.join(nodePtyDir, 'prebuilds', `node-pty-v1.0.0-node-v${getNodeAbi(nodeVersion)}-darwin-${arch}.tar.gz`); + if (fs.existsSync(prebuildFile)) { + console.log(` → Adding spawn-helper to ${path.basename(prebuildFile)}`); + + // Extract existing prebuild + const extractDir = path.join(tempDir, `extract-${nodeVersion}-${arch}`); + if (fs.existsSync(extractDir)) { + fs.rmSync(extractDir, { recursive: true, force: true }); + } + fs.mkdirSync(extractDir, { recursive: true }); + + execSync(`tar -xzf ${prebuildFile} -C ${extractDir}`, { stdio: 'pipe' }); + + // Copy universal spawn-helper + fs.copyFileSync(`${tempDir}/spawn-helper-universal`, `${extractDir}/build/Release/spawn-helper`); + fs.chmodSync(`${extractDir}/build/Release/spawn-helper`, '755'); + + // Repackage prebuild + execSync(`tar -czf ${prebuildFile} -C ${extractDir} .`, { stdio: 'pipe' }); + + // Clean up extract directory + fs.rmSync(extractDir, { recursive: true, force: true }); + } + } + } + + // Clean up temp directory + fs.rmSync(tempDir, { recursive: true, force: true }); + console.log(' ✅ Universal spawn-helper binaries created and added to prebuilds'); + + } catch (error) { + console.error(` ❌ Failed to build universal spawn-helper: ${error.message}`); + // Clean up on error + if (fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true, force: true }); + } + process.exit(1); + } + + // Build authenticate-pam + console.log(' Building authenticate-pam...'); + const authenticatePamDir = path.join(__dirname, '..', 'node_modules', '.pnpm', 'authenticate-pam@1.0.5', 'node_modules', 'authenticate-pam'); + + for (const nodeVersion of NODE_VERSIONS) { + for (const arch of PLATFORMS.darwin || []) { + console.log(` → authenticate-pam for Node.js ${nodeVersion} ${arch}`); + try { + execSync(`npx prebuild --runtime node --target ${nodeVersion}.0.0 --arch ${arch} --tag-prefix authenticate-pam-v`, { + cwd: authenticatePamDir, + stdio: 'pipe', + env: { ...process.env, npm_config_target_platform: 'darwin', npm_config_target_arch: arch } + }); + } catch (error) { + console.error(` ❌ Failed to build authenticate-pam for Node.js ${nodeVersion} ${arch}`); + console.error(` Error: ${error.message}`); + process.exit(1); + } + } + } + + console.log('✅ macOS builds completed\n'); +} + +// Build for Linux using Docker +function buildLinux() { + console.log('🐧 Building Linux binaries using Docker...\n'); + + const dockerScript = ` + set -e + export CI=true + export DEBIAN_FRONTEND=noninteractive + + # Install dependencies including cross-compilation tools + apt-get update -qq + apt-get install -y -qq python3 make g++ git libpam0g-dev gcc-aarch64-linux-gnu g++-aarch64-linux-gnu + + # Add ARM64 architecture for cross-compilation + dpkg --add-architecture arm64 + apt-get update -qq + apt-get install -y -qq libpam0g-dev:arm64 + + # Install pnpm + npm install -g pnpm --force --no-frozen-lockfile + + # Install dependencies + cd /workspace + pnpm install --force --no-frozen-lockfile + + # Build node-pty for Linux + cd /workspace/node-pty + for node_version in ${NODE_VERSIONS.join(' ')}; do + for arch in ${(PLATFORMS.linux || []).join(' ')}; do + echo "Building node-pty for Node.js \$node_version \$arch" + if [ "\$arch" = "arm64" ]; then + export CC=aarch64-linux-gnu-gcc + export CXX=aarch64-linux-gnu-g++ + export AR=aarch64-linux-gnu-ar + export STRIP=aarch64-linux-gnu-strip + export LINK=aarch64-linux-gnu-g++ + else + unset CC CXX AR STRIP LINK + fi + npm_config_target_platform=linux npm_config_target_arch=\$arch \\ + npx prebuild --runtime node --target \$node_version.0.0 --arch \$arch || exit 1 + done + done + + # Build authenticate-pam for Linux + cd /workspace/node_modules/.pnpm/authenticate-pam@1.0.5/node_modules/authenticate-pam + for node_version in ${NODE_VERSIONS.join(' ')}; do + for arch in ${(PLATFORMS.linux || []).join(' ')}; do + echo "Building authenticate-pam for Node.js \$node_version \$arch" + if [ "\$arch" = "arm64" ]; then + export CC=aarch64-linux-gnu-gcc + export CXX=aarch64-linux-gnu-g++ + export AR=aarch64-linux-gnu-ar + export STRIP=aarch64-linux-gnu-strip + export LINK=aarch64-linux-gnu-g++ + else + unset CC CXX AR STRIP LINK + fi + npm_config_target_platform=linux npm_config_target_arch=\$arch \\ + npx prebuild --runtime node --target \$node_version.0.0 --arch \$arch --tag-prefix authenticate-pam-v || exit 1 + done + done + + echo "Linux builds completed successfully" + `; + + try { + execSync(`docker run --rm --platform linux/amd64 -v "\${PWD}:/workspace" -w /workspace node:22-bookworm bash -c '${dockerScript}'`, { + stdio: 'inherit', + cwd: path.join(__dirname, '..') + }); + console.log('✅ Linux builds completed\n'); + } catch (error) { + console.error('❌ Linux build failed:', error.message); + process.exit(1); + } +} + +// Copy and merge all prebuilds +function mergePrebuilds() { + console.log('📦 Merging prebuilds...\n'); + + const rootPrebuildsDir = path.join(__dirname, '..', 'prebuilds'); + const nodePtyPrebuildsDir = path.join(__dirname, '..', 'node-pty', 'prebuilds'); + + // Ensure root prebuilds directory exists + if (!fs.existsSync(rootPrebuildsDir)) { + fs.mkdirSync(rootPrebuildsDir, { recursive: true }); + } + + // Copy node-pty prebuilds + if (fs.existsSync(nodePtyPrebuildsDir)) { + console.log(' Copying node-pty prebuilds...'); + const nodePtyFiles = fs.readdirSync(nodePtyPrebuildsDir); + for (const file of nodePtyFiles) { + const srcPath = path.join(nodePtyPrebuildsDir, file); + const destPath = path.join(rootPrebuildsDir, file); + if (fs.statSync(srcPath).isFile()) { + fs.copyFileSync(srcPath, destPath); + console.log(` → ${file}`); + } + } + } + + // Copy authenticate-pam prebuilds + const authenticatePamPrebuildsDir = path.join(__dirname, '..', 'node_modules', '.pnpm', 'authenticate-pam@1.0.5', 'node_modules', 'authenticate-pam', 'prebuilds'); + if (fs.existsSync(authenticatePamPrebuildsDir)) { + console.log(' Copying authenticate-pam prebuilds...'); + const pamFiles = fs.readdirSync(authenticatePamPrebuildsDir); + for (const file of pamFiles) { + const srcPath = path.join(authenticatePamPrebuildsDir, file); + const destPath = path.join(rootPrebuildsDir, file); + if (fs.statSync(srcPath).isFile()) { + fs.copyFileSync(srcPath, destPath); + console.log(` → ${file}`); + } + } + } + + // Count total prebuilds + const allPrebuilds = fs.readdirSync(rootPrebuildsDir).filter(f => f.endsWith('.tar.gz')); + const nodePtyCount = allPrebuilds.filter(f => f.startsWith('node-pty')).length; + const pamCount = allPrebuilds.filter(f => f.startsWith('authenticate-pam')).length; + + console.log(`✅ Merged prebuilds: ${nodePtyCount} node-pty + ${pamCount} authenticate-pam = ${allPrebuilds.length} total\n`); +} + +// Main build process +async function main() { + // Step 0: Temporarily modify package.json for npm packaging + const packageJsonPath = path.join(__dirname, '..', 'package.json'); + const originalPackageJson = fs.readFileSync(packageJsonPath, 'utf8'); + const packageJson = JSON.parse(originalPackageJson); + + // Store original postinstall + const originalPostinstall = packageJson.scripts.postinstall; + + // Set install script for npm package + packageJson.scripts.install = 'prebuild-install || node scripts/postinstall-npm.js'; + delete packageJson.scripts.postinstall; + + // Add prebuild dependencies for npm package only + packageJson.dependencies['prebuild-install'] = '^7.1.3'; + + // Write modified package.json + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n'); + + // Restore original package.json on exit + const restorePackageJson = () => { + fs.writeFileSync(packageJsonPath, originalPackageJson); + }; + process.on('exit', restorePackageJson); + process.on('SIGINT', () => { restorePackageJson(); process.exit(1); }); + process.on('SIGTERM', () => { restorePackageJson(); process.exit(1); }); + + // Step 1: Standard build process (includes spawn-helper) + console.log('1️⃣ Running standard build process...\n'); + try { + execSync('node scripts/build.js', { stdio: 'inherit' }); + console.log('✅ Standard build completed\n'); + } catch (error) { + console.error('❌ Standard build failed:', error.message); + process.exit(1); + } + + // Step 2: Multi-platform native module builds (unless current-only) + if (!currentOnly) { + // Check Docker availability for Linux builds + const hasDocker = checkDocker(); + + // Build for macOS if included in targets + if (PLATFORMS.darwin && process.platform === 'darwin') { + buildMacOS(); + } else if (PLATFORMS.darwin && process.platform !== 'darwin') { + console.log('⚠️ Skipping macOS builds (not running on macOS)\n'); + } + + // Build for Linux if included in targets + if (PLATFORMS.linux && hasDocker && !noDocker) { + buildLinux(); + } else if (PLATFORMS.linux) { + console.log('⚠️ Skipping Linux builds (Docker not available or --no-docker specified)\n'); + } + + // Merge all prebuilds + mergePrebuilds(); + } + + // Step 3: Ensure node-pty is built for current platform + console.log('3️⃣ Ensuring node-pty is built for current platform...\n'); + const nodePtyBuild = path.join(__dirname, '..', 'node-pty', 'build', 'Release', 'pty.node'); + if (!fs.existsSync(nodePtyBuild)) { + console.log(' Building node-pty for current platform...'); + const nodePtyDir = path.join(__dirname, '..', 'node-pty'); + try { + execSync('npm run install', { cwd: nodePtyDir, stdio: 'inherit' }); + console.log('✅ node-pty built successfully'); + } catch (error) { + console.error('❌ Failed to build node-pty:', error.message); + process.exit(1); + } + } else { + console.log('✅ node-pty already built'); + } + + // Step 4: Create package-specific README + console.log('\n4️⃣ Creating npm package README...\n'); + const readmeContent = `# VibeTunnel CLI + +Full-featured terminal sharing server with web interface for macOS and Linux. Windows not yet supported. + +## Installation + +\`\`\`bash +npm install -g vibetunnel +\`\`\` + +## Requirements + +- Node.js >= 20.0.0 +- macOS or Linux (Windows not yet supported) +- Build tools for native modules (Xcode on macOS, build-essential on Linux) + +## Usage + +### Start the server + +\`\`\`bash +# Start with default settings (port 4020) +vibetunnel + +# Start with custom port +vibetunnel --port 8080 + +# Start without authentication +vibetunnel --no-auth +\`\`\` + +Then open http://localhost:4020 in your browser to access the web interface. + +### Use the vt command wrapper + +The \`vt\` command allows you to run commands with TTY forwarding: + +\`\`\`bash +# Monitor AI agents with automatic activity tracking +vt claude +vt claude --dangerously-skip-permissions + +# Run commands with output visible in VibeTunnel +vt npm test +vt python script.py +vt top + +# Launch interactive shell +vt --shell +vt -i + +# Update session title (inside a session) +vt title "My Project" +\`\`\` + +### Forward commands to a session + +\`\`\`bash +# Basic usage +vibetunnel fwd [args...] + +# Examples +vibetunnel fwd --session-id abc123 ls -la +vibetunnel fwd --session-id abc123 npm test +vibetunnel fwd --session-id abc123 python script.py +\`\`\` + +## Features + +- **Web-based terminal interface** - Access terminals from any browser +- **Multiple concurrent sessions** - Run multiple terminals simultaneously +- **Real-time synchronization** - See output in real-time +- **TTY forwarding** - Full terminal emulation support +- **Session management** - Create, list, and manage sessions +- **Cross-platform** - Works on macOS and Linux +- **No dependencies** - Just Node.js required + +## Package Contents + +This npm package includes: +- Full VibeTunnel server with web UI +- Command-line tools (vibetunnel, vt) +- Native PTY support for terminal emulation +- Web interface with xterm.js +- Session management and forwarding + +## Platform Support + +- macOS (Intel and Apple Silicon) +- Linux (x64 and ARM64) +- Windows: Not yet supported ([#252](https://github.com/amantus-ai/vibetunnel/issues/252)) + +## Documentation + +See the main repository for complete documentation: https://github.com/amantus-ai/vibetunnel + +## License + +MIT +`; + + const readmePath = path.join(__dirname, '..', 'README.md'); + fs.writeFileSync(readmePath, readmeContent); + console.log('✅ npm README created'); + + // Step 5: Clean up test files (keep screencap.js - it's needed) + console.log('\n5️⃣ Cleaning up test files...\n'); + const testFiles = [ + 'public/bundle/test.js', + 'public/test' // Remove entire test directory + ]; + + for (const file of testFiles) { + const filePath = path.join(__dirname, '..', file); + if (fs.existsSync(filePath)) { + if (fs.statSync(filePath).isDirectory()) { + fs.rmSync(filePath, { recursive: true, force: true }); + console.log(` Removed directory: ${file}`); + } else { + fs.unlinkSync(filePath); + console.log(` Removed file: ${file}`); + } + } + } + + // Step 6: Show final package info + console.log('\n6️⃣ Package summary...\n'); + + // Calculate total size + function getDirectorySize(dirPath) { + let totalSize = 0; + const items = fs.readdirSync(dirPath); + + for (const item of items) { + const itemPath = path.join(dirPath, item); + const stats = fs.statSync(itemPath); + + if (stats.isFile()) { + totalSize += stats.size; + } else if (stats.isDirectory()) { + totalSize += getDirectorySize(itemPath); + } + } + + return totalSize; + } + + const packageRoot = path.join(__dirname, '..'); + const totalSize = getDirectorySize(packageRoot); + const sizeMB = (totalSize / 1024 / 1024).toFixed(1); + + console.log(`📦 Package size: ${sizeMB} MB`); + + if (!currentOnly) { + const prebuildsDir = path.join(__dirname, '..', 'prebuilds'); + if (fs.existsSync(prebuildsDir)) { + const prebuildFiles = fs.readdirSync(prebuildsDir).filter(f => f.endsWith('.tar.gz')); + console.log(`🔧 Prebuilds: ${prebuildFiles.length} binaries included`); + } + } + + console.log('\n🎉 npm package build completed successfully!'); + console.log('\nNext steps:'); + console.log(' - Test locally: npm pack'); + console.log(' - Publish: npm publish'); + + // Restore original package.json + restorePackageJson(); +} + +main().catch(error => { + console.error('❌ Build failed:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/web/scripts/build.js b/web/scripts/build.js index 1a4d13fc..0b9a0967 100644 --- a/web/scripts/build.js +++ b/web/scripts/build.js @@ -64,7 +64,7 @@ async function build() { // Build server TypeScript console.log('Building server...'); - execSync('tsc', { stdio: 'inherit' }); + execSync('npx tsc', { stdio: 'inherit' }); // Bundle CLI console.log('Bundling CLI...'); diff --git a/web/scripts/docker-build-test.sh b/web/scripts/docker-build-test.sh new file mode 100755 index 00000000..3f79d1c9 --- /dev/null +++ b/web/scripts/docker-build-test.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +echo "Installing build dependencies..." +apt-get update && apt-get install -y python3 make g++ git + +echo "Setting up project..." +cd /workspace + +# Fix npm permissions issue in Docker +mkdir -p ~/.npm +chown -R $(id -u):$(id -g) ~/.npm + +# Install pnpm using corepack (more reliable) +corepack enable +corepack prepare pnpm@latest --activate + +# Install dependencies +cd /workspace +pnpm install --ignore-scripts --no-frozen-lockfile + +# Go to node-pty directory +cd node-pty + +# Install prebuild locally in node-pty +pnpm add -D prebuild + +# Build for Node.js 20 +echo "Building for Node.js 20..." +./node_modules/.bin/prebuild --runtime node --target 20.0.0 + +# List results +echo "Build complete. Prebuilds:" +ls -la prebuilds/ diff --git a/web/scripts/postinstall-npm.js b/web/scripts/postinstall-npm.js new file mode 100755 index 00000000..cdd73fd7 --- /dev/null +++ b/web/scripts/postinstall-npm.js @@ -0,0 +1,144 @@ +#!/usr/bin/env node + +/** + * Postinstall script for npm package + * Fallback build script when prebuild-install fails + */ + +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +console.log('Setting up native modules for VibeTunnel...'); + +// Check if we're in development (has src directory) or npm install +const isDevelopment = fs.existsSync(path.join(__dirname, '..', 'src')); + +if (isDevelopment) { + // In development, run the existing ensure-native-modules script + require('./ensure-native-modules.js'); + return; +} + +// Try prebuild-install first for each module +const tryPrebuildInstall = (name, dir) => { + console.log(`Trying prebuild-install for ${name}...`); + try { + execSync('prebuild-install', { + cwd: dir, + stdio: 'inherit', + env: { ...process.env, npm_config_cache: path.join(require('os').homedir(), '.npm') } + }); + console.log(`✓ ${name} prebuilt binary installed`); + return true; + } catch (error) { + console.log(` No prebuilt binary available for ${name}, will compile from source`); + return false; + } +}; + +// Handle both native modules with prebuild-install fallback +const modules = [ + { + name: 'node-pty', + dir: path.join(__dirname, '..', 'node-pty'), + build: path.join(__dirname, '..', 'node-pty', 'build', 'Release', 'pty.node'), + essential: true + }, + { + name: 'authenticate-pam', + dir: path.join(__dirname, '..', 'node_modules', 'authenticate-pam'), + build: path.join(__dirname, '..', 'node_modules', 'authenticate-pam', 'build', 'Release', 'authenticate_pam.node'), + essential: false + } +]; + +let hasErrors = false; + +for (const module of modules) { + if (!fs.existsSync(module.build)) { + // First try prebuild-install + const prebuildSuccess = tryPrebuildInstall(module.name, module.dir); + + if (!prebuildSuccess) { + // Fall back to compilation + console.log(`Building ${module.name} from source...`); + try { + execSync('node-gyp rebuild', { + cwd: module.dir, + stdio: 'inherit' + }); + console.log(`✓ ${module.name} built successfully`); + } catch (error) { + console.error(`Failed to build ${module.name}:`, error.message); + if (module.essential) { + console.error(`${module.name} is required for VibeTunnel to function.`); + console.error('You may need to install build tools for your platform:'); + console.error('- macOS: Install Xcode Command Line Tools'); + console.error('- Linux: Install build-essential package'); + hasErrors = true; + } else { + console.warn(`Warning: ${module.name} build failed. Some features may be limited.`); + } + } + } + } else { + console.log(`✓ ${module.name} already available`); + } +} + +if (hasErrors) { + process.exit(1); +} + +// Conditionally install vt symlink +if (!isDevelopment) { + try { + // Find npm's global bin directory + const npmBinDir = execSync('npm bin -g', { encoding: 'utf8' }).trim(); + const vtTarget = path.join(npmBinDir, 'vt'); + const vtSource = path.join(__dirname, '..', 'bin', 'vt'); + + // Check if vt already exists + if (fs.existsSync(vtTarget)) { + // Check if it's already our symlink + try { + const stats = fs.lstatSync(vtTarget); + if (stats.isSymbolicLink()) { + const linkTarget = fs.readlinkSync(vtTarget); + if (linkTarget.includes('vibetunnel')) { + console.log('✓ vt command already installed (VibeTunnel)'); + } else { + console.log('⚠️ vt command already exists (different tool)'); + console.log(' Use "vibetunnel" command or "npx vt" instead'); + } + } else { + console.log('⚠️ vt command already exists (not a symlink)'); + console.log(' Use "vibetunnel" command instead'); + } + } catch (e) { + // Ignore errors checking the existing file + console.log('⚠️ vt command already exists'); + console.log(' Use "vibetunnel" command instead'); + } + } else { + // Create the symlink + try { + fs.symlinkSync(vtSource, vtTarget); + // Make it executable + fs.chmodSync(vtTarget, '755'); + console.log('✓ vt command installed successfully'); + } catch (error) { + console.warn('⚠️ Could not install vt command:', error.message); + console.log(' Use "vibetunnel" command instead'); + } + } + } catch (error) { + // If we can't determine npm bin dir or create symlink, just warn + console.warn('⚠️ Could not install vt command:', error.message); + console.log(' Use "vibetunnel" command instead'); + } +} + +console.log('✓ VibeTunnel is ready to use'); +console.log('Run "vibetunnel --help" for usage information'); \ No newline at end of file diff --git a/web/scripts/test-docker-build.sh b/web/scripts/test-docker-build.sh new file mode 100755 index 00000000..fc18c488 --- /dev/null +++ b/web/scripts/test-docker-build.sh @@ -0,0 +1,55 @@ +#!/bin/bash +set -e + +echo "Testing Docker build for Linux x64..." + +# Create the build script +cat > docker-build-test.sh << 'EOF' +#!/bin/bash +set -e + +echo "Installing build dependencies..." +apt-get update && apt-get install -y python3 make g++ git + +echo "Setting up project..." +cd /workspace + +# Fix npm permissions issue in Docker +mkdir -p ~/.npm +chown -R $(id -u):$(id -g) ~/.npm + +# Install pnpm using corepack (more reliable) +corepack enable +corepack prepare pnpm@latest --activate + +# Install dependencies +cd /workspace +pnpm install --ignore-scripts --no-frozen-lockfile + +# Go to node-pty directory +cd node-pty + +# Install prebuild locally in node-pty +pnpm add -D prebuild + +# Build for Node.js 20 +echo "Building for Node.js 20..." +./node_modules/.bin/prebuild --runtime node --target 20.0.0 + +# List results +echo "Build complete. Prebuilds:" +ls -la prebuilds/ +EOF + +chmod +x docker-build-test.sh + +# Run the test +docker run --rm \ + -v "$(pwd)":/workspace \ + -w /workspace \ + --platform linux/amd64 \ + node:22-bookworm \ + /workspace/docker-build-test.sh + +# Clean up +rm docker-build-test.sh \ No newline at end of file diff --git a/web/src/client/assets/test.cast b/web/src/client/assets/test.cast deleted file mode 100644 index 655cfd65..00000000 --- a/web/src/client/assets/test.cast +++ /dev/null @@ -1,20 +0,0 @@ -{"version":2,"width":80,"height":24} -[0.353805917,"o","\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r\u001b]2;badlogic@Marios-MacBook-Pro:~\u0007"] -[0.353852709,"o","\u001b]1;~\u0007"] -[0.367397334,"o","\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36m~\u001b[00m \u001b[K"] -[0.367477375,"o","\u001b[?1h\u001b="] -[0.367502292,"o","\u001b[?2004h"] -[3.3307017500000002,"o","l"] -[3.640558792,"o","\bls"] -[3.970247959,"o","\u001b[?1l\u001b>"] -[3.970351,"o","\u001b[?2004l\r\r\n"] -[3.971092792,"o","\u001b]2;ls -G\u0007\u001b]1;ls\u0007"] -[3.9785605840000002,"o","192.168.1.9\r\n\u001b[1m\u001b[36mApplications\u001b[39;49m\u001b[0m\r\n"] -[3.978659209,"o","\u001b[1m\u001b[36mDataGripProjects\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mDesktop\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mDocuments\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mDownloads\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mLibrary\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mMovies\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mMusic\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mPictures\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mPublic\u001b[39;49m\u001b[0m\r\nRankers_Toreview.7z\r\n\u001b[1m\u001b[36mSupport\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mTemplates\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mUnrealEngine\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mVM.bundle\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mVulkanSDK\u001b[39;49m\u001b[0m\r\nandroid.webm\r\ncookies.txt\r\n\u001b[1m\u001b[36mdotTraceSnapshots\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mesp\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mfacebook-political-ads\u001b[39;49m\u001b[0m\r\nfirebase-service-credentials.json\r\n\u001b[1m\u001b[36mgo\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mgradle\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mjan\u001b[39;49m\u001b[0m\r\njcef_51747.log\r\njcef_77101.log\r\njcef_81453.log\r\n\u001b[1m\u001b[36mlol\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mnltk_data\u001b[39;49m\u001b[0m\r\noaJsApi.class.js.html\r\nout.mp4\r\noutput.html\r\npage.html\r\n"] -[3.978693917,"o","proxy.js\r\nscene.html\r\nsearch?query=babler&fd=2023-01-01&td=2024-05-30&s=date&p=1\r\nsegment_ctaudio_ridp0aa0br191998_cinit_mpd.m4s\r\nsegment_ctaudio_ridp0aa0br191998_cs0_mpd.m4s\r\nsegment_ctvideo_ridp0va0br801408_cinit_mpd.m4s\r\nsegment_ctvideo_ridp0va0br801408_cs0_mpd.m4s\r\nsynology\r\ntest.json\r\ntest.ts\r\ntest.txt\r\n\u001b[1m\u001b[36mtools\u001b[39;49m\u001b[0m\r\n\u001b[1m\u001b[36mtty-fwd-control\u001b[39;49m\u001b[0m\r\ntwitteria-001-2024-03-05.wav\r\n\u001b[1m\u001b[36mworkspaces\u001b[39;49m\u001b[0m\r\n\u001b[31mx.sh\u001b[39;49m\u001b[0m\r\n"] -[3.979061084,"o","\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] -[3.979122292,"o","\u001b]2;badlogic@Marios-MacBook-Pro:~\u0007"] -[3.979145417,"o","\u001b]1;~\u0007"] -[3.996851709,"o","\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[01;32m➜ \u001b[36m~\u001b[00m \u001b[K"] -[3.996903959,"o","\u001b[?1h\u001b="] -[3.996924625,"o","\u001b[?2004h"]