agentic-stealth-browser 2.7.0__tar.gz → 3.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/CHANGELOG.md +58 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/CONTRIBUTING.md +11 -4
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/PKG-INFO +17 -3
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/README.md +16 -2
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/SECURITY.md +6 -2
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/agentic_stealth_browser.egg-info/PKG-INFO +17 -3
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/agentic_stealth_browser.egg-info/SOURCES.txt +28 -1
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/audit/logger.py +147 -16
- agentic_stealth_browser-3.0.0/core/__init__.py +17 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/agent_browser.py +105 -60
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/error_messages.py +2 -2
- agentic_stealth_browser-3.0.0/core/errors.py +48 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/feature_flags.py +0 -5
- {agentic_stealth_browser-2.7.0/production → agentic_stealth_browser-3.0.0/core}/metrics.py +4 -2
- {agentic_stealth_browser-2.7.0/production → agentic_stealth_browser-3.0.0/core}/rate_limiter.py +1 -1
- agentic_stealth_browser-3.0.0/docs/BACKUP_RESTORE.md +42 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/README.md +1 -6
- agentic_stealth_browser-3.0.0/docs/RELEASING.md +25 -0
- agentic_stealth_browser-3.0.0/docs/RUNBOOK.md +15 -0
- agentic_stealth_browser-3.0.0/docs/SLO.md +15 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/agentic-stealth-browser-analysis-report.md +2 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/mcp_security.py +14 -1
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/Dockerfile +7 -2
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/adapters/agentic_stealth_mcp.py +7 -1
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/adapters/playwright_mcp.py +7 -1
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/audit_enrichment.py +1 -1
- agentic_stealth_browser-3.0.0/production/docker-healthcheck.py +32 -0
- agentic_stealth_browser-3.0.0/production/hermes_dashboard.py +1164 -0
- agentic_stealth_browser-3.0.0/production/mcp_handlers.py +821 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/mcp_server.py +25 -785
- agentic_stealth_browser-3.0.0/production/metrics.py +2 -0
- agentic_stealth_browser-3.0.0/production/rate_limiter.py +12 -0
- agentic_stealth_browser-3.0.0/production/templates/dashboard.html +831 -0
- agentic_stealth_browser-3.0.0/production/templates/login.html +94 -0
- agentic_stealth_browser-3.0.0/proxy/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/pyproject.toml +40 -3
- agentic_stealth_browser-3.0.0/recovery/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/recovery/anti_block_orchestrator.py +11 -0
- agentic_stealth_browser-3.0.0/recovery/py.typed +0 -0
- agentic_stealth_browser-3.0.0/scraping/__init__.py +0 -0
- agentic_stealth_browser-3.0.0/scraping/py.typed +0 -0
- agentic_stealth_browser-3.0.0/scripts/backup_sessions.py +35 -0
- agentic_stealth_browser-3.0.0/sessions/__init__.py +0 -0
- agentic_stealth_browser-3.0.0/sessions/py.typed +0 -0
- agentic_stealth_browser-3.0.0/stealth/__init__.py +0 -0
- agentic_stealth_browser-3.0.0/stealth/py.typed +0 -0
- agentic_stealth_browser-3.0.0/tests/stealth_harness/__init__.py +0 -0
- agentic_stealth_browser-3.0.0/tests/test_approval_mode.py +18 -0
- agentic_stealth_browser-3.0.0/tests/test_dashboard_rbac.py +103 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_hermes_dashboard.py +3 -1
- agentic_stealth_browser-3.0.0/tests/test_launch_leak.py +29 -0
- agentic_stealth_browser-3.0.0/tests/test_load_smoke.py +20 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_mcp_server_runtime.py +10 -1
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_mcp_stealth_workflows.py +8 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_phase7_fixes.py +6 -2
- agentic_stealth_browser-3.0.0/tests/test_redaction_tokens.py +22 -0
- agentic_stealth_browser-3.0.0/workflows/py.typed +0 -0
- agentic_stealth_browser-2.7.0/production/docker-healthcheck.py +0 -21
- agentic_stealth_browser-2.7.0/production/hermes_dashboard.py +0 -1976
- agentic_stealth_browser-2.7.0/production/otel_export.py +0 -214
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/.env.example +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/CODE_OF_CONDUCT.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/LICENSE +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/MANIFEST.in +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/agentic_stealth_browser.egg-info/dependency_links.txt +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/agentic_stealth_browser.egg-info/entry_points.txt +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/agentic_stealth_browser.egg-info/requires.txt +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/agentic_stealth_browser.egg-info/top_level.txt +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/ai/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/ai/ai_hooks.py +0 -0
- {agentic_stealth_browser-2.7.0/canary → agentic_stealth_browser-3.0.0/ai}/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/assets/hn-demo.gif +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/audit/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0/core → agentic_stealth_browser-3.0.0/audit}/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/behavior/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/behavior/adaptive_tuner.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/behavior/human_behavior.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/behavior/orchestration.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/behavior/persona_rotator.py +0 -0
- /agentic_stealth_browser-2.7.0/core/__init__.py → /agentic_stealth_browser-3.0.0/behavior/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/badge_gen.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/dashboard_gen.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/history.py +0 -0
- /agentic_stealth_browser-2.7.0/proxy/__init__.py → /agentic_stealth_browser-3.0.0/canary/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/readme_gen.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/runner.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/score.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/sites.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/templates/badge.svg.j2 +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/canary/templates/dashboard.html.j2 +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/account_health.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/account_warming.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/connection_pool.py +0 -0
- /agentic_stealth_browser-2.7.0/recovery/__init__.py → /agentic_stealth_browser-3.0.0/core/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/session_checkpoint.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/core/types.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/ATTACH_OVER_CDP.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/DATA_HANDLING.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/INCIDENT_RESPONSE.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/KEY_MANAGEMENT.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/canary/README.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/canary/badge.svg +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/canary/history.jsonl +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/canary/index.html +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/canary.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/plans/2026-06-01-v2.4.0-attach-mode-hardening.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/plans/2026-06-03-v2.5.0-real-backend-adapters.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/plans/misc/GOAL_MODE_HERMES_BROWSER_DASHBOARD.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/plans/misc/HN_POST.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/plans/misc/OPEN_SOURCE_READINESS.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/docs/plans/misc/RELEASE_AUTONOMOUS_PLAN.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/examples/recipes/01_cloudflare_bypass.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/examples/recipes/02_linkedin_search.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/examples/recipes/03_amazon_product.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/examples/recipes/README.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/examples/recipes/linkedin.md +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/linkedin/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/linkedin/actions.py +0 -0
- /agentic_stealth_browser-2.7.0/scraping/__init__.py → /agentic_stealth_browser-3.0.0/linkedin/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/plugins/__init__.py +0 -0
- /agentic_stealth_browser-2.7.0/sessions/__init__.py → /agentic_stealth_browser-3.0.0/plugins/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/plugins/template/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/plugins/template/plugin.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/adapters/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/adapters/_jsonrpc_stdio.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/adapters/base.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/adapters/cdp_bridge.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/approval_gate.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/cli.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/dashboard_adapter_bridge.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/deprecations.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/docker-compose.yml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/mcp_input_validator.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/mcp_session_isolation.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/policy_engine.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/profiler.py +0 -0
- /agentic_stealth_browser-2.7.0/stealth/__init__.py → /agentic_stealth_browser-3.0.0/production/py.typed +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/sdk/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/sdk/client.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/production/workflow_orchestrator.py +0 -0
- {agentic_stealth_browser-2.7.0/tests/stealth_harness → agentic_stealth_browser-3.0.0/proxy}/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/proxy/proxy_manager.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/recovery/detectors.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/recovery/explain_blocked.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scraping/scraper.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/canary_run.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/evaluate_stealth.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/generate-demo-gif.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/health_check.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/hn-demo.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/make-gif.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/migrate_v1_to_v2.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/perf_benchmark.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/scripts/setup_rbb.sh +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/sessions/cookie_manager.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/sessions/session_manager.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/setup.cfg +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/advanced_stealth.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/cache.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/firefox_adapter.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/headers.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/presets.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/profiles.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/tls_fingerprint.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/stealth/tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/debug_nowsecure.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/detection_check.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/detection_runner.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/fingerprint_scorecard.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/run_detection_tests.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/stealth_harness/collect.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/stealth_harness/test_stealth.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_account_health.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_account_warming.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_adapter_agentic_stealth_mcp.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_adapter_cdp_bridge.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_adapter_playwright_mcp.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_adaptive_tuner.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_attach_over_cdp.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_backend_adapter_contract.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_basic.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_cdp_snapshots.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_connection_pool.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_contract_agent_browser.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_cookie_manager_unit.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_dashboard_protocol_bridge.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_detectors.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_differential.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_docker_config.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_e2e_anti_block_recovery.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_e2e_protected_sites_placeholder.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_golden_master.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_human_behavior_fuzz.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_integration_modules.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_linkedin_actions.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_mcp_contract.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_mcp_url_safety.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_metrics_collector_unit.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_mutation_stealth.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_persona_rotator.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_player.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_proxy_config_unit.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_proxy_manager.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_rate_limiter_unit.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_recorder.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_recovery.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_recovery_phase1.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_recovery_state_machine.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_rehearsal_validation.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_selector_auto_heal.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_session_checkpoint.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_stealth_cache.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_stealth_coverage.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_stealth_modules.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_stress_multi_account.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_workflow_orchestrator.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_workflow_schema.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_workflow_schema_unit.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/tests/test_workflow_versioning.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/__init__.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/action_interpreter.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/auto-session-test.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/common/login.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/common/verify-email.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/linkedin/send-connection-request.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/meta-test.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/simple-test.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/teach-test/test-teach.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/upwork/add-portfolio-item.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/upwork/apply.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/upwork/edit-title.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/upwork/submit-proposal.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/library/upwork/update-rate.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/player.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/recorder.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/recovery.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/schema.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/selector_generator.py +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/test-echo.yaml +0 -0
- {agentic_stealth_browser-2.7.0 → agentic_stealth_browser-3.0.0}/workflows/variable_resolver.py +0 -0
|
@@ -9,6 +9,64 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [3.0.0] — Enterprise Hardening, Part 2 (2026-07-18)
|
|
13
|
+
|
|
14
|
+
A large enterprise-readiness pass across reliability, auditability, security/
|
|
15
|
+
supply-chain, observability, and maintainability. One breaking change (MCP
|
|
16
|
+
approval default); everything else is additive or behavior-preserving.
|
|
17
|
+
|
|
18
|
+
### Breaking
|
|
19
|
+
- **MCP approval gate is now fail-closed by default.** Sensitive actions
|
|
20
|
+
(`execute_js`, `stealth_launch`, navigate to unknown domains, `run_workflow`,
|
|
21
|
+
`stealth_replay`) return `MCP_APPROVAL_REQUIRED` until approved. Set
|
|
22
|
+
`STEALTH_APPROVAL_MODE=permissive` to restore the previous auto-approve
|
|
23
|
+
behavior. (`production/mcp_server.py`; covered by `tests/test_approval_mode.py`.)
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- **Auditability:** success-path audit records at every AgentBrowser choke point
|
|
27
|
+
and the MCP scrape handler; a `level` field on every entry; log rotation +
|
|
28
|
+
retention purge (`AGENTIC_AUDIT_*` env); an **HMAC-keyed tamper-evidence chain**
|
|
29
|
+
(`AGENTIC_AUDIT_HMAC_KEY`) with `verify_audit_chain()`; recursive secret
|
|
30
|
+
redaction into list/tuple values; GitHub/Slack/JWT token redaction patterns.
|
|
31
|
+
- **Observability:** recovery `blocks_total`/`rotations_total`/`captcha_total`
|
|
32
|
+
counters; a scrapeable `GET /metrics` Prometheus endpoint and `GET /api/usage`
|
|
33
|
+
business rollup on the dashboard; `docs/SLO.md` and `docs/RUNBOOK.md`.
|
|
34
|
+
- **Dashboard RBAC:** per-user viewer/operator roles replacing the single shared
|
|
35
|
+
password; mutating routes require the operator role; attributable operator
|
|
36
|
+
actions persisted to an append-only `audit.jsonl`; boot refuses the default
|
|
37
|
+
`change-me` password; `cookie_secure` defaults on.
|
|
38
|
+
- **Supply chain:** a hash-pinned, universal `requirements.lock`; a blocking
|
|
39
|
+
`pip-audit` CVE job; blocking `bandit` SAST (baseline-ratcheted); a `gitleaks`
|
|
40
|
+
secret-scan workflow; CycloneDX SBOM + build-provenance attestation on publish;
|
|
41
|
+
`py.typed` markers for every shipped package; a post-publish PyPI install smoke.
|
|
42
|
+
- **Compliance/governance:** `ACCEPTABLE_USE.md`, `GOVERNANCE.md`, `ROADMAP.md`,
|
|
43
|
+
`SUPPORT.md`, `DCO.txt` + sign-off, `docs/RELEASING.md`, `docs/INCIDENT_RESPONSE.md`,
|
|
44
|
+
`docs/KEY_MANAGEMENT.md`, `docs/DATA_HANDLING.md`, `docs/BACKUP_RESTORE.md` +
|
|
45
|
+
`scripts/backup_sessions.py`.
|
|
46
|
+
- **Reliability:** a launch-failure driver-leak guard in `__aenter__`; an opt-in
|
|
47
|
+
`respect_robots` guard (stdlib `robotparser`) on `safe_goto`/MCP navigate; an
|
|
48
|
+
`AGENTIC_MAX_REQUESTS_PER_SESSION` per-session navigation budget; a `perf`-marked
|
|
49
|
+
concurrency load smoke test.
|
|
50
|
+
- **API:** a stable public facade — `from core import AgentBrowser`.
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
- **CI is now a real gate:** blocking (relaxed) `mypy` on `core/` and on the five
|
|
54
|
+
MCP security modules; coverage gate raised to **55%** over a widened package set;
|
|
55
|
+
a Python **3.10–3.13** test matrix plus ubuntu/windows/macOS import-smoke; all
|
|
56
|
+
GitHub Actions pinned to commit SHAs; the three previously-excluded test files
|
|
57
|
+
un-gated; the nightly job no longer masks failures.
|
|
58
|
+
- **Architecture:** `rate_limiter.py`/`metrics.py` moved into `core/` (inverted
|
|
59
|
+
layering resolved, back-compat shims kept); ~830 lines of dashboard HTML extracted
|
|
60
|
+
to `production/templates/*.html`; the 18 `_tool_stealth_*` MCP handlers extracted
|
|
61
|
+
to a `_MCPToolHandlers` mixin; the 5 exception classes moved to `core/errors.py`.
|
|
62
|
+
- Swallowed (`pass`-only) exception handlers now log at debug with `exc_info`.
|
|
63
|
+
- Removed the dead `plugin_system` capability flag and unused `otel_export.py`.
|
|
64
|
+
|
|
65
|
+
### Security
|
|
66
|
+
- Dependency lower bounds pinned to CVE-safe floors; Docker installs from the
|
|
67
|
+
hash-pinned lockfile and runs as a non-root user; `twine check --strict` before
|
|
68
|
+
every PyPI upload; `SECURITY.md` supported-versions corrected.
|
|
69
|
+
|
|
12
70
|
## [2.7.0] — Enterprise Hardening (2026-07-18)
|
|
13
71
|
|
|
14
72
|
Auditability, supply-chain, and business-facing hardening from a full enterprise
|
|
@@ -36,10 +36,9 @@ pytest tests/ -v
|
|
|
36
36
|
# Run specific test files
|
|
37
37
|
pytest tests/test_stealth_modules.py -v
|
|
38
38
|
pytest tests/test_contract_agent_browser.py -v
|
|
39
|
-
pytest tests/test_recovery_phase1.py -v
|
|
40
39
|
|
|
41
|
-
# Run with coverage
|
|
42
|
-
pytest tests/ --cov=core --cov=stealth --cov=recovery --cov=
|
|
40
|
+
# Run with coverage (CI-equivalent; coverage gate ratchets +5 each release)
|
|
41
|
+
python -m pytest tests/ -m "not e2e and not live_network" --ignore=tests/test_basic.py -q --cov=core --cov=stealth --cov=behavior --cov=recovery --cov=proxy --cov=production --cov=sessions --cov=workflows --cov=audit --cov=mcp_security --cov-fail-under=55
|
|
43
42
|
```
|
|
44
43
|
|
|
45
44
|
---
|
|
@@ -200,7 +199,7 @@ agentic-stealth-browser/
|
|
|
200
199
|
### New Recovery Strategy
|
|
201
200
|
|
|
202
201
|
1. Update `PLATFORM_STRATEGIES` in `recovery/anti_block_orchestrator.py`
|
|
203
|
-
2. Add tests to `tests/
|
|
202
|
+
2. Add tests to `tests/test_recovery_state_machine.py`
|
|
204
203
|
3. Document rate limiting behavior changes in README.md or relevant code comments
|
|
205
204
|
|
|
206
205
|
### New Human Behavior
|
|
@@ -235,3 +234,11 @@ If you discover a security vulnerability:
|
|
|
235
234
|
## License
|
|
236
235
|
|
|
237
236
|
By contributing, you agree that your contributions will be licensed under the MIT License.
|
|
237
|
+
|
|
238
|
+
All contributions must be signed off under the [Developer Certificate of Origin](DCO.txt). Add a `Signed-off-by: Your Name <you@example.com>` line to each commit (use `git commit -s`).
|
|
239
|
+
|
|
240
|
+
## Deprecation Policy
|
|
241
|
+
|
|
242
|
+
The public API surface is: the SDK (`production.sdk.client.StealthClient`), MCP tool names (`stealth_launch`, `stealth_navigate`, `stealth_scrape`, `stealth_close`), the `agentic-stealth-browser` CLI and its flags, and the `plugins.BasePlugin` protocol.
|
|
243
|
+
|
|
244
|
+
A deprecated public symbol, flag, or tool emits a `DeprecationWarning` (or documented equivalent) for at least one full MINOR release before removal. Every deprecation and removal is listed in the CHANGELOG under `Deprecated` / `Removed`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-stealth-browser
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Production-grade, human-mimicking browser automation framework for autonomous agents. Survives modern anti-bot systems.
|
|
5
5
|
Author-email: Shane W <shanewas@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -55,6 +55,10 @@ Dynamic: license-file
|
|
|
55
55
|
|
|
56
56
|
This is an anti-bot-evasion tool. Read the [Acceptable Use Policy](ACCEPTABLE_USE.md) before use — you are responsible for using it lawfully and within the target site's Terms of Service.
|
|
57
57
|
|
|
58
|
+
This software is for lawful, **authorized** automation and testing only; you are responsible for compliance with applicable laws, target Terms of Service, and **robots.txt** directives.
|
|
59
|
+
|
|
60
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND; the authors accept no liability for misuse. See [LICENSE](LICENSE).
|
|
61
|
+
|
|
58
62
|
## What is this
|
|
59
63
|
|
|
60
64
|
A production-grade stealth browser automation library for Python, built on Playwright.
|
|
@@ -75,7 +79,7 @@ playwright install --with-deps chromium
|
|
|
75
79
|
```
|
|
76
80
|
|
|
77
81
|
```python
|
|
78
|
-
from core
|
|
82
|
+
from core import AgentBrowser
|
|
79
83
|
|
|
80
84
|
async with AgentBrowser(session_name="demo") as browser:
|
|
81
85
|
await browser.launch(headless=True)
|
|
@@ -126,6 +130,10 @@ This library is opinionated and has real limits. Operators should know them up f
|
|
|
126
130
|
- **Login credentials are not shipped.** Examples that touch authenticated endpoints
|
|
127
131
|
stop at the search/listing stage.
|
|
128
132
|
|
|
133
|
+
### Cost controls
|
|
134
|
+
|
|
135
|
+
Set `AGENTIC_MAX_REQUESTS_PER_SESSION=<n>` to cap navigations per session (`safe_goto` returns `False` once exceeded).
|
|
136
|
+
|
|
129
137
|
---
|
|
130
138
|
|
|
131
139
|
## Quick Start
|
|
@@ -143,7 +151,7 @@ agentic-stealth-browser dashboard
|
|
|
143
151
|
### Python SDK
|
|
144
152
|
|
|
145
153
|
```python
|
|
146
|
-
from core
|
|
154
|
+
from core import AgentBrowser
|
|
147
155
|
|
|
148
156
|
async with AgentBrowser(
|
|
149
157
|
session_name="my-session",
|
|
@@ -300,6 +308,12 @@ Additional references: [CHANGELOG.md](CHANGELOG.md) · [Workflow Library](workfl
|
|
|
300
308
|
└── tests/ Contract + integration tests (live E2E opt-in)
|
|
301
309
|
```
|
|
302
310
|
|
|
311
|
+
## Governance & Support
|
|
312
|
+
|
|
313
|
+
- [Governance](GOVERNANCE.md)
|
|
314
|
+
- [Roadmap](ROADMAP.md)
|
|
315
|
+
- [Support](SUPPORT.md)
|
|
316
|
+
|
|
303
317
|
## License
|
|
304
318
|
|
|
305
319
|
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
This is an anti-bot-evasion tool. Read the [Acceptable Use Policy](ACCEPTABLE_USE.md) before use — you are responsible for using it lawfully and within the target site's Terms of Service.
|
|
18
18
|
|
|
19
|
+
This software is for lawful, **authorized** automation and testing only; you are responsible for compliance with applicable laws, target Terms of Service, and **robots.txt** directives.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND; the authors accept no liability for misuse. See [LICENSE](LICENSE).
|
|
22
|
+
|
|
19
23
|
## What is this
|
|
20
24
|
|
|
21
25
|
A production-grade stealth browser automation library for Python, built on Playwright.
|
|
@@ -36,7 +40,7 @@ playwright install --with-deps chromium
|
|
|
36
40
|
```
|
|
37
41
|
|
|
38
42
|
```python
|
|
39
|
-
from core
|
|
43
|
+
from core import AgentBrowser
|
|
40
44
|
|
|
41
45
|
async with AgentBrowser(session_name="demo") as browser:
|
|
42
46
|
await browser.launch(headless=True)
|
|
@@ -87,6 +91,10 @@ This library is opinionated and has real limits. Operators should know them up f
|
|
|
87
91
|
- **Login credentials are not shipped.** Examples that touch authenticated endpoints
|
|
88
92
|
stop at the search/listing stage.
|
|
89
93
|
|
|
94
|
+
### Cost controls
|
|
95
|
+
|
|
96
|
+
Set `AGENTIC_MAX_REQUESTS_PER_SESSION=<n>` to cap navigations per session (`safe_goto` returns `False` once exceeded).
|
|
97
|
+
|
|
90
98
|
---
|
|
91
99
|
|
|
92
100
|
## Quick Start
|
|
@@ -104,7 +112,7 @@ agentic-stealth-browser dashboard
|
|
|
104
112
|
### Python SDK
|
|
105
113
|
|
|
106
114
|
```python
|
|
107
|
-
from core
|
|
115
|
+
from core import AgentBrowser
|
|
108
116
|
|
|
109
117
|
async with AgentBrowser(
|
|
110
118
|
session_name="my-session",
|
|
@@ -261,6 +269,12 @@ Additional references: [CHANGELOG.md](CHANGELOG.md) · [Workflow Library](workfl
|
|
|
261
269
|
└── tests/ Contract + integration tests (live E2E opt-in)
|
|
262
270
|
```
|
|
263
271
|
|
|
272
|
+
## Governance & Support
|
|
273
|
+
|
|
274
|
+
- [Governance](GOVERNANCE.md)
|
|
275
|
+
- [Roadmap](ROADMAP.md)
|
|
276
|
+
- [Support](SUPPORT.md)
|
|
277
|
+
|
|
264
278
|
## License
|
|
265
279
|
|
|
266
280
|
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
| Version | Supported |
|
|
6
6
|
| ------- | ------------------ |
|
|
7
|
-
|
|
|
8
|
-
| <
|
|
7
|
+
| 3.0.x | :white_check_mark: |
|
|
8
|
+
| < 3.0 | :x: |
|
|
9
9
|
|
|
10
10
|
This table is updated as part of every release; a release is not complete until the current minor version appears here.
|
|
11
11
|
|
|
@@ -31,6 +31,10 @@ When using this framework in production:
|
|
|
31
31
|
6. **Isolate accounts** — Never share proxies or browser contexts across accounts
|
|
32
32
|
7. **Keep dependencies updated** — Regularly update Playwright and Python dependencies
|
|
33
33
|
|
|
34
|
+
## MCP Approval Mode
|
|
35
|
+
|
|
36
|
+
The MCP server ships fail-closed: sensitive actions (`execute_js`, `stealth_launch`, navigate to unknown domains, `run_workflow`, `stealth_replay`) return `MCP_APPROVAL_REQUIRED` until approved. Set `STEALTH_APPROVAL_MODE=permissive` to auto-approve all sensitive actions (previous default; not recommended for shared/production deployments).
|
|
37
|
+
|
|
34
38
|
## Known Limitations
|
|
35
39
|
|
|
36
40
|
- TLS fingerprint spoofing is limited to browser launch arguments; true ClientHello manipulation requires lower-level network stack access
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-stealth-browser
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Production-grade, human-mimicking browser automation framework for autonomous agents. Survives modern anti-bot systems.
|
|
5
5
|
Author-email: Shane W <shanewas@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -55,6 +55,10 @@ Dynamic: license-file
|
|
|
55
55
|
|
|
56
56
|
This is an anti-bot-evasion tool. Read the [Acceptable Use Policy](ACCEPTABLE_USE.md) before use — you are responsible for using it lawfully and within the target site's Terms of Service.
|
|
57
57
|
|
|
58
|
+
This software is for lawful, **authorized** automation and testing only; you are responsible for compliance with applicable laws, target Terms of Service, and **robots.txt** directives.
|
|
59
|
+
|
|
60
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND; the authors accept no liability for misuse. See [LICENSE](LICENSE).
|
|
61
|
+
|
|
58
62
|
## What is this
|
|
59
63
|
|
|
60
64
|
A production-grade stealth browser automation library for Python, built on Playwright.
|
|
@@ -75,7 +79,7 @@ playwright install --with-deps chromium
|
|
|
75
79
|
```
|
|
76
80
|
|
|
77
81
|
```python
|
|
78
|
-
from core
|
|
82
|
+
from core import AgentBrowser
|
|
79
83
|
|
|
80
84
|
async with AgentBrowser(session_name="demo") as browser:
|
|
81
85
|
await browser.launch(headless=True)
|
|
@@ -126,6 +130,10 @@ This library is opinionated and has real limits. Operators should know them up f
|
|
|
126
130
|
- **Login credentials are not shipped.** Examples that touch authenticated endpoints
|
|
127
131
|
stop at the search/listing stage.
|
|
128
132
|
|
|
133
|
+
### Cost controls
|
|
134
|
+
|
|
135
|
+
Set `AGENTIC_MAX_REQUESTS_PER_SESSION=<n>` to cap navigations per session (`safe_goto` returns `False` once exceeded).
|
|
136
|
+
|
|
129
137
|
---
|
|
130
138
|
|
|
131
139
|
## Quick Start
|
|
@@ -143,7 +151,7 @@ agentic-stealth-browser dashboard
|
|
|
143
151
|
### Python SDK
|
|
144
152
|
|
|
145
153
|
```python
|
|
146
|
-
from core
|
|
154
|
+
from core import AgentBrowser
|
|
147
155
|
|
|
148
156
|
async with AgentBrowser(
|
|
149
157
|
session_name="my-session",
|
|
@@ -300,6 +308,12 @@ Additional references: [CHANGELOG.md](CHANGELOG.md) · [Workflow Library](workfl
|
|
|
300
308
|
└── tests/ Contract + integration tests (live E2E opt-in)
|
|
301
309
|
```
|
|
302
310
|
|
|
311
|
+
## Governance & Support
|
|
312
|
+
|
|
313
|
+
- [Governance](GOVERNANCE.md)
|
|
314
|
+
- [Roadmap](ROADMAP.md)
|
|
315
|
+
- [Support](SUPPORT.md)
|
|
316
|
+
|
|
303
317
|
## License
|
|
304
318
|
|
|
305
319
|
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -16,14 +16,17 @@ agentic_stealth_browser.egg-info/requires.txt
|
|
|
16
16
|
agentic_stealth_browser.egg-info/top_level.txt
|
|
17
17
|
ai/__init__.py
|
|
18
18
|
ai/ai_hooks.py
|
|
19
|
+
ai/py.typed
|
|
19
20
|
assets/hn-demo.gif
|
|
20
21
|
audit/__init__.py
|
|
21
22
|
audit/logger.py
|
|
23
|
+
audit/py.typed
|
|
22
24
|
behavior/__init__.py
|
|
23
25
|
behavior/adaptive_tuner.py
|
|
24
26
|
behavior/human_behavior.py
|
|
25
27
|
behavior/orchestration.py
|
|
26
28
|
behavior/persona_rotator.py
|
|
29
|
+
behavior/py.typed
|
|
27
30
|
canary/__init__.py
|
|
28
31
|
canary/badge_gen.py
|
|
29
32
|
canary/dashboard_gen.py
|
|
@@ -41,15 +44,22 @@ core/account_warming.py
|
|
|
41
44
|
core/agent_browser.py
|
|
42
45
|
core/connection_pool.py
|
|
43
46
|
core/error_messages.py
|
|
47
|
+
core/errors.py
|
|
44
48
|
core/feature_flags.py
|
|
49
|
+
core/metrics.py
|
|
45
50
|
core/py.typed
|
|
51
|
+
core/rate_limiter.py
|
|
46
52
|
core/session_checkpoint.py
|
|
47
53
|
core/types.py
|
|
48
54
|
docs/ATTACH_OVER_CDP.md
|
|
55
|
+
docs/BACKUP_RESTORE.md
|
|
49
56
|
docs/DATA_HANDLING.md
|
|
50
57
|
docs/INCIDENT_RESPONSE.md
|
|
51
58
|
docs/KEY_MANAGEMENT.md
|
|
52
59
|
docs/README.md
|
|
60
|
+
docs/RELEASING.md
|
|
61
|
+
docs/RUNBOOK.md
|
|
62
|
+
docs/SLO.md
|
|
53
63
|
docs/agentic-stealth-browser-analysis-report.md
|
|
54
64
|
docs/canary.md
|
|
55
65
|
docs/canary/README.md
|
|
@@ -69,7 +79,9 @@ examples/recipes/README.md
|
|
|
69
79
|
examples/recipes/linkedin.md
|
|
70
80
|
linkedin/__init__.py
|
|
71
81
|
linkedin/actions.py
|
|
82
|
+
linkedin/py.typed
|
|
72
83
|
plugins/__init__.py
|
|
84
|
+
plugins/py.typed
|
|
73
85
|
plugins/template/__init__.py
|
|
74
86
|
plugins/template/plugin.py
|
|
75
87
|
production/Dockerfile
|
|
@@ -82,13 +94,14 @@ production/deprecations.py
|
|
|
82
94
|
production/docker-compose.yml
|
|
83
95
|
production/docker-healthcheck.py
|
|
84
96
|
production/hermes_dashboard.py
|
|
97
|
+
production/mcp_handlers.py
|
|
85
98
|
production/mcp_input_validator.py
|
|
86
99
|
production/mcp_server.py
|
|
87
100
|
production/mcp_session_isolation.py
|
|
88
101
|
production/metrics.py
|
|
89
|
-
production/otel_export.py
|
|
90
102
|
production/policy_engine.py
|
|
91
103
|
production/profiler.py
|
|
104
|
+
production/py.typed
|
|
92
105
|
production/rate_limiter.py
|
|
93
106
|
production/workflow_orchestrator.py
|
|
94
107
|
production/adapters/__init__.py
|
|
@@ -99,14 +112,20 @@ production/adapters/cdp_bridge.py
|
|
|
99
112
|
production/adapters/playwright_mcp.py
|
|
100
113
|
production/sdk/__init__.py
|
|
101
114
|
production/sdk/client.py
|
|
115
|
+
production/templates/dashboard.html
|
|
116
|
+
production/templates/login.html
|
|
102
117
|
proxy/__init__.py
|
|
103
118
|
proxy/proxy_manager.py
|
|
119
|
+
proxy/py.typed
|
|
104
120
|
recovery/__init__.py
|
|
105
121
|
recovery/anti_block_orchestrator.py
|
|
106
122
|
recovery/detectors.py
|
|
107
123
|
recovery/explain_blocked.py
|
|
124
|
+
recovery/py.typed
|
|
108
125
|
scraping/__init__.py
|
|
126
|
+
scraping/py.typed
|
|
109
127
|
scraping/scraper.py
|
|
128
|
+
scripts/backup_sessions.py
|
|
110
129
|
scripts/canary_run.py
|
|
111
130
|
scripts/evaluate_stealth.py
|
|
112
131
|
scripts/generate-demo-gif.py
|
|
@@ -118,6 +137,7 @@ scripts/perf_benchmark.py
|
|
|
118
137
|
scripts/setup_rbb.sh
|
|
119
138
|
sessions/__init__.py
|
|
120
139
|
sessions/cookie_manager.py
|
|
140
|
+
sessions/py.typed
|
|
121
141
|
sessions/session_manager.py
|
|
122
142
|
stealth/__init__.py
|
|
123
143
|
stealth/advanced_stealth.py
|
|
@@ -126,6 +146,7 @@ stealth/firefox_adapter.py
|
|
|
126
146
|
stealth/headers.py
|
|
127
147
|
stealth/presets.py
|
|
128
148
|
stealth/profiles.py
|
|
149
|
+
stealth/py.typed
|
|
129
150
|
stealth/tls_fingerprint.py
|
|
130
151
|
stealth/tls_ja3_ja4.py
|
|
131
152
|
tests/debug_nowsecure.py
|
|
@@ -139,6 +160,7 @@ tests/test_adapter_agentic_stealth_mcp.py
|
|
|
139
160
|
tests/test_adapter_cdp_bridge.py
|
|
140
161
|
tests/test_adapter_playwright_mcp.py
|
|
141
162
|
tests/test_adaptive_tuner.py
|
|
163
|
+
tests/test_approval_mode.py
|
|
142
164
|
tests/test_attach_over_cdp.py
|
|
143
165
|
tests/test_backend_adapter_contract.py
|
|
144
166
|
tests/test_basic.py
|
|
@@ -147,6 +169,7 @@ tests/test_connection_pool.py
|
|
|
147
169
|
tests/test_contract_agent_browser.py
|
|
148
170
|
tests/test_cookie_manager_unit.py
|
|
149
171
|
tests/test_dashboard_protocol_bridge.py
|
|
172
|
+
tests/test_dashboard_rbac.py
|
|
150
173
|
tests/test_detectors.py
|
|
151
174
|
tests/test_differential.py
|
|
152
175
|
tests/test_docker_config.py
|
|
@@ -156,7 +179,9 @@ tests/test_golden_master.py
|
|
|
156
179
|
tests/test_hermes_dashboard.py
|
|
157
180
|
tests/test_human_behavior_fuzz.py
|
|
158
181
|
tests/test_integration_modules.py
|
|
182
|
+
tests/test_launch_leak.py
|
|
159
183
|
tests/test_linkedin_actions.py
|
|
184
|
+
tests/test_load_smoke.py
|
|
160
185
|
tests/test_mcp_contract.py
|
|
161
186
|
tests/test_mcp_server_runtime.py
|
|
162
187
|
tests/test_mcp_stealth_workflows.py
|
|
@@ -173,6 +198,7 @@ tests/test_recorder.py
|
|
|
173
198
|
tests/test_recovery.py
|
|
174
199
|
tests/test_recovery_phase1.py
|
|
175
200
|
tests/test_recovery_state_machine.py
|
|
201
|
+
tests/test_redaction_tokens.py
|
|
176
202
|
tests/test_rehearsal_validation.py
|
|
177
203
|
tests/test_selector_auto_heal.py
|
|
178
204
|
tests/test_session_checkpoint.py
|
|
@@ -191,6 +217,7 @@ tests/stealth_harness/test_stealth.py
|
|
|
191
217
|
workflows/__init__.py
|
|
192
218
|
workflows/action_interpreter.py
|
|
193
219
|
workflows/player.py
|
|
220
|
+
workflows/py.typed
|
|
194
221
|
workflows/recorder.py
|
|
195
222
|
workflows/recovery.py
|
|
196
223
|
workflows/schema.py
|