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 @@
+
+
\ 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