Rebased and fixed implementation of PR #184 features on current main: Session persistence: - --session-name flag and AGENT_BROWSER_SESSION_NAME env var auto-save/restore cookies and localStorage across browser restarts - State files stored in ~/.agent-browser/sessions/ with owner-only permissions - AES-256-GCM encryption via AGENT_BROWSER_ENCRYPTION_KEY env var - Auto-expiration of old state files (AGENT_BROWSER_STATE_EXPIRE_DAYS, default 30) State management commands: - state list: list saved state files with metadata - state show <file>: display state summary (cookies, origins, domains) - state rename <old> <new>: rename state files - state clear [name] [--all]: clear saved states - state clean --older-than <days>: delete expired states New --new-tab flag for click command: - Opens link href in a new tab instead of navigating the current tab Security hardening: - Session name validation prevents path traversal (CLI + daemon) - safeHeaderMerge prevents prototype pollution in header merging - WebSocket stream server binds to 127.0.0.1 only - State files written with 0o600 permissions Fixes applied over the original PR: - Use color.rs module instead of hardcoded ANSI escape codes - Align CLI output field names with daemon response format - Add CLI-level --session-name validation (not just daemon-side) - Avoid adding "DOM" to tsconfig.json lib (use proper typing in evaluate) - Keep version at 0.9.3 (matches current main) - Centralize session name validation in daemon.ts helper - Update all documentation (README, SKILL.md, docs site, --help output) Co-authored-by: Chris Tate <chris@ctate.dev>
101 lines
3.3 KiB
Bash
Executable File
101 lines
3.3 KiB
Bash
Executable File
#!/bin/bash
|
|
# Template: Authenticated Session Workflow
|
|
# Purpose: Login once, save state, reuse for subsequent runs
|
|
# Usage: ./authenticated-session.sh <login-url> [state-file]
|
|
#
|
|
# Environment variables:
|
|
# APP_USERNAME - Login username/email
|
|
# APP_PASSWORD - Login password
|
|
#
|
|
# Two modes:
|
|
# 1. Discovery mode (default): Shows form structure so you can identify refs
|
|
# 2. Login mode: Performs actual login after you update the refs
|
|
#
|
|
# Setup steps:
|
|
# 1. Run once to see form structure (discovery mode)
|
|
# 2. Update refs in LOGIN FLOW section below
|
|
# 3. Set APP_USERNAME and APP_PASSWORD
|
|
# 4. Delete the DISCOVERY section
|
|
|
|
set -euo pipefail
|
|
|
|
LOGIN_URL="${1:?Usage: $0 <login-url> [state-file]}"
|
|
STATE_FILE="${2:-./auth-state.json}"
|
|
|
|
echo "Authentication workflow: $LOGIN_URL"
|
|
|
|
# ================================================================
|
|
# SAVED STATE: Skip login if valid saved state exists
|
|
# ================================================================
|
|
if [[ -f "$STATE_FILE" ]]; then
|
|
echo "Loading saved state from $STATE_FILE..."
|
|
if agent-browser --state "$STATE_FILE" open "$LOGIN_URL" 2>/dev/null; then
|
|
agent-browser wait --load networkidle
|
|
|
|
CURRENT_URL=$(agent-browser get url)
|
|
if [[ "$CURRENT_URL" != *"login"* ]] && [[ "$CURRENT_URL" != *"signin"* ]]; then
|
|
echo "Session restored successfully"
|
|
agent-browser snapshot -i
|
|
exit 0
|
|
fi
|
|
echo "Session expired, performing fresh login..."
|
|
agent-browser close 2>/dev/null || true
|
|
else
|
|
echo "Failed to load state, re-authenticating..."
|
|
fi
|
|
rm -f "$STATE_FILE"
|
|
fi
|
|
|
|
# ================================================================
|
|
# DISCOVERY MODE: Shows form structure (delete after setup)
|
|
# ================================================================
|
|
echo "Opening login page..."
|
|
agent-browser open "$LOGIN_URL"
|
|
agent-browser wait --load networkidle
|
|
|
|
echo ""
|
|
echo "Login form structure:"
|
|
echo "---"
|
|
agent-browser snapshot -i
|
|
echo "---"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Note the refs: username=@e?, password=@e?, submit=@e?"
|
|
echo " 2. Update the LOGIN FLOW section below with your refs"
|
|
echo " 3. Set: export APP_USERNAME='...' APP_PASSWORD='...'"
|
|
echo " 4. Delete this DISCOVERY MODE section"
|
|
echo ""
|
|
agent-browser close
|
|
exit 0
|
|
|
|
# ================================================================
|
|
# LOGIN FLOW: Uncomment and customize after discovery
|
|
# ================================================================
|
|
# : "${APP_USERNAME:?Set APP_USERNAME environment variable}"
|
|
# : "${APP_PASSWORD:?Set APP_PASSWORD environment variable}"
|
|
#
|
|
# agent-browser open "$LOGIN_URL"
|
|
# agent-browser wait --load networkidle
|
|
# agent-browser snapshot -i
|
|
#
|
|
# # Fill credentials (update refs to match your form)
|
|
# agent-browser fill @e1 "$APP_USERNAME"
|
|
# agent-browser fill @e2 "$APP_PASSWORD"
|
|
# agent-browser click @e3
|
|
# agent-browser wait --load networkidle
|
|
#
|
|
# # Verify login succeeded
|
|
# FINAL_URL=$(agent-browser get url)
|
|
# if [[ "$FINAL_URL" == *"login"* ]] || [[ "$FINAL_URL" == *"signin"* ]]; then
|
|
# echo "Login failed - still on login page"
|
|
# agent-browser screenshot /tmp/login-failed.png
|
|
# agent-browser close
|
|
# exit 1
|
|
# fi
|
|
#
|
|
# # Save state for future runs
|
|
# echo "Saving state to $STATE_FILE"
|
|
# agent-browser state save "$STATE_FILE"
|
|
# echo "Login successful"
|
|
# agent-browser snapshot -i
|