- Fix ListDir to support BusyBox/Alpine ls by falling back from GNU --time-style format, resolving CI test failures - Update parseLS to handle both GNU (epoch) and BusyBox (date string) formats - Fix claude-proxy streaming: always include usage in message_delta events to prevent Claude CLI from falling back to non-streaming mode - Fix claude-proxy non-streaming: ensure usage is always present in responses - Add paragraph separators between text blocks in Claude executor stream parser - Translate VNC proxy UI from Chinese to English - Rename sandbox-claude-playwright to sandbox-claude-browser across Dockerfiles, build scripts, and documentation Co-authored-by: Cursor <cursoragent@cursor.com>
132 lines
4 KiB
Bash
132 lines
4 KiB
Bash
#!/bin/bash
|
|
# VNC services startup script
|
|
# Shared by sandbox-claude-browser and sandbox-claude-desktop
|
|
# Starts: Xvfb (virtual display) + Window Manager + x11vnc + websockify (noVNC)
|
|
|
|
set -e
|
|
|
|
DISPLAY_NUM="${DISPLAY_NUM:-99}"
|
|
RESOLUTION="${RESOLUTION:-1920x1080x24}"
|
|
VNC_PORT="${VNC_PORT:-5900}"
|
|
NOVNC_PORT="${NOVNC_PORT:-6080}"
|
|
VNC_PASSWORD="${VNC_PASSWORD:-}"
|
|
DESKTOP="${SANDBOX_DESKTOP:-fluxbox}"
|
|
|
|
export DISPLAY=:${DISPLAY_NUM}
|
|
|
|
echo "[VNC] Starting VNC services..."
|
|
echo "[VNC] Display: :${DISPLAY_NUM}"
|
|
echo "[VNC] Resolution: ${RESOLUTION}"
|
|
echo "[VNC] Desktop: ${DESKTOP}"
|
|
|
|
# Start Xvfb (virtual framebuffer)
|
|
echo "[VNC] Starting Xvfb..."
|
|
Xvfb :${DISPLAY_NUM} -screen 0 ${RESOLUTION} &
|
|
XVFB_PID=$!
|
|
sleep 1
|
|
|
|
if ! kill -0 $XVFB_PID 2>/dev/null; then
|
|
echo "[VNC] ERROR: Xvfb failed to start"
|
|
exit 1
|
|
fi
|
|
echo "[VNC] Xvfb started (PID: $XVFB_PID)"
|
|
|
|
# Start D-Bus session bus (required for XFCE)
|
|
if [ "$DESKTOP" = "xfce" ] || [ "$DESKTOP" = "xfce4" ]; then
|
|
echo "[VNC] Starting D-Bus session bus..."
|
|
if command -v dbus-launch &> /dev/null; then
|
|
eval $(dbus-launch --sh-syntax)
|
|
export DBUS_SESSION_BUS_ADDRESS
|
|
echo "[VNC] D-Bus started: $DBUS_SESSION_BUS_ADDRESS"
|
|
else
|
|
echo "[VNC] WARNING: dbus-launch not found, XFCE may have limited functionality"
|
|
fi
|
|
fi
|
|
|
|
# Start window manager / desktop environment
|
|
echo "[VNC] Starting ${DESKTOP}..."
|
|
case "$DESKTOP" in
|
|
xfce|xfce4)
|
|
# Run XFCE setup script if exists (for Yao branding)
|
|
if [ -x /usr/local/bin/setup-xfce.sh ]; then
|
|
echo "[VNC] Running XFCE setup..."
|
|
/usr/local/bin/setup-xfce.sh || true
|
|
fi
|
|
# XFCE desktop environment
|
|
startxfce4 &
|
|
;;
|
|
fluxbox)
|
|
# Run Fluxbox setup script if exists (Yao branding, disable toolbar)
|
|
if [ -x /usr/local/bin/setup-fluxbox.sh ]; then
|
|
echo "[VNC] Running Fluxbox setup..."
|
|
/usr/local/bin/setup-fluxbox.sh || true
|
|
fi
|
|
# Minimal window manager for Playwright
|
|
fluxbox &
|
|
sleep 1
|
|
# Set wallpaper with feh if available (for Yao branding)
|
|
WALLPAPER="$HOME/.local/share/wallpapers/yao-wallpaper.png"
|
|
if [ -f "$WALLPAPER" ] && command -v feh &> /dev/null; then
|
|
echo "[VNC] Setting wallpaper..."
|
|
feh --bg-center "$WALLPAPER" || true
|
|
fi
|
|
;;
|
|
*)
|
|
# Default to fluxbox
|
|
if [ -x /usr/local/bin/setup-fluxbox.sh ]; then
|
|
/usr/local/bin/setup-fluxbox.sh || true
|
|
fi
|
|
fluxbox &
|
|
sleep 1
|
|
# Set wallpaper with feh if available
|
|
WALLPAPER="$HOME/.local/share/wallpapers/yao-wallpaper.png"
|
|
if [ -f "$WALLPAPER" ] && command -v feh &> /dev/null; then
|
|
feh --bg-center "$WALLPAPER" || true
|
|
fi
|
|
;;
|
|
esac
|
|
sleep 2
|
|
|
|
# Start x11vnc server
|
|
echo "[VNC] Starting x11vnc on port ${VNC_PORT}..."
|
|
VNC_ARGS="-display :${DISPLAY_NUM} -forever -shared -rfbport ${VNC_PORT} -noxdamage"
|
|
|
|
if [ -n "$VNC_PASSWORD" ]; then
|
|
mkdir -p ~/.vnc
|
|
x11vnc -storepasswd "$VNC_PASSWORD" ~/.vnc/passwd
|
|
VNC_ARGS="$VNC_ARGS -rfbauth ~/.vnc/passwd"
|
|
else
|
|
VNC_ARGS="$VNC_ARGS -nopw"
|
|
fi
|
|
|
|
x11vnc $VNC_ARGS &
|
|
X11VNC_PID=$!
|
|
sleep 1
|
|
|
|
if ! kill -0 $X11VNC_PID 2>/dev/null; then
|
|
echo "[VNC] ERROR: x11vnc failed to start"
|
|
exit 1
|
|
fi
|
|
echo "[VNC] x11vnc started (PID: $X11VNC_PID)"
|
|
|
|
# Start websockify (noVNC WebSocket proxy)
|
|
echo "[VNC] Starting websockify on port ${NOVNC_PORT}..."
|
|
websockify --web=/usr/share/novnc/ ${NOVNC_PORT} localhost:${VNC_PORT} &
|
|
WEBSOCKIFY_PID=$!
|
|
sleep 1
|
|
|
|
if ! kill -0 $WEBSOCKIFY_PID 2>/dev/null; then
|
|
echo "[VNC] ERROR: websockify failed to start"
|
|
exit 1
|
|
fi
|
|
echo "[VNC] websockify started (PID: $WEBSOCKIFY_PID)"
|
|
|
|
echo "[VNC] =================================="
|
|
echo "[VNC] VNC services started successfully"
|
|
echo "[VNC] Desktop: ${DESKTOP}"
|
|
echo "[VNC] VNC port: ${VNC_PORT}"
|
|
echo "[VNC] noVNC port: ${NOVNC_PORT}"
|
|
echo "[VNC] =================================="
|
|
|
|
# Note: Don't wait here - let the entrypoint continue
|
|
# Background processes will keep running
|