From b1d1c5697018b41d482ffe5d5b00f098d98b4b5b Mon Sep 17 00:00:00 2001 From: Kristjan Kruus Date: Mon, 23 Mar 2026 15:44:46 +0200 Subject: [PATCH] feat: add auto-login functionality for Bluesky with session persistence --- docker/docker-compose.yml | 2 ++ docker/entrypoint.sh | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1c4d92291..1fd161d55 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -38,6 +38,8 @@ services: - AGENT_BROWSER_HEADED=true - AGENT_BROWSER_ARGS=--no-sandbox,--disable-blink-features=AutomationControlled - DISPLAY=:99 + - BSKY_HANDLE=${BSKY_HANDLE} + - BSKY_APP_PASSWORD=${BSKY_APP_PASSWORD} ports: - "127.0.0.1:18790:18790" - "192.168.1.169:18790:18790" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index e27d4d479..1fe6667cc 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -20,6 +20,45 @@ if [ -f "$BSKY_SCRIPT" ] && [ ! -e /usr/local/bin/bsky ]; then echo "bsky CLI symlinked to PATH" fi +# Bluesky: persist session config inside mounted volume and auto-login +BSKY_CONFIG_DIR="${HOME}/.picoclaw/bsky" +mkdir -p "$BSKY_CONFIG_DIR" +export XDG_CONFIG_HOME="${HOME}/.picoclaw" +# bsky.py stores config at ~/.config/bsky/config.json — symlink to mounted volume +if [ ! -e "${HOME}/.config/bsky" ]; then + mkdir -p "${HOME}/.config" + ln -sf "$BSKY_CONFIG_DIR" "${HOME}/.config/bsky" +fi + +# Auto-login to Bluesky if credentials provided and no valid session exists +if [ -n "$BSKY_HANDLE" ] && [ -n "$BSKY_APP_PASSWORD" ]; then + BSKY_SCRIPT="${HOME}/.picoclaw/workspace/skills/bluesky/scripts/bsky.py" + if [ -f "$BSKY_SCRIPT" ]; then + # Check if already logged in (whoami prints "Not logged in" when no session) + WHOAMI_OUT=$(python3 "$BSKY_SCRIPT" whoami 2>&1 || true) + if echo "$WHOAMI_OUT" | grep -qi "not logged in\|error\|failed\|expired"; then + echo "Logging in to Bluesky as $BSKY_HANDLE..." + python3 "$BSKY_SCRIPT" login --handle "$BSKY_HANDLE" --password "$BSKY_APP_PASSWORD" && \ + echo "Bluesky login successful" || \ + echo "WARNING: Bluesky login failed, continuing without it" + elif echo "$WHOAMI_OUT" | grep -qi "Handle:"; then + echo "Bluesky: already logged in ($WHOAMI_OUT)" + else + echo "Logging in to Bluesky as $BSKY_HANDLE..." + python3 "$BSKY_SCRIPT" login --handle "$BSKY_HANDLE" --password "$BSKY_APP_PASSWORD" && \ + echo "Bluesky login successful" || \ + echo "WARNING: Bluesky login failed, continuing without it" + fi + fi +fi + +# Clean stale Chromium lock files from previous container sessions +CHROME_PROFILE="${AGENT_BROWSER_PROFILE:-${HOME}/.picoclaw/workspace/browser/picoclaw}" +if [ -d "$CHROME_PROFILE" ]; then + rm -f "$CHROME_PROFILE/SingletonLock" "$CHROME_PROFILE/SingletonCookie" "$CHROME_PROFILE/SingletonSocket" + echo "Chromium profile lock files cleaned" +fi + # Start virtual framebuffer for headed chromium (agent-browser) if [ -n "$DISPLAY" ] && command -v Xvfb >/dev/null 2>&1; then Xvfb "$DISPLAY" -screen 0 1280x1024x24 -ac &