Commit Graph

202 Commits

Author SHA1 Message Date
ShawnPana e8576859d7 docs(cli): update README with all new commands
- Installation: one-line install with platform notes, manual install option
- Agent tasks: local and remote mode with all flags
- Task management: list, status, stop, logs
- Cloud sessions: list, get, stop
- Tunnels: expose local servers to cloud browsers
- Profile management: local and cloud profiles
- New commands: hover, dblclick, rightclick, cookies, wait, get

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 10:37:24 -08:00
ShawnPana fd3db0615a fix(cli): hide server console window on Windows
Use CREATE_NO_WINDOW instead of DETACHED_PROCESS to prevent
a blank console window from appearing when the server starts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 23:19:56 -08:00
ShawnPana 5e811e2ba4 fix(cli): Windows compatibility fixes for session server
- Use ctypes.OpenProcess on Windows for process existence check
  (os.kill raises WinError 87 or SystemError on Windows)
- Use 127.0.0.1 instead of localhost to avoid IPv6 binding issues
- Add reuse_address=True to asyncio.start_server for TCP port reuse

Fixes issues reported in:
- #3912 (os.kill fails on Windows)
- #3918 (WinError 87 in is_server_running)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 22:48:53 -08:00
ShawnPana d4b1a243c0 fix(cli): doctor command now shows check results
Previously doctor said "See details above" but never printed the actual
check results. Now prints each check with status icon and details.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 22:24:01 -08:00
ShawnPana 7769fbec94 perf(cli): parallelize session stop --all for faster cleanup
Use asyncio.to_thread() with thread pool to stop multiple cloud
sessions concurrently instead of sequentially. Results in ~3.5x
speedup (3.8s vs 13.3s for 5 sessions).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 17:16:27 -08:00
ShawnPana da1380ad77 fix(cli): simplify _run_async to prevent coroutine reuse error
The previous implementation tried to handle various event loop edge
cases but had a bug: if run_until_complete started a coroutine and
then raised RuntimeError, it would try to re-run the same consumed
coroutine with asyncio.run(), causing "cannot reuse already awaited
coroutine" errors.

For CLI code, asyncio.run() is the correct approach as it creates
a fresh event loop. This simplification fixes the confusing error
message when users pass truncated task IDs.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 16:31:20 -08:00
ShawnPana 4935afbf44 fix(lint): address ruff linting and formatting issues
- setup.py: Add noqa comment for intentional import check (F401)
- tunnel_manager.py: Add noqa for blocking open in async context (ASYNC230)
- profile.py, setup.py: Auto-format with ruff

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 15:45:22 -08:00
ShawnPana 2ff264c6a6 fix(cli): use --mode instead of --profile for setup command handler
The setup command parser was changed to use --mode but the handler was
still passing args.profile and reading result["profile"]. Fixed both
to use mode consistently.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 15:41:22 -08:00
ShawnPana 35271ed802 fix: address cubic-dev-ai code review concerns from PR #4078
- agent.py: Move API key check inside remote mode block only, allowing
  local mode to work with OPENAI/ANTHROPIC keys without BROWSER_USE_API_KEY
- tunnel_manager.py: Close log file handle on success path to prevent
  file descriptor leak
- profile.py: Use stderr for progress messages when --json flag is set;
  add cleanup_cloud_profile() to delete orphaned cloud profiles on sync failure
- install.sh: Add guard for --api-key requiring a value; warn on unknown
  arguments instead of silently ignoring; fix read -p with < /dev/tty
  for piped install (curl | bash)
- test_setup_command.py: Remove all unittest.mock usage per repo guidelines,
  replace with real function calls that verify structure and logic

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 15:38:01 -08:00
ShawnPana 723f3335b2 feat(cli): add token-efficient task monitoring with duration display
- Default task status shows only latest step (token efficient for agents)
- Add --compact/-c flag to show all steps with reasoning
- Add --verbose/-v flag to show all steps with URLs + actions
- Add --last/-n, --reverse/-r, --step/-s flags for navigating long tasks
- Display duration for tasks (e.g., "18s", "5m 13s") and sessions
- Format proxy cost to 2 decimal places in session output
- Update SKILL.md docs with recommended monitoring workflow
2026-02-10 14:39:20 -08:00
ShawnPana a568f45979 feat(cli): add cloud task/session management and subagent support
Cloud API Integration:
- Add cloud_task.py with full Cloud API client (tasks, sessions)
- Support for task creation, status polling, stopping, and logs
- Session management: create, list, get, stop, delete

Agent Task Options (remote mode):
- --llm: specify model (gpt-4o, claude-sonnet-4-20250514, gemini-2.0-flash)
- --proxy-country: proxy location (default: us)
- --session-id: reuse existing cloud session
- --keep-alive: preserve session after task
- --no-wait: async execution, return task_id immediately
- --stream: stream status updates
- --flash: fast execution mode
- --thinking: extended reasoning
- --vision/--no-vision: control vision capability

CLI Commands:
- task list [--limit N] [--status running|finished] [--json]
- task status <task-id> [--json]
- task stop <task-id>
- task logs <task-id>
- session list [--limit N] [--status active|stopped] [--json]
- session get <session-id> [--json]
- session stop <session-id> | --all

Documentation:
- Add comprehensive subagent examples to SKILL.md files
- Document session=agent, task=work mental model
- Examples for parallel agents, session reuse, agent management
2026-02-10 12:33:05 -08:00
ShawnPana b2641ea3b7 fix(cli): redirect cloudflared stderr to file to prevent SIGPIPE
The pipe-based stderr was causing cloudflared to get SIGPIPE when
the parent Python process exited (pipe closed). Now stderr goes to
a log file at ~/.browser-use/tunnels/<port>.log which cloudflared
can write to indefinitely without blocking or dying.
2026-02-09 21:51:24 -08:00
ShawnPana 9420c90569 fix(cli): tunnel processes now survive CLI exit
- Spawn cloudflared as daemon with start_new_session=True
- Track tunnels via PID files in ~/.browser-use/tunnels/ instead of memory
- Properly add --all flag to tunnel argparser (fixes unrecognized args error)
- Clean up stale PID files when tunnel process has died

This fixes the issue where cloudflared would become a zombie/defunct process
immediately after browser-use tunnel returned, causing 530 errors.
2026-02-09 21:44:31 -08:00
ShawnPana c0dd7875b8 feat(install): mode-based installation with interactive TUI
Add installation mode selection that determines which browser modes are
available at runtime. This enables lightweight remote-only installs for
sandboxed agents (skipping ~300MB Chromium download).

## Install Modes

- `--remote-only`: Only remote mode, installs cloudflared, skips Chromium
- `--local-only`: Only local modes (chromium/real), skips cloudflared
- `--full`: All modes available (default interactive selection)

## Runtime Behavior

- Single installed mode becomes the default (no --browser flag needed)
- Requesting unavailable mode shows clear error with reinstall instructions
- No config file = all modes available (backward compat for pip users)

## Changes

**New: browser_use/skill_cli/install_config.py**
- Manages ~/.browser-use/install-config.json
- get_config(), save_config(), is_mode_available(), get_default_mode()
- get_mode_unavailable_error() for helpful reinstall guidance

**Modified: browser_use/skill_cli/main.py**
- build_parser() uses config for --browser choices and default
- Validates mode availability before starting session server

**Modified: browser_use/skill_cli/sessions.py**
- create_browser_session() validates mode before creation

**Modified: install.sh**
- Command-line flags: --full, --remote-only, --local-only, --api-key
- Interactive TUI with fallback: gum → whiptail → pure bash menu
- Conditional dependency installation based on selected modes
- Writes install-config.json with installed modes

**Updated: skills/remote-browser/SKILL.md**
- Simplified examples (no --browser remote needed with --remote-only)
- Updated setup instructions for mode-based installation

**New: tests/ci/test_install_config.py**
- 13 tests covering config module
2026-02-09 20:36:08 -08:00
ShawnPana 94c336407d fix(cli): make tunnel command independent of browser sessions
Previously, `browser-use tunnel 3000` would start a session server with
the default browser mode (chromium), which poisoned subsequent
`--browser remote` commands with a mode mismatch error.

Now tunnel commands are handled directly in main.py without starting a
browser session:

  npm run dev &
  browser-use tunnel 3000                          # No session created
  browser-use --browser remote open <tunnel-url>   # Works!

Changes:
- Move tunnel logic to standalone functions in tunnel_manager.py
- Handle tunnel commands in main.py before ensure_server()
- Tunnels persist across browser-use close (independent lifecycle)
- Add `browser-use tunnel stop --all` command

Breaking behavior change:
- `browser-use close` no longer stops tunnels
- Use `browser-use tunnel stop <port>` or `tunnel stop --all` explicitly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-09 18:38:39 -08:00
ShawnPana 9f51461bbd fix(cli): error when requesting remote browser on local session + improve docs
When a session is started without --browser remote and a subsequent command
uses --browser remote, the CLI now errors with guidance instead of silently
using the local browser (which loses cloud features like live_url).

Code changes:
- Add session metadata file to track browser_mode per session
- Error only when remote requested but session is local
- Allow local-on-remote (user gets more features than requested)
- Clean up metadata on session close

SKILL.md improvements:
- Clarify that --browser remote only needed on FIRST command
- Add table showing session modes
- Add "What happens if you forget" section with error example
- Add troubleshooting entry for mode mismatch error

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-09 18:20:06 -08:00
ShawnPana 3c9b2501ac fix(cli): detect browser mode mismatch between existing session and requested mode
When a session is started with --browser chromium and a subsequent command
uses --browser remote (or vice versa), the CLI now detects the mismatch and
provides actionable error guidance instead of silently using the wrong mode.

Changes:
- Add get_session_metadata_path() to track session config in temp files
- Write browser_mode, headed, profile to metadata on server start
- Check metadata in ensure_server() and error if modes don't match
- Clean up metadata file on session close

Example error:
  Error: Session 'default' is running with --browser chromium,
  but --browser remote was requested.

  Options:
    1. Use existing browser: browser-use --browser chromium <command>
    2. Use different session: browser-use --browser remote --session other <command>
    3. Close existing session: browser-use close

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-09 18:10:46 -08:00
ShawnPana f40235242a refactor: remove pycloudflared, install cloudflared directly in install.sh
- Remove pycloudflared dependency from pyproject.toml
- Simplify tunnel_manager.py to just use shutil.which('cloudflared')
- Add install_cloudflared() to install.sh that downloads binary from
  official Cloudflare GitHub releases based on platform/arch
- Update SKILL.md with manual cloudflared install instructions
- Update setup.py messages for missing cloudflared

install.sh supported platforms:
- Linux (x86_64, arm64) - full support, downloads binary to ~/.local/bin
- macOS (Intel, Apple Silicon) - full support, uses brew or direct download
- Windows WSL - works (treated as Linux)
- Native Windows - not supported (bash script), use manual install
2026-02-09 17:03:56 -08:00
ShawnPana 9520a0b04e feat: frictionless installation system with setup/doctor commands
- Add TunnelManager for auto-install cloudflared via pycloudflared
- Add 'browser-use setup' command with profile-based configuration
- Add 'browser-use doctor' command for health checks
- Add install.sh bootstrap script (dev testing version)
- Add pycloudflared dependency
- Add comprehensive tests for new functionality
2026-02-09 16:09:38 -08:00
Gregor Žunič 9d7a0c74ed Add bu tunnel command and remote-browser skill
- New `tunnel` command: expose localhost ports via Cloudflare quick tunnels
  (`bu tunnel 3000` → trycloudflare.com URL, idempotent, auto-cleanup on session close)
- New `skills/remote-browser/SKILL.md`: guides sandboxed agents through
  cloud browser + tunnel workflow
- TunnelInfo dataclass on SessionInfo for tunnel lifecycle management
- Tunnel dispatch in both SessionServer and CLI arg parser

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:14:42 -08:00
ShawnPana 92de59c6cc fix(cli): fix pyright type errors in CLI
- Remove invalid cdp_url parameter from create_browser_session calls
- Replace deleted GetCookiesEvent with direct _cdp_get_cookies() call
- Add type assertion for cookies_file after error check
- Use unique variable names for CDP results to avoid type conflicts
- Add type ignores for CDP typed return values used as dicts
2026-02-02 13:05:11 -08:00
ShawnPana 4de76454a7 fix(cli): fix error check in profile sync and remove deleted event import 2026-02-02 10:57:21 -08:00
ShawnPana ad47a97518 style: apply ruff formatting 2026-02-02 10:51:08 -08:00
shawn pana 7d02013b71 Merge branch 'main' into main 2026-02-02 10:47:30 -08:00
ShawnPana a961021670 refactor(cli): move CDP logic into CLI, remove events and watchdogs
Move all CLI-specific CDP logic directly into browser.py command
handlers instead of using events and watchdogs. This keeps the CLI
self-contained and avoids adding CLI-specific code to the core library.

- Remove 14 CLI-specific events from events.py
- Remove 3 watchdog files (cookies, interactions, wait)
- Remove watchdog registrations from session.py
- Implement direct CDP calls in browser.py for cookies, wait, hover,
  dblclick, rightclick, and get commands
2026-02-02 10:44:30 -08:00
ShawnPana 545004322b style: fix formatting 2026-01-31 22:29:57 -08:00
ShawnPana cddc00f6da fix: delegate --template flag to init_main for full template support 2026-01-31 22:24:23 -08:00
Gregor Žunič 0cb96ea5d0 fix: restore install, init, --mcp commands in skill_cli
PR #3911 changed the browser-use entry point to skill_cli/main.py but
didn't port the early command interception for install, init, --template,
and --mcp. This broke:

- `browser-use install` (installs Chromium via playwright)
- `browser-use init` (generates template files)
- `browser-use --template` (direct template generation)
- `browser-use --mcp` (MCP server mode)

This fix adds early command interception to skill_cli/main.py, matching
the behavior from browser_use/cli.py. Commands are handled before argparse
to avoid loading heavy dependencies for simple setup tasks.

Also adds tests to prevent regression.
2026-01-31 21:44:19 -08:00
Saurav Panda a7250241b2 Revert "feat(cli): add --cdp-url flag to connect to existing browser via CDP (#3927)"
This reverts commit e0504b1c7d, reversing
changes made to f798633548.
2026-01-31 21:11:54 -08:00
ShawnPana 2d992c3726 feat(cli): add cloud profile management and cookie sync
- Add cloud profile commands: list, create, get, update, delete
- Add profile sync command to sync local Chrome cookies to cloud
- Add profile cookies command to list cookies by domain
- Add cookies export/import commands for bulk transfer
- Optimize cookie import using Network.setCookies (bulk API)
- Real browser now runs headless by default (use --headed for visible)
- Support --domain flag for syncing specific domain cookies only
- Update SKILL.md with cloud profile workflow documentation
2026-01-31 20:02:50 -08:00
ShawnPana 2b2dc2b4e5 feat(cli): add profile list-local command and fix real browser profile loading
- Add `profile list-local` command to discover local Chrome profiles
- Fix real browser mode to properly pass `profile_directory` to BrowserSession
- Document profile management workflow in SKILL.md
2026-01-31 18:25:17 -08:00
ShawnPana 9abfc327cc feat(cli): add get command for info retrieval (title, html, text, value, attributes, bbox)
Adds information retrieval commands to the browser-use CLI:
- get title: page title
- get html: full page or element HTML via selector
- get text: text content of element by index
- get value: input/textarea value by index
- get attributes: all attributes of element by index
- get bbox: bounding box (x, y, width, height) of element
2026-01-31 17:34:33 -08:00
ShawnPana 3ca625b75e feat(cli): add hover, dblclick, rightclick interaction commands
Adds mouse interaction commands to the browser-use CLI:
- hover: move mouse over element (triggers CSS :hover effects)
- dblclick: double-click element
- rightclick: right-click element (context menu)
2026-01-31 17:28:20 -08:00
ShawnPana 33e03b7b0f feat(cli): add wait command for selector and text conditions
Adds wait conditions to the browser-use CLI with two subcommands:
- wait selector: wait for CSS selector with state options (visible, hidden, attached, detached)
- wait text: wait for text to appear on the page
Both support custom timeout in milliseconds.
2026-01-31 17:17:35 -08:00
ShawnPana 45d244e01c feat(cli): add cookies command for get/set/clear operations
Adds cookie management to the browser-use CLI with three subcommands:
- cookies get: retrieve all cookies or filter by URL
- cookies set: create cookies with domain, path, secure, httpOnly options
- cookies clear: remove all cookies or filter by URL
2026-01-31 17:09:35 -08:00
laithrw 878c735973 Merge branch 'main' into improving-real-browser 2026-01-30 19:27:55 -05:00
Saurav Panda 7a32885644 Merge branch 'main' into feat/cdp-url-cli-support 2026-01-29 11:13:15 -08:00
Laith Weinberger d8aef72702 lint 2026-01-27 11:58:25 -05:00
Laith Weinberger 77160b7d79 feat: add Browser.from_system_chrome() for real browser auto-detection
- auto-detects chrome executable and user data dir on macos/windows/linux
- auto-selects first available profile if none specified
- added Browser.list_chrome_profiles() to see available profiles
- updated examples to prompt user for profile selection
- fixed missing browser.stop() in save_cookies.py
2026-01-27 11:52:48 -05:00
Marcin 9a1fb547d3 fix(cli): use 'cdp-default' session name when --cdp-url is provided
This prevents conflicts when switching between browser modes. Session parameters
(browser mode, cdp_url, etc.) are set at creation time and cannot be changed.
Without this fix, an existing 'default' session using chromium mode would be
silently reused when the user specifies --cdp-url, causing the CDP connection
to be ignored.

The same issue would occur switching between any browser modes (e.g., --browser
chromium to --browser real), but CDP is the most common case where users expect
to connect to a specific existing browser instance.

The session remap is placed early in main() before any command handling (server,
sessions, close --all) so those commands also target the correct session.

Users can still override with explicit --session flag if needed.
2026-01-27 09:00:38 +01:00
Saurav Panda acd05e30e0 removed duplicate --headed flag from skill cli 2026-01-25 11:34:09 -08:00
Marcin 965bc68195 style: format ensure_server function signature 2026-01-24 08:56:07 +01:00
Marcin 1791462de1 feat(cli): add --cdp-url flag to connect to existing browser via CDP
This adds support for connecting to an existing browser instance via
Chrome DevTools Protocol (CDP) URL in the skill_cli commands.

## Why

The current skill_cli only supports three browser modes:
- chromium: Launches a new Playwright-managed Chromium
- real: Launches users Chrome with profile
- remote: Uses Browser-Use Cloud

However, many use cases require connecting to an already-running browser:
- Remote browser automation via SSH tunnels
- Connecting to browsers in Docker containers
- Reusing authenticated browser sessions
- Integration with Claude Code on remote servers

The BrowserSession class already supports cdp_url, but it was not
exposed through the skill_cli. The TUI mode has this option, but the
simple CLI commands did not.

## Changes

- main.py: Added --cdp-url argument and pass-through to server
- server.py: Accept and store cdp_url, pass to session registry
- sessions.py: Handle cdp_url in session creation (takes precedence)

## Usage

browser-use --cdp-url http://localhost:9222 open https://example.com
browser-use --cdp-url http://localhost:9222 state
browser-use --cdp-url http://localhost:9222 click 5

## Testing

Tested with Chrome remote debugging over SSH tunnel - successfully
controlled a local macOS Chrome browser from a remote Linux server.

Vibe coded with Claude Opus 4.5

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 08:21:11 +01:00
BouquetAntoine 1a01e5dff7 feat(cli): add ChatBrowserUse support for BROWSER_USE_API_KEY
The CLI 'run' command now supports BROWSER_USE_API_KEY as an LLM option,
using ChatBrowserUse which is optimized for browser automation tasks.

This aligns the CLI behavior with the documented supported models at
https://docs.browser-use.com/supported-models which shows ChatBrowserUse
as a valid LLM option using BROWSER_USE_API_KEY.

Changes:
- Add ChatBrowserUse as first LLM option in get_llm() when BROWSER_USE_API_KEY is set
- Update error message to mention BROWSER_USE_API_KEY
2026-01-22 17:18:08 +01:00
Gregor Žunič b6bdc17bcb addresses cubic 2026-01-21 22:17:07 -08:00
Gregor Žunič 5fc3a428c7 better remote session management 2026-01-21 22:12:51 -08:00
Gregor Žunič c7c5cae20e remote browser fixes + readme 2026-01-21 21:49:26 -08:00
Gregor Žunič 08c72f67ba chore: Remove auxiliary planning docs 2026-01-21 21:20:44 -08:00
Gregor Žunič 5e75df3eb0 fix: Clean up Python command output format 2026-01-21 21:16:20 -08:00
Gregor Žunič 4716ae50ce fix: State command now outputs LLM representation, add CLI aliases
- State command outputs same format that browser-use agents see
- Added aliases: bu, browser (all work the same)
- Headed mode now correctly shows browser window
2026-01-19 09:36:20 -08:00