diff --git a/.gitignore b/.gitignore index eaab7002..fcd6eada 100644 --- a/.gitignore +++ b/.gitignore @@ -57,8 +57,10 @@ agent/test/UPGRADE_PLAN.md introduction/* !sandbox/docker/build.sh !sandbox/docker/vnc/*.sh +!sandbox/docker/desktop/config/*.sh sandbox/docker/yao-bridge-* sandbox/docker/claude-proxy-* sandbox/docker/claude/claude-proxy-* sandbox/proxy/claude-proxy-linux-* release/* +sandbox/TODO-VNC.md diff --git a/sandbox/docker/desktop/Dockerfile b/sandbox/docker/desktop/Dockerfile index 6fcd389c..aaa26c87 100644 --- a/sandbox/docker/desktop/Dockerfile +++ b/sandbox/docker/desktop/Dockerfile @@ -16,6 +16,8 @@ RUN sed -i 's|http://ports.ubuntu.com/ubuntu-ports|http://mirrors.mit.edu/ubuntu # Install X11, VNC, and XFCE desktop environment RUN apt-get update && apt-get install -y --no-install-recommends \ + # Sudo for sandbox user + sudo \ # Virtual display xvfb \ # VNC server @@ -23,6 +25,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # noVNC (HTML5 VNC client) and websockify novnc \ python3-websockify \ + # D-Bus (required for XFCE) + dbus-x11 \ # XFCE Desktop (full-featured but lightweight) xfce4 \ xfce4-terminal \ @@ -40,6 +44,14 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get remove -y xfce4-screensaver xscreensaver || true \ && rm -rf /var/lib/apt/lists/* +# Configure passwordless sudo for sandbox user +RUN echo "sandbox ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/sandbox && \ + chmod 0440 /etc/sudoers.d/sandbox + +# Create chromium wrapper script (uses Playwright's Chromium, starts maximized) +RUN echo '#!/bin/bash\nexec /home/sandbox/.cache/ms-playwright/chromium-1208/chrome-linux/chrome --no-sandbox --start-maximized "$@"' > /usr/local/bin/chromium && \ + chmod +x /usr/local/bin/chromium + # Optional: Install Playwright system dependencies (requires root) # Users can run browser automation in desktop mode too RUN npx playwright install-deps chromium || true @@ -58,6 +70,16 @@ COPY vnc/start-vnc.sh /usr/local/bin/start-vnc.sh COPY vnc/entrypoint-vnc.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/start-vnc.sh /usr/local/bin/entrypoint.sh +# Copy Yao branding assets +RUN mkdir -p /usr/share/yao +COPY desktop/config/yao-logo-48.png /usr/share/yao/yao-logo-48.png +COPY desktop/config/yao-logo-128.png /usr/share/yao/yao-logo-128.png +COPY desktop/config/yao-logo-256.png /usr/share/yao/yao-logo-256.png +COPY desktop/config/panel-launcher-chromium.desktop /usr/share/yao/panel-launcher-chromium.desktop +COPY desktop/config/workspace.desktop /usr/share/yao/workspace.desktop +COPY desktop/config/setup-xfce.sh /usr/local/bin/setup-xfce.sh +RUN chmod +x /usr/local/bin/setup-xfce.sh + # Environment variables for VNC ENV DISPLAY=:99 ENV VNC_PORT=5900 @@ -65,6 +87,8 @@ ENV NOVNC_PORT=6080 ENV RESOLUTION=1920x1080x24 ENV SANDBOX_VNC_ENABLED=true ENV SANDBOX_DESKTOP=xfce +# Set hostname for XFCE panel display +ENV HOSTNAME="Yao Sandbox" # Node.js environment - ensure global modules are accessible ENV NODE_PATH=/home/sandbox/.npm-global/lib/node_modules diff --git a/sandbox/docker/desktop/config/panel-launcher-chromium.desktop b/sandbox/docker/desktop/config/panel-launcher-chromium.desktop new file mode 100644 index 00000000..f392c51e --- /dev/null +++ b/sandbox/docker/desktop/config/panel-launcher-chromium.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Chromium +Comment=Access the Internet +GenericName=Web Browser +Exec=/usr/local/bin/chromium %U +Icon=org.xfce.webbrowser +Terminal=false +Categories=Network;WebBrowser; +MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;x-scheme-handler/http;x-scheme-handler/https; +StartupNotify=true diff --git a/sandbox/docker/desktop/config/setup-xfce.sh b/sandbox/docker/desktop/config/setup-xfce.sh new file mode 100644 index 00000000..75015a5a --- /dev/null +++ b/sandbox/docker/desktop/config/setup-xfce.sh @@ -0,0 +1,160 @@ +#!/bin/bash +# XFCE desktop configuration script +# Runs on container startup to set up Yao branding and default applications + +set -e + +XFCE_CONFIG_DIR="$HOME/.config/xfce4" +XFDESKTOP_DIR="$HOME/.config/xfce4/xfconf/xfce-perchannel-xml" +ICONS_DIR="$HOME/.local/share/icons/hicolor" +APPS_DIR="$HOME/.local/share/applications" +DESKTOP_DIR="$HOME/Desktop" + +# Create necessary directories +mkdir -p "$XFCE_CONFIG_DIR/panel" +mkdir -p "$XFDESKTOP_DIR" +mkdir -p "$ICONS_DIR/48x48/apps" +mkdir -p "$ICONS_DIR/128x128/apps" +mkdir -p "$ICONS_DIR/256x256/apps" +mkdir -p "$APPS_DIR" +mkdir -p "$DESKTOP_DIR" + +# Copy Yao logo to user icons directory +if [ -f /usr/share/yao/yao-logo-48.png ]; then + cp /usr/share/yao/yao-logo-48.png "$ICONS_DIR/48x48/apps/yao.png" + cp /usr/share/yao/yao-logo-128.png "$ICONS_DIR/128x128/apps/yao.png" + cp /usr/share/yao/yao-logo-256.png "$ICONS_DIR/256x256/apps/yao.png" + # Also copy to system location for panel icon + sudo cp /usr/share/yao/yao-logo-48.png /usr/share/pixmaps/yao.png 2>/dev/null || true + gtk-update-icon-cache "$ICONS_DIR" 2>/dev/null || true +fi + +# Copy Chromium launcher to applications +if [ -f /usr/share/yao/panel-launcher-chromium.desktop ]; then + cp /usr/share/yao/panel-launcher-chromium.desktop "$APPS_DIR/chromium-browser.desktop" +fi + +# Configure xfdesktop - hide default icons (File System, Home, Trash), keep only custom shortcuts +cat > "$XFDESKTOP_DIR/xfce4-desktop.xml" << 'XMLEOF' + + + + + + + + + + + + +XMLEOF + +# Copy workspace shortcut to desktop (named "Workspace" with folder icon) +if [ -f /usr/share/yao/workspace.desktop ]; then + cp /usr/share/yao/workspace.desktop "$DESKTOP_DIR/workspace.desktop" + chmod +x "$DESKTOP_DIR/workspace.desktop" +fi + +# Set Chromium as default browser +xdg-settings set default-web-browser chromium-browser.desktop 2>/dev/null || true + +# Configure XFCE panel - set Applications menu icon to Yao logo +# This will be applied when xfce4-panel starts +cat > "$XFDESKTOP_DIR/xfce4-panel.xml" << 'XMLEOF' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +XMLEOF + +echo "[XFCE Setup] Configuration complete" diff --git a/sandbox/docker/desktop/config/workspace.desktop b/sandbox/docker/desktop/config/workspace.desktop new file mode 100644 index 00000000..dbb5ebdb --- /dev/null +++ b/sandbox/docker/desktop/config/workspace.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=Workspace +Comment=Open Workspace folder +Icon=folder +Exec=thunar /workspace +Terminal=false +Categories=System;FileManager; diff --git a/sandbox/docker/desktop/config/yao-logo-128.png b/sandbox/docker/desktop/config/yao-logo-128.png new file mode 100644 index 00000000..d86a79ac Binary files /dev/null and b/sandbox/docker/desktop/config/yao-logo-128.png differ diff --git a/sandbox/docker/desktop/config/yao-logo-256.png b/sandbox/docker/desktop/config/yao-logo-256.png new file mode 100644 index 00000000..9ec6ffa7 Binary files /dev/null and b/sandbox/docker/desktop/config/yao-logo-256.png differ diff --git a/sandbox/docker/desktop/config/yao-logo-48.png b/sandbox/docker/desktop/config/yao-logo-48.png new file mode 100644 index 00000000..52c77970 Binary files /dev/null and b/sandbox/docker/desktop/config/yao-logo-48.png differ diff --git a/sandbox/docker/desktop/config/yao-logo.svg b/sandbox/docker/desktop/config/yao-logo.svg new file mode 100644 index 00000000..18f83e90 --- /dev/null +++ b/sandbox/docker/desktop/config/yao-logo.svg @@ -0,0 +1,16 @@ + + + Yaobots + + + + + + + + + + + + + \ No newline at end of file diff --git a/sandbox/docker/playwright/Dockerfile b/sandbox/docker/playwright/Dockerfile index be6faa46..e131744f 100644 --- a/sandbox/docker/playwright/Dockerfile +++ b/sandbox/docker/playwright/Dockerfile @@ -16,6 +16,8 @@ RUN sed -i 's|http://ports.ubuntu.com/ubuntu-ports|http://mirrors.mit.edu/ubuntu # Install X11, VNC, and minimal window manager RUN apt-get update && apt-get install -y --no-install-recommends \ + # Sudo for sandbox user + sudo \ # Virtual display xvfb \ # VNC server @@ -25,6 +27,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3-websockify \ # Minimal window manager (lightweight, perfect for Playwright) fluxbox \ + # Background/wallpaper utilities + feh \ + imagemagick \ # Fonts (required for proper browser rendering) fonts-liberation \ fonts-noto-cjk \ @@ -36,6 +41,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pulseaudio \ && rm -rf /var/lib/apt/lists/* +# Configure passwordless sudo for sandbox user +RUN echo "sandbox ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/sandbox && \ + chmod 0440 /etc/sudoers.d/sandbox + # Install Playwright system dependencies (requires root) # This installs system libraries needed by Chromium/Firefox RUN npx playwright install-deps chromium firefox || true @@ -50,11 +59,16 @@ RUN npm install -g playwright && \ USER root -# Copy VNC startup scripts +# Create directories for branding assets +RUN mkdir -p /usr/local/share/yao + +# Copy VNC startup scripts and branding assets # Note: Build context should be sandbox/docker/, so paths are relative to that COPY vnc/start-vnc.sh /usr/local/bin/start-vnc.sh COPY vnc/entrypoint-vnc.sh /usr/local/bin/entrypoint.sh -RUN chmod +x /usr/local/bin/start-vnc.sh /usr/local/bin/entrypoint.sh +COPY playwright/config/setup-fluxbox.sh /usr/local/bin/setup-fluxbox.sh +COPY playwright/config/yao-logo.png /usr/local/share/yao/yao-logo.png +RUN chmod +x /usr/local/bin/start-vnc.sh /usr/local/bin/entrypoint.sh /usr/local/bin/setup-fluxbox.sh # Environment variables for VNC ENV DISPLAY=:99 diff --git a/sandbox/docker/playwright/config/yao-logo.png b/sandbox/docker/playwright/config/yao-logo.png new file mode 100644 index 00000000..de7e59fb Binary files /dev/null and b/sandbox/docker/playwright/config/yao-logo.png differ diff --git a/sandbox/docker/vnc/start-vnc.sh b/sandbox/docker/vnc/start-vnc.sh index d7d0677b..57f0a03c 100644 --- a/sandbox/docker/vnc/start-vnc.sh +++ b/sandbox/docker/vnc/start-vnc.sh @@ -31,20 +31,58 @@ if ! kill -0 $XVFB_PID 2>/dev/null; then 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