* feat(chrome): add Chrome profile name resolution and copy for --profile flag When --profile receives a name without path separators (e.g., "Default"), it now resolves the name against installed Chrome profiles, copies the profile to a temp directory (excluding large cache dirs), and launches Chrome with the copied profile to reuse login state. Key changes: - Add profile resolution: is_chrome_profile_name, find_chrome_user_data_dir, list_chrome_profiles, resolve_chrome_profile (3-tier matching) - Add copy_chrome_profile with best-effort copy and exclusion list - Wire preprocessing into launch_chrome before retry loop - Add use_real_keychain field to LaunchOptions for conditional keychain flags - Make --password-store=basic and --use-mock-keychain conditional Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(cli): add `profiles` command to list available Chrome profiles Adds `agent-browser profiles` command that reads Chrome's Local State file to list available profiles with directory names and display names. Supports --json output. Added help text in print_command_help and print_help. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add Chrome profile reuse documentation across all locations Update all 5 documentation locations per AGENTS.md: - output.rs: updated --profile help text and examples - README.md: added Chrome Profile Reuse section, updated options table - SKILL.md: added profile reuse as Option 2 - docs/src/app/sessions/page.mdx: added Chrome profile reuse section - chrome.rs: added doc comments to get_chrome_user_data_dirs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix formatting and clippy warning in chrome.rs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify profile resolution and launch integration - Only clone LaunchOptions when profile name requires resolution (avoids unnecessary allocation on every Chrome launch) - Remove redundant is_file() check before copy of Local State (copy() handles missing files naturally) - Extract format_profile_list() to deduplicate error formatting - Remove unnecessary section comments in tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(tests): use RAII TempDir guard for test cleanup Replace manual remove_dir_all calls with a TempDir struct that auto-cleans on drop, preventing temp dir leaks on test panics. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: ctate <366502+ctate@users.noreply.github.com>
268 lines
7.4 KiB
Plaintext
268 lines
7.4 KiB
Plaintext
# Sessions
|
|
|
|
Run multiple isolated browser instances:
|
|
|
|
```bash
|
|
# Different sessions
|
|
agent-browser --session agent1 open site-a.com
|
|
agent-browser --session agent2 open site-b.com
|
|
|
|
# Or via environment variable
|
|
AGENT_BROWSER_SESSION=agent1 agent-browser click "#btn"
|
|
|
|
# List active sessions
|
|
agent-browser session list
|
|
# Output:
|
|
# Active sessions:
|
|
# -> default
|
|
# agent1
|
|
|
|
# Show current session
|
|
agent-browser session
|
|
```
|
|
|
|
## Session isolation
|
|
|
|
Each session has its own:
|
|
|
|
- Browser instance
|
|
- Cookies and storage
|
|
- Navigation history
|
|
- Authentication state
|
|
|
|
## Chrome profile reuse
|
|
|
|
The simplest way to reuse your existing login state: pass a Chrome profile name to `--profile`. agent-browser copies the profile to a temp directory (read-only snapshot) and launches Chrome with your existing cookies and sessions.
|
|
|
|
```bash
|
|
# List available Chrome profiles
|
|
agent-browser profiles
|
|
|
|
# Reuse your default Chrome profile's login state
|
|
agent-browser --profile Default open https://gmail.com
|
|
|
|
# Use a named profile (by display name or directory name)
|
|
agent-browser --profile "Work" open https://app.example.com
|
|
|
|
# Or via environment variable
|
|
AGENT_BROWSER_PROFILE=Default agent-browser open https://gmail.com
|
|
```
|
|
|
|
<table>
|
|
<thead>
|
|
<tr><th>Detail</th><th>Description</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr><td>Supported browsers</td><td>Chrome, Chrome Canary, Chromium, Brave</td></tr>
|
|
<tr><td>What's copied</td><td>Cookies, local storage, extensions state (cache dirs excluded for speed)</td></tr>
|
|
<tr><td>Original profile</td><td>Never modified (read-only snapshot)</td></tr>
|
|
<tr><td>Cleanup</td><td>Temp copy deleted when browser closes</td></tr>
|
|
<tr><td>Windows note</td><td>Close Chrome before using <code>--profile <name></code> if Chrome is running</td></tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
## Persistent profiles
|
|
|
|
For a custom profile directory that persists state across browser restarts, pass a path to `--profile`:
|
|
|
|
```bash
|
|
# Use a persistent profile directory
|
|
agent-browser --profile ~/.myapp-profile open myapp.com
|
|
|
|
# Login once, then reuse the authenticated session
|
|
agent-browser --profile ~/.myapp-profile open myapp.com/dashboard
|
|
|
|
# Or via environment variable
|
|
AGENT_BROWSER_PROFILE=~/.myapp-profile agent-browser open myapp.com
|
|
```
|
|
|
|
The profile directory stores:
|
|
|
|
- Cookies and localStorage
|
|
- IndexedDB data
|
|
- Service workers
|
|
- Browser cache
|
|
- Login sessions
|
|
|
|
## Import auth from your browser
|
|
|
|
If you are already logged in to a site in Chrome, you can grab that auth state and reuse it in agent-browser. This is the fastest way to bypass login flows, OAuth, SSO, or 2FA.
|
|
|
|
**Step 1:** Start Chrome with remote debugging:
|
|
|
|
```bash
|
|
# macOS
|
|
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222
|
|
|
|
# Linux
|
|
google-chrome --remote-debugging-port=9222
|
|
```
|
|
|
|
Log in to your target site(s) in this Chrome window.
|
|
|
|
`--remote-debugging-port` exposes full browser control on localhost. Any local process can connect. Only use on trusted machines and close Chrome when done.
|
|
|
|
**Step 2:** Connect and save the authenticated state:
|
|
|
|
```bash
|
|
agent-browser --auto-connect state save ./my-auth.json
|
|
```
|
|
|
|
**Step 3:** Use the saved auth in future sessions:
|
|
|
|
```bash
|
|
# Load auth at launch
|
|
agent-browser --state ./my-auth.json open https://app.example.com/dashboard
|
|
|
|
# Or load into an existing session
|
|
agent-browser state load ./my-auth.json
|
|
agent-browser open https://app.example.com/dashboard
|
|
```
|
|
|
|
Combine with `--session-name` so the imported auth auto-persists across restarts:
|
|
|
|
```bash
|
|
agent-browser --session-name myapp state load ./my-auth.json
|
|
# From now on, state auto-saves/restores for "myapp"
|
|
```
|
|
|
|
State files contain session tokens in plaintext. Add them to `.gitignore` and delete when no longer needed. For encryption at rest, see [State encryption](#state-encryption) below.
|
|
|
|
## Session persistence
|
|
|
|
Use `--session-name` to automatically save and restore cookies and localStorage across browser restarts:
|
|
|
|
```bash
|
|
# Auto-save/load state for "twitter" session
|
|
agent-browser --session-name twitter open twitter.com
|
|
|
|
# Login once, then state persists automatically
|
|
agent-browser --session-name twitter click "#login"
|
|
|
|
# Or via environment variable
|
|
export AGENT_BROWSER_SESSION_NAME=twitter
|
|
agent-browser open twitter.com
|
|
```
|
|
|
|
State files are stored in `~/.agent-browser/sessions/` and automatically loaded on daemon start.
|
|
|
|
### Session name rules
|
|
|
|
Session names must contain only alphanumeric characters, hyphens, and underscores:
|
|
|
|
```bash
|
|
# Valid session names
|
|
agent-browser --session-name my-project open example.com
|
|
agent-browser --session-name test_session_v2 open example.com
|
|
|
|
# Invalid (will be rejected)
|
|
agent-browser --session-name "../bad" open example.com # path traversal
|
|
agent-browser --session-name "my session" open example.com # spaces
|
|
agent-browser --session-name "foo/bar" open example.com # slashes
|
|
```
|
|
|
|
## State encryption
|
|
|
|
Encrypt saved state files (cookies, localStorage) using AES-256-GCM:
|
|
|
|
```bash
|
|
# Generate a 256-bit key (64 hex characters)
|
|
openssl rand -hex 32
|
|
|
|
# Set the encryption key
|
|
export AGENT_BROWSER_ENCRYPTION_KEY=<your-64-char-hex-key>
|
|
|
|
# State files are now encrypted automatically
|
|
agent-browser --session-name secure-session open example.com
|
|
|
|
# List states shows encryption status
|
|
agent-browser state list
|
|
```
|
|
|
|
## State auto-expiration
|
|
|
|
Automatically delete old state files to prevent accumulation:
|
|
|
|
```bash
|
|
# Set expiration (default: 30 days)
|
|
export AGENT_BROWSER_STATE_EXPIRE_DAYS=7
|
|
|
|
# Manually clean old states
|
|
agent-browser state clean --older-than 7
|
|
```
|
|
|
|
## State management commands
|
|
|
|
```bash
|
|
# List all saved states
|
|
agent-browser state list
|
|
|
|
# Show state summary (cookies, origins, domains)
|
|
agent-browser state show my-session-default.json
|
|
|
|
# Rename a state file
|
|
agent-browser state rename old-name new-name
|
|
|
|
# Clear states for a specific session name
|
|
agent-browser state clear my-session
|
|
|
|
# Clear all saved states
|
|
agent-browser state clear --all
|
|
|
|
# Manual save/load (for custom paths)
|
|
agent-browser state save ./backup.json
|
|
agent-browser state load ./backup.json
|
|
```
|
|
|
|
## Authenticated sessions
|
|
|
|
Use `--headers` to set HTTP headers for a specific origin:
|
|
|
|
```bash
|
|
# Headers scoped to api.example.com only
|
|
agent-browser open api.example.com --headers '{"Authorization": "Bearer <token>"}'
|
|
|
|
# Requests to api.example.com include the auth header
|
|
agent-browser snapshot -i --json
|
|
agent-browser click @e2
|
|
|
|
# Navigate to another domain - headers NOT sent
|
|
agent-browser open other-site.com
|
|
```
|
|
|
|
Useful for:
|
|
|
|
- **Skipping login flows** - Authenticate via headers
|
|
- **Switching users** - Different auth tokens per session
|
|
- **API testing** - Access protected endpoints
|
|
- **Security** - Headers scoped to origin, not leaked
|
|
|
|
## Multiple origins
|
|
|
|
```bash
|
|
agent-browser open api.example.com --headers '{"Authorization": "Bearer token1"}'
|
|
agent-browser open api.acme.com --headers '{"Authorization": "Bearer token2"}'
|
|
```
|
|
|
|
## Global headers
|
|
|
|
For headers on all domains:
|
|
|
|
```bash
|
|
agent-browser set headers '{"X-Custom-Header": "value"}'
|
|
```
|
|
|
|
## Environment variables
|
|
|
|
<table>
|
|
<thead>
|
|
<tr><th>Variable</th><th>Description</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr><td><code>AGENT_BROWSER_SESSION</code></td><td>Browser session ID (default: "default")</td></tr>
|
|
<tr><td><code>AGENT_BROWSER_SESSION_NAME</code></td><td>Auto-save/load state persistence name</td></tr>
|
|
<tr><td><code>AGENT_BROWSER_ENCRYPTION_KEY</code></td><td>64-char hex key for AES-256-GCM encryption</td></tr>
|
|
<tr><td><code>AGENT_BROWSER_STATE_EXPIRE_DAYS</code></td><td>Auto-delete states older than N days (default: 30)</td></tr>
|
|
</tbody>
|
|
</table>
|