#!/bin/bash # dsh-plugin-browser-use 一键安装:支持远程托管安装和本地 checkout 安装。 # 之后在 dsh 对话里即可使用 wc3_* 浏览器工具(需另装 wc3-chrome 扩展,见安装末尾提示)。 set -euo pipefail REPOSITORY="fatmind/dsh-plugin-browser-use" REMOTE_REF="main" DSH_HOME_DIR="${DSH_HOME:-$HOME/.dsh}" MANAGED_ROOT="$DSH_HOME_DIR/dsh-plugin-browser-use" MANAGED_MARKER="$MANAGED_ROOT/.managed-by-install-sh" ARCHIVE_URL="https://github.com/$REPOSITORY/archive/refs/heads/${REMOTE_REF}.tar.gz" BOOTSTRAP_TMP="" EXT_ZIP_URL="https://raw.githubusercontent.com/fatmind/webclaw3/main/dist/wc3-chrome-extension-0.6.0.zip" EXT_DIR="$DSH_HOME_DIR/wc3-chrome-extension" print_pair() { printf '%s\n' "$1" if [ -n "$2" ]; then printf ' %s\n' "$2"; fi } fail_pair() { printf '\n错误:%s\n' "$1" >&2 exit 1 } has_repo() { local candidate="$1" [ -f "$candidate/packages/browser-use/package.json" ] && [ -f "$candidate/packages/browser-use/lib/index.js" ] && [ -f "$candidate/webclaw3/scripts/webclaw3.mjs" ] && [ -f "$candidate/scripts/install.sh" ] } workspace_root_from_script() { local script_path="${BASH_SOURCE[0]:-}" local script_dir candidate [ -n "$script_path" ] && [ -f "$script_path" ] || return 1 script_dir="$(cd "$(dirname "$script_path")" && pwd)" candidate="$(cd "$script_dir/.." && pwd)" has_repo "$candidate" || return 1 printf '%s\n' "$candidate" } require_command() { command -v "$1" >/dev/null 2>&1 || fail_pair "未找到 $1;请先安装。" } cleanup_bootstrap() { if [ -n "$BOOTSTRAP_TMP" ] && [ -d "$BOOTSTRAP_TMP" ]; then rm -rf -- "$BOOTSTRAP_TMP" fi } bootstrap_remote_install() { local archive source_dir temp_base="${TMPDIR:-/tmp}" require_command curl require_command tar require_command rsync if [ -d "$MANAGED_ROOT" ] && [ ! -f "$MANAGED_MARKER" ] && [ -n "$(ls -A "$MANAGED_ROOT" 2>/dev/null)" ]; then fail_pair "$MANAGED_ROOT 已存在且不是脚本托管的安装目录;为避免覆盖,请移动该目录或在其中运行 ./scripts/install.sh。" fi print_pair "未检测到本地 checkout,切换到免 clone 安装(下载 $REPOSITORY@$REMOTE_REF)。" "" BOOTSTRAP_TMP="$(mktemp -d "$temp_base/wc3-plugin-install.XXXXXX")" trap cleanup_bootstrap EXIT HUP INT TERM archive="$BOOTSTRAP_TMP/source.tar.gz" source_dir="$BOOTSTRAP_TMP/source" mkdir -p "$source_dir" curl --fail --location --silent --show-error --retry 3 "$ARCHIVE_URL" --output "$archive" tar -xzf "$archive" -C "$source_dir" --strip-components=1 has_repo "$source_dir" || fail_pair "下载内容不完整,未修改现有安装。" mkdir -p "$MANAGED_ROOT" touch "$MANAGED_MARKER" rsync -a --delete-after \ --exclude 'node_modules/' \ --exclude '.managed-by-install-sh' \ "$source_dir/" "$MANAGED_ROOT/" cleanup_bootstrap trap - EXIT HUP INT TERM print_pair "安装文件已就绪:$MANAGED_ROOT" "" exec /bin/bash "$MANAGED_ROOT/scripts/install.sh" } if ROOT="$(workspace_root_from_script)"; then : else bootstrap_remote_install fi PLUGIN="$ROOT/packages/browser-use" require_command pnpm printf '\n[1/3] 安装插件依赖\n' (cd "$PLUGIN" && pnpm install --frozen-lockfile >/dev/null 2>&1 || pnpm install >/dev/null) printf '[2/3] 注册到本机 web profile\n' (cd "$PLUGIN" && pnpm exec dsh plugin --profile web add "dsh-plugin-browser-use@link:$PLUGIN" >/dev/null) printf '[3/3] 检查浏览器通道\n' # 先起 relay(幂等,已在跑则跳过),再看扩展是否已连接--已连接说明扩展装好且在跑, # 无需下载任何东西。等价于 webclaw3 doctor 的探索层检查(Node/relay/扩展), # 但不触发完整 doctor 的生成组件安装(pipeline/AK)等副作用。 ENGINE="$ROOT/webclaw3" node "$ENGINE/scripts/webclaw3.mjs" start --port 3459 >/dev/null 2>&1 || true extension_connected=0 for _ in $(seq 1 15); do if curl -s --connect-timeout 2 --max-time 3 http://127.0.0.1:3459/api/status 2>/dev/null | grep -q '"extensionConnected":true'; then extension_connected=1 break fi sleep 2 done if [ "$extension_connected" = "1" ]; then print_pair "浏览器扩展已连接,无需任何额外操作。" "" else # 扩展未连接:可能是没装,也可能是 Chrome 没开/扩展被停用。尝试快速下载一份扩展文件 # (--connect-timeout/--speed-* 保证慢速网络下快速失败,不卡死),供用户加载或更新。 EXT_ZIP_TMP="$(mktemp -t wc3-chrome-extension.XXXXXX).zip" if curl --fail --location --silent --show-error \ --connect-timeout 5 --max-time 60 --speed-time 10 --speed-limit 1024 \ "$EXT_ZIP_URL" --output "$EXT_ZIP_TMP" 2>/dev/null && unzip -o -q "$EXT_ZIP_TMP" -d "$EXT_DIR" 2>/dev/null; then rm -f "$EXT_ZIP_TMP" print_pair "扩展文件已解压到:$EXT_DIR" "(也可以直接用 https://github.com/fatmind/wc3-chrome 的源码安装)" else rm -f "$EXT_ZIP_TMP" print_pair "扩展自动下载失败,请手动获取:" "https://github.com/fatmind/wc3-chrome" fi fi printf '\n' print_pair "安装完成。接下来:" "" if [ "$extension_connected" = "1" ]; then printf ' 1. 重启 dsh(profile 只在启动时加载)\n' printf ' 2. 对 dsh 说一句「检查浏览器环境」即可验证 wc3 工具\n' else printf ' 1. 打开 Chrome 的 chrome://extensions,右上角开启「开发者模式」,\n' printf ' 点「加载已解压的扩展程序」,选择上面的扩展文件夹\n' printf ' 2. 重启 dsh(profile 只在启动时加载),然后说一句「检查浏览器环境」即可验证\n' fi printf '\n' print_pair "更新方式:重新运行本脚本即可。" ""