#!/bin/bash # Browser selection: chrome (default), chromium, brave, msedge BROWSER="${1:-chrome}" BROWSER_FLAGS=( --remote-allow-origins=* --no-first-run --no-service-autorun --no-default-browser-check --homepage=about:blank --no-pings --password-store=basic --disable-infobars --disable-breakpad --disable-dev-shm-usage --disable-session-crashed-bubble --disable-search-engine-choice-screen --user-data-dir="$HOME/.config/g4f-nodriver" --disable-features=IsolateOrigins,site-per-process --remote-debugging-host=127.0.0.1 --remote-debugging-port=57011 ) # Resolve a Windows path to the correct format for the current shell environment. # Git Bash uses /c/... whereas WSL uses /mnt/c/... win_path() { local p="$1" # Git Bash / MSYS2: OSTYPE contains "msys" or "cygwin" if [[ "$OSTYPE" == msys* || "$OSTYPE" == cygwin* ]]; then # Convert "C:\foo\bar" or "/mnt/c/foo/bar" -> "/c/foo/bar" p="${p//\\//}" # backslash -> slash p="${p/\/mnt\/c\//\/c\/}" # /mnt/c/ -> /c/ echo "$p" else # WSL / Linux: convert /c/ -> /mnt/c/ p="${p//\\//}" p="${p/\/c\//\/mnt\/c\/}" echo "$p" fi } # Returns the first existing Windows path from a list of candidate paths. find_win_bin() { for raw in "$@"; do local p p="$(win_path "$raw")" [ -f "$p" ] && echo "$p" && return done } case "$BROWSER" in chromium) for bin in chromium chromium-browser chromium-freeworld; do if command -v "$bin" &>/dev/null; then BROWSER_BIN="$bin"; break fi done if [ -z "$BROWSER_BIN" ]; then BROWSER_BIN="$(find_win_bin \ "/c/Program Files/Chromium/Application/chrome.exe" \ "/mnt/c/Program Files/Chromium/Application/chrome.exe" \ "$LOCALAPPDATA/Microsoft/WindowsApps/chromium.exe")" fi ;; brave) for bin in brave-browser brave brave-browser-stable; do if command -v "$bin" &>/dev/null; then BROWSER_BIN="$bin"; break fi done if [ -z "$BROWSER_BIN" ]; then BROWSER_BIN="$(find_win_bin \ "/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe" \ "/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe" \ "/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe" \ "/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe" \ "$LOCALAPPDATA/BraveSoftware/Brave-Browser/Application/brave.exe" \ "$LOCALAPPDATA/Microsoft/WindowsApps/brave.exe")" fi ;; msedge) for bin in microsoft-edge msedge microsoft-edge-stable; do if command -v "$bin" &>/dev/null; then BROWSER_BIN="$bin"; break fi done if [ -z "$BROWSER_BIN" ]; then BROWSER_BIN="$(find_win_bin \ "/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" \ "/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" \ "/c/Program Files/Microsoft/Edge/Application/msedge.exe" \ "/mnt/c/Program Files/Microsoft/Edge/Application/msedge.exe" \ "$LOCALAPPDATA/Microsoft/Edge/Application/msedge.exe" \ "$LOCALAPPDATA/Microsoft/WindowsApps/msedge.exe")" fi # Last resort: ask Windows itself if [ -z "$BROWSER_BIN" ] && command -v powershell.exe &>/dev/null; then BROWSER_BIN="$(powershell.exe -NoProfile -Command \ "(Get-Command msedge -ErrorAction SilentlyContinue).Source" 2>/dev/null | tr -d '\r')" fi ;; chrome|*) for bin in google-chrome google-chrome-stable google-chrome-unstable; do if command -v "$bin" &>/dev/null; then BROWSER_BIN="$bin"; break fi done if [ -z "$BROWSER_BIN" ]; then BROWSER_BIN="$(find_win_bin \ "/c/Program Files (x86)/Google/Chrome/Application/chrome.exe" \ "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe" \ "/c/Program Files/Google/Chrome/Application/chrome.exe" \ "/mnt/c/Program Files/Google/Chrome/Application/chrome.exe" \ "$LOCALAPPDATA/Google/Chrome/Application/chrome.exe" \ "$LOCALAPPDATA/Microsoft/WindowsApps/chrome.exe")" fi ;; esac if [ -z "$BROWSER_BIN" ]; then echo "Error: No browser binary found for '$BROWSER'" >&2 exit 1 fi PROC_NAME="$(basename "$BROWSER_BIN")" echo "Starting browser: $BROWSER_BIN" if [[ "$BROWSER_BIN" == *.exe ]]; then # Windows: launch once and exit — the browser manages its own lifecycle rm -f ~/.g4f/cookies/.browser_is_open "$BROWSER_BIN" "${BROWSER_FLAGS[@]}" else # Linux: loop and relaunch if the browser exits while true; do rm -f ~/.g4f/cookies/.browser_is_open "$BROWSER_BIN" "${BROWSER_FLAGS[@]}" sleep 5 done fi