agentic-stealth-browser 2.0.0__tar.gz → 2.1.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.0.0 → agentic_stealth_browser-2.1.0}/CHANGELOG.md +17 -0
- agentic_stealth_browser-2.1.0/PKG-INFO +257 -0
- agentic_stealth_browser-2.1.0/README.md +217 -0
- agentic_stealth_browser-2.1.0/agentic_stealth_browser.egg-info/PKG-INFO +257 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/SOURCES.txt +2 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/requires.txt +4 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/ai/ai_hooks.py +16 -5
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/audit/logger.py +143 -68
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/adaptive_tuner.py +86 -40
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/human_behavior.py +162 -64
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/orchestration.py +20 -20
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/persona_rotator.py +38 -17
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/account_health.py +37 -16
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/account_warming.py +7 -6
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/agent_browser.py +533 -175
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/connection_pool.py +6 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/error_messages.py +13 -12
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/feature_flags.py +5 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/session_checkpoint.py +5 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/types.py +14 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/linkedin/actions.py +9 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/Dockerfile +7 -4
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/approval_gate.py +4 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/cli.py +103 -24
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/deprecations.py +13 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/docker-healthcheck.py +2 -0
- agentic_stealth_browser-2.1.0/production/hermes_dashboard.py +921 -0
- agentic_stealth_browser-2.1.0/production/mcp_input_validator.py +248 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/mcp_server.py +260 -81
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/mcp_session_isolation.py +22 -13
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/metrics.py +61 -26
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/otel_export.py +38 -33
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/policy_engine.py +30 -11
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/profiler.py +1 -4
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/rate_limiter.py +38 -21
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/workflow_orchestrator.py +41 -22
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/proxy/proxy_manager.py +48 -21
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/pyproject.toml +22 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/anti_block_orchestrator.py +307 -98
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/detectors.py +75 -43
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/explain_blocked.py +24 -7
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/scraping/scraper.py +16 -8
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/sessions/cookie_manager.py +250 -68
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/sessions/session_manager.py +47 -17
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/advanced_stealth.py +39 -13
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/cache.py +13 -5
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/firefox_adapter.py +3 -5
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/headers.py +1 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/presets.py +27 -9
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/profiles.py +34 -16
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/tls_fingerprint.py +115 -59
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/tls_ja3_ja4.py +139 -28
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/debug_nowsecure.py +8 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/detection_check.py +1 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/detection_runner.py +34 -24
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/fingerprint_scorecard.py +105 -44
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/run_detection_tests.py +7 -7
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_account_health.py +10 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_account_warming.py +3 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_adaptive_tuner.py +3 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_basic.py +1 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_cdp_snapshots.py +6 -6
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_contract_agent_browser.py +52 -46
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_cookie_manager_unit.py +7 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_differential.py +5 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_docker_config.py +18 -27
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_e2e_anti_block_recovery.py +71 -26
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_e2e_protected_sites_placeholder.py +3 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_golden_master.py +7 -9
- agentic_stealth_browser-2.1.0/tests/test_hermes_dashboard.py +200 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_human_behavior_fuzz.py +24 -63
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_linkedin_actions.py +24 -19
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mcp_contract.py +59 -34
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mcp_server_runtime.py +122 -29
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mcp_stealth_workflows.py +34 -9
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_metrics_collector_unit.py +1 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mutation_stealth.py +5 -9
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_phase7_fixes.py +138 -37
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_player.py +40 -21
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_proxy_config_unit.py +5 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_proxy_manager.py +17 -41
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_rate_limiter_unit.py +5 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recorder.py +57 -19
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recovery.py +39 -23
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recovery_phase1.py +7 -7
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recovery_state_machine.py +33 -9
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_rehearsal_validation.py +42 -12
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_selector_auto_heal.py +21 -6
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_session_checkpoint.py +12 -11
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stealth_coverage.py +10 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stealth_modules.py +11 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stress_multi_account.py +14 -2
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_orchestrator.py +4 -3
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_schema.py +33 -15
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_schema_unit.py +42 -9
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_versioning.py +108 -33
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/action_interpreter.py +6 -1
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/player.py +142 -71
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/recorder.py +162 -90
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/recovery.py +40 -14
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/schema.py +46 -36
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/selector_generator.py +76 -49
- agentic_stealth_browser-2.0.0/PKG-INFO +0 -370
- agentic_stealth_browser-2.0.0/README.md +0 -334
- agentic_stealth_browser-2.0.0/agentic_stealth_browser.egg-info/PKG-INFO +0 -370
- agentic_stealth_browser-2.0.0/production/mcp_input_validator.py +0 -184
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/.env.example +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/LICENSE +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/MANIFEST.in +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/dependency_links.txt +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/entry_points.txt +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/top_level.txt +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/ai/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/audit/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/py.typed +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/docs/THREAT_MODEL.md +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/docs/using-as-library.md +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/examples/recipes/README.md +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/examples/recipes/linkedin.md +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/linkedin/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/audit_enrichment.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/docker-compose.yml +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/proxy/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/scraping/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/sessions/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/setup.cfg +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_connection_pool.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_detectors.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_integration_modules.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_persona_rotator.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stealth_cache.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/__init__.py +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/test-echo.yaml +0 -0
- {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/variable_resolver.py +0 -0
|
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [2.1.0] — Hermes Browser Dashboard (2026-05-30)
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Hermes Browser Dashboard** (`production/hermes_dashboard.py`): Single-user operator dashboard with live browser view, execution control, workflow recording/replay, activity timeline, session auth, and CSRF protection. (#434)
|
|
14
|
+
- **`stealth-browser dashboard` CLI subcommand**: Starts the dashboard server on `127.0.0.1:8443` with configurable password. (#434)
|
|
15
|
+
- **Dashboard tests** (`tests/test_hermes_dashboard.py`): 6 contract tests covering start/stop, recording/replay, intervention state, devtools URL generation, auth+CSRF, and schedules. (#434)
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- CI: `setup-python` bumped to v6 across all workflows
|
|
19
|
+
- CI: Install `httpx` in stealth recovery workflow
|
|
20
|
+
- CI: Python 3.11 test compatibility fixes
|
|
21
|
+
- CI: Dashboard file formatting for ruff compliance
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- `SERVER_VERSION` → `2.1.0`
|
|
25
|
+
- `pyproject.toml` version → `2.1.0`
|
|
26
|
+
|
|
10
27
|
## [2.0.0] — Workflow Platform GA (Major Release) (2026-05-25)
|
|
11
28
|
|
|
12
29
|
### v1.6.0 — API/SDK and Plugin Ecosystem (incremental)
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentic-stealth-browser
|
|
3
|
+
Version: 2.1.0
|
|
4
|
+
Summary: Production-grade, human-mimicking browser automation framework for autonomous agents. Survives modern anti-bot systems.
|
|
5
|
+
Author-email: Shane W <shanewas@users.noreply.github.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/shanewas/agentic-stealth-browser
|
|
8
|
+
Project-URL: Repository, https://github.com/shanewas/agentic-stealth-browser
|
|
9
|
+
Project-URL: Issues, https://github.com/shanewas/agentic-stealth-browser/issues
|
|
10
|
+
Project-URL: Documentation, https://github.com/shanewas/agentic-stealth-browser/tree/master/docs
|
|
11
|
+
Project-URL: Changelog, https://github.com/shanewas/agentic-stealth-browser/blob/master/CHANGELOG.md
|
|
12
|
+
Keywords: stealth,browser,automation,playwright,anti-bot,scraping,agent
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
|
|
22
|
+
Classifier: Topic :: Software Development :: Testing
|
|
23
|
+
Classifier: Framework :: AsyncIO
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: playwright
|
|
28
|
+
Requires-Dist: aiohttp
|
|
29
|
+
Requires-Dist: cryptography
|
|
30
|
+
Requires-Dist: pyyaml
|
|
31
|
+
Requires-Dist: fastapi
|
|
32
|
+
Requires-Dist: jinja2
|
|
33
|
+
Requires-Dist: uvicorn
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: pytest; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
38
|
+
Requires-Dist: httpx; extra == "dev"
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
|
|
41
|
+
# Agentic Stealth Browser
|
|
42
|
+
|
|
43
|
+
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
[](https://www.python.org/downloads/)
|
|
46
|
+
[](https://pypi.org/project/agentic-stealth-browser/)
|
|
47
|
+
[](tests/)
|
|
48
|
+
|
|
49
|
+
Python framework for browser automation that looks human. Handles Cloudflare, LinkedIn, Amazon, and other anti-bot systems. **v2.0.0 GA** — SDK, orchestration, security governance, adaptive stealth, plugins.
|
|
50
|
+
|
|
51
|
+
## Why This Exists
|
|
52
|
+
|
|
53
|
+
Standard `page.goto()` / `page.click()` gets detected instantly. This solves it with:
|
|
54
|
+
|
|
55
|
+
- **TLS fingerprint spoofing** — region-specific TLS handshakes (US, Japan, EU, Korea)
|
|
56
|
+
- **Human behavior** — Bézier mouse curves, natural typing, distraction simulation
|
|
57
|
+
- **Auto recovery** — detects CAPTCHAs, rate limits, blocks and recovers automatically
|
|
58
|
+
- **Workflow Teach/Replay** — record real browser actions via CDP, replay as YAML
|
|
59
|
+
|
|
60
|
+
## Quick Start
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pip install agentic-stealth-browser
|
|
64
|
+
playwright install --with-deps chromium
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from core.agent_browser import AgentBrowser
|
|
69
|
+
|
|
70
|
+
async with AgentBrowser(session_name="demo") as browser:
|
|
71
|
+
await browser.launch(headless=True)
|
|
72
|
+
await browser.safe_goto("https://example.com")
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## MCP + Dashboard Quick Start
|
|
76
|
+
|
|
77
|
+
Run the MCP server when an agent client needs tool access to the browser:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
python -m production.mcp_server
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Add this server to your MCP client config:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"mcpServers": {
|
|
88
|
+
"stealth-browser": {
|
|
89
|
+
"command": "python",
|
|
90
|
+
"args": ["-m", "production.mcp_server"]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Common MCP flow:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
1. stealth_launch -> start a named browser session
|
|
100
|
+
2. stealth_navigate -> open a URL with recovery behavior
|
|
101
|
+
3. stealth_tabs_list -> inspect current tabs/pages
|
|
102
|
+
4. stealth_tab_snapshot -> capture screenshot + metadata
|
|
103
|
+
5. stealth_teach -> save a demonstrated workflow
|
|
104
|
+
6. stealth_replay -> replay a saved workflow YAML
|
|
105
|
+
7. stealth_close -> close the session
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
For a human-agent shared browser console, start the Hermes dashboard:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
export HERMES_DASHBOARD_PASSWORD="replace-me"
|
|
112
|
+
agentic-stealth-browser dashboard --host 127.0.0.1 --port 8443
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Open `http://127.0.0.1:8443` in Edge and log in with that password. Use the dashboard to watch the live browser, switch backends, pause/resume automation, solve CAPTCHA/login challenges, record workflows, and replay them. See [docs/HERMES_BROWSER_DASHBOARD.md](docs/HERMES_BROWSER_DASHBOARD.md).
|
|
116
|
+
|
|
117
|
+
## Workflow System
|
|
118
|
+
|
|
119
|
+
Record real interactions and replay autonomously:
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
from workflows.recorder import WorkflowRecorder
|
|
123
|
+
from workflows.player import WorkflowPlayer
|
|
124
|
+
from workflows.schema import load_workflow
|
|
125
|
+
|
|
126
|
+
recorder = WorkflowRecorder(cdp_url="http://localhost:9222")
|
|
127
|
+
workflow = await recorder.record("upwork_update_title")
|
|
128
|
+
|
|
129
|
+
player = WorkflowPlayer(browser, workflow)
|
|
130
|
+
result = await player.execute()
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
13 step types: `navigate` · `click` · `fill` · `type` · `select` · `verify` · `wait` · `wait_for_element` · `scroll` · `screenshot` · `execute_js` · `conditional` · `run_workflow`
|
|
134
|
+
|
|
135
|
+
## Key Features
|
|
136
|
+
|
|
137
|
+
| Feature | What It Does |
|
|
138
|
+
|---|---|
|
|
139
|
+
| **TLS Fingerprinting** | JA3/JA4 region profiles |
|
|
140
|
+
| **Human Behavior** | Mouse wobble, typing mistakes, fatigue, distraction |
|
|
141
|
+
| **Auto Recovery** | Block detection → proxy/session rotation → retry |
|
|
142
|
+
| **Account Warming** | 14-day gradual ramp-up for new accounts |
|
|
143
|
+
| **Workflow Orchestrator** | Queue, schedule, domain concurrency, retries, persistence |
|
|
144
|
+
| **Python SDK** | `StealthClient` — async API without MCP |
|
|
145
|
+
| **Security Governance** | Input validation, session isolation, policy engine, approval gates |
|
|
146
|
+
| **Adaptive Stealth** | Per-domain behavior profiles with FeedbackStore telemetry |
|
|
147
|
+
| **Plugin System** | Lifecycle hooks via `BasePlugin` (launch, navigate, scrape, close) |
|
|
148
|
+
| **Feature Flags** | Runtime capability discovery per browser backend |
|
|
149
|
+
| **Migration Tools** | v1→v2 script, deprecation shims, migration guide |
|
|
150
|
+
| **Performance Profiling** | Timing decorators + `perf_benchmark.py` |
|
|
151
|
+
|
|
152
|
+
## MCP Setup
|
|
153
|
+
|
|
154
|
+
Add to `claude_desktop_config.json` or the equivalent MCP client config:
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"mcpServers": {
|
|
159
|
+
"stealth-browser": {
|
|
160
|
+
"command": "python",
|
|
161
|
+
"args": ["-m", "production.mcp_server"]
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Tools: `stealth_launch`, `stealth_navigate`, `stealth_load_cookies`, `stealth_scrape`, `stealth_teach`, `stealth_replay`, `stealth_tabs_list`, `stealth_session_timeline`, `stealth_close`, `stealth_capabilities`, and more.
|
|
168
|
+
|
|
169
|
+
Useful observability tools:
|
|
170
|
+
|
|
171
|
+
- `stealth_tabs_list`: list active tabs/pages.
|
|
172
|
+
- `stealth_tab_snapshot`: capture screenshot and page metadata.
|
|
173
|
+
- `stealth_session_timeline`: inspect recent action/recovery/debug events.
|
|
174
|
+
- `stealth_debug_report`: get redacted runtime diagnostics.
|
|
175
|
+
|
|
176
|
+
To expose a local CDP endpoint for supported clients, launch with `debug_cdp: true`, then call `stealth_get_cdp_endpoint`. The endpoint is localhost-only and should not be exposed directly to the internet.
|
|
177
|
+
|
|
178
|
+
## Orchestrator
|
|
179
|
+
|
|
180
|
+
Queue, schedule, and chain workflows with domain-aware concurrency:
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
from production.workflow_orchestrator import WorkflowOrchestrator
|
|
184
|
+
|
|
185
|
+
orch = WorkflowOrchestrator(domain_concurrency={"linkedin.com": 1})
|
|
186
|
+
await orch.enqueue("workflows/upwork/edit-title.yaml", priority=10)
|
|
187
|
+
await orch.schedule_recurring("workflows/linkedin/check-notifications.yaml", interval_seconds=3600)
|
|
188
|
+
await orch.run()
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Security
|
|
192
|
+
|
|
193
|
+
- **Input validation**: Type, length, pattern checks on all MCP tool params
|
|
194
|
+
- **Session isolation**: One context can't access another's browser instances
|
|
195
|
+
- **Policy engine**: YAML-based access control per site / step type
|
|
196
|
+
- **Approval gates**: Sensitive actions (navigate, execute_js) require explicit approval
|
|
197
|
+
|
|
198
|
+
## SDK
|
|
199
|
+
|
|
200
|
+
Use without MCP:
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
from production.sdk import StealthClient
|
|
204
|
+
|
|
205
|
+
async with StealthClient(session_name="mybot") as client:
|
|
206
|
+
await client.navigate("https://example.com")
|
|
207
|
+
result = await client.execute_workflow("linkedin/send-connection-request", variables={"name": "Jane"})
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Plugins
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
from plugins.template import ExamplePlugin
|
|
214
|
+
|
|
215
|
+
class MyPlugin(ExamplePlugin):
|
|
216
|
+
name = "my-plugin"
|
|
217
|
+
async def on_navigate(self, ctx, url):
|
|
218
|
+
ctx.logger.info(f"[{self.name}] Navigating to {url}")
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Hooks: `on_launch`, `on_navigate`, `on_page_loaded`, `on_scraped`, `on_close`.
|
|
222
|
+
|
|
223
|
+
## Migration v1 → v2
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
python scripts/migrate_v1_to_v2.py --input workflow.yaml --output workflow-v2.yaml
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Deprecated APIs (`self.context`, `ConnectionPool`, ad-hoc MCP responses) have shims. See [docs/rfc/v2-migration.md](docs/rfc/v2-migration.md).
|
|
230
|
+
|
|
231
|
+
## Project Structure
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
├── core/ AgentBrowser, connection pool, session checkpoints
|
|
235
|
+
├── stealth/ TLS, scripts, Firefox adapter, caching
|
|
236
|
+
├── behavior/ Human simulation, personas, adaptive tuning
|
|
237
|
+
├── recovery/ Anti-block orchestrator
|
|
238
|
+
├── workflows/ Recorder, player, schema, library
|
|
239
|
+
├── production/ MCP server, SDK, orchestrator, security, profiler
|
|
240
|
+
├── plugins/ Plugin system with template
|
|
241
|
+
├── scripts/ Migration, evaluation, benchmarking
|
|
242
|
+
└── docs/ ADRs, RFCs, capability map, guides
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Documentation
|
|
246
|
+
|
|
247
|
+
- [Architecture Decision Records](docs/adr/)
|
|
248
|
+
- [Operator Setup Guide](docs/OPERATOR_SETUP.md)
|
|
249
|
+
- [Capability Map](docs/CAPABILITY_MAP.md)
|
|
250
|
+
- [MCP Browser Observability](docs/MCP_BROWSER_OBSERVABILITY.md)
|
|
251
|
+
- [v2 Migration RFC](docs/rfc/v2-migration.md)
|
|
252
|
+
- [Stealth Limitations](docs/STEALTH_LIMITATIONS.md)
|
|
253
|
+
- [Threat Model](docs/THREAT_MODEL.md)
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Agentic Stealth Browser
|
|
2
|
+
|
|
3
|
+
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://www.python.org/downloads/)
|
|
6
|
+
[](https://pypi.org/project/agentic-stealth-browser/)
|
|
7
|
+
[](tests/)
|
|
8
|
+
|
|
9
|
+
Python framework for browser automation that looks human. Handles Cloudflare, LinkedIn, Amazon, and other anti-bot systems. **v2.0.0 GA** — SDK, orchestration, security governance, adaptive stealth, plugins.
|
|
10
|
+
|
|
11
|
+
## Why This Exists
|
|
12
|
+
|
|
13
|
+
Standard `page.goto()` / `page.click()` gets detected instantly. This solves it with:
|
|
14
|
+
|
|
15
|
+
- **TLS fingerprint spoofing** — region-specific TLS handshakes (US, Japan, EU, Korea)
|
|
16
|
+
- **Human behavior** — Bézier mouse curves, natural typing, distraction simulation
|
|
17
|
+
- **Auto recovery** — detects CAPTCHAs, rate limits, blocks and recovers automatically
|
|
18
|
+
- **Workflow Teach/Replay** — record real browser actions via CDP, replay as YAML
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pip install agentic-stealth-browser
|
|
24
|
+
playwright install --with-deps chromium
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
from core.agent_browser import AgentBrowser
|
|
29
|
+
|
|
30
|
+
async with AgentBrowser(session_name="demo") as browser:
|
|
31
|
+
await browser.launch(headless=True)
|
|
32
|
+
await browser.safe_goto("https://example.com")
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## MCP + Dashboard Quick Start
|
|
36
|
+
|
|
37
|
+
Run the MCP server when an agent client needs tool access to the browser:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
python -m production.mcp_server
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Add this server to your MCP client config:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"stealth-browser": {
|
|
49
|
+
"command": "python",
|
|
50
|
+
"args": ["-m", "production.mcp_server"]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Common MCP flow:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
1. stealth_launch -> start a named browser session
|
|
60
|
+
2. stealth_navigate -> open a URL with recovery behavior
|
|
61
|
+
3. stealth_tabs_list -> inspect current tabs/pages
|
|
62
|
+
4. stealth_tab_snapshot -> capture screenshot + metadata
|
|
63
|
+
5. stealth_teach -> save a demonstrated workflow
|
|
64
|
+
6. stealth_replay -> replay a saved workflow YAML
|
|
65
|
+
7. stealth_close -> close the session
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For a human-agent shared browser console, start the Hermes dashboard:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
export HERMES_DASHBOARD_PASSWORD="replace-me"
|
|
72
|
+
agentic-stealth-browser dashboard --host 127.0.0.1 --port 8443
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Open `http://127.0.0.1:8443` in Edge and log in with that password. Use the dashboard to watch the live browser, switch backends, pause/resume automation, solve CAPTCHA/login challenges, record workflows, and replay them. See [docs/HERMES_BROWSER_DASHBOARD.md](docs/HERMES_BROWSER_DASHBOARD.md).
|
|
76
|
+
|
|
77
|
+
## Workflow System
|
|
78
|
+
|
|
79
|
+
Record real interactions and replay autonomously:
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
from workflows.recorder import WorkflowRecorder
|
|
83
|
+
from workflows.player import WorkflowPlayer
|
|
84
|
+
from workflows.schema import load_workflow
|
|
85
|
+
|
|
86
|
+
recorder = WorkflowRecorder(cdp_url="http://localhost:9222")
|
|
87
|
+
workflow = await recorder.record("upwork_update_title")
|
|
88
|
+
|
|
89
|
+
player = WorkflowPlayer(browser, workflow)
|
|
90
|
+
result = await player.execute()
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
13 step types: `navigate` · `click` · `fill` · `type` · `select` · `verify` · `wait` · `wait_for_element` · `scroll` · `screenshot` · `execute_js` · `conditional` · `run_workflow`
|
|
94
|
+
|
|
95
|
+
## Key Features
|
|
96
|
+
|
|
97
|
+
| Feature | What It Does |
|
|
98
|
+
|---|---|
|
|
99
|
+
| **TLS Fingerprinting** | JA3/JA4 region profiles |
|
|
100
|
+
| **Human Behavior** | Mouse wobble, typing mistakes, fatigue, distraction |
|
|
101
|
+
| **Auto Recovery** | Block detection → proxy/session rotation → retry |
|
|
102
|
+
| **Account Warming** | 14-day gradual ramp-up for new accounts |
|
|
103
|
+
| **Workflow Orchestrator** | Queue, schedule, domain concurrency, retries, persistence |
|
|
104
|
+
| **Python SDK** | `StealthClient` — async API without MCP |
|
|
105
|
+
| **Security Governance** | Input validation, session isolation, policy engine, approval gates |
|
|
106
|
+
| **Adaptive Stealth** | Per-domain behavior profiles with FeedbackStore telemetry |
|
|
107
|
+
| **Plugin System** | Lifecycle hooks via `BasePlugin` (launch, navigate, scrape, close) |
|
|
108
|
+
| **Feature Flags** | Runtime capability discovery per browser backend |
|
|
109
|
+
| **Migration Tools** | v1→v2 script, deprecation shims, migration guide |
|
|
110
|
+
| **Performance Profiling** | Timing decorators + `perf_benchmark.py` |
|
|
111
|
+
|
|
112
|
+
## MCP Setup
|
|
113
|
+
|
|
114
|
+
Add to `claude_desktop_config.json` or the equivalent MCP client config:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"mcpServers": {
|
|
119
|
+
"stealth-browser": {
|
|
120
|
+
"command": "python",
|
|
121
|
+
"args": ["-m", "production.mcp_server"]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Tools: `stealth_launch`, `stealth_navigate`, `stealth_load_cookies`, `stealth_scrape`, `stealth_teach`, `stealth_replay`, `stealth_tabs_list`, `stealth_session_timeline`, `stealth_close`, `stealth_capabilities`, and more.
|
|
128
|
+
|
|
129
|
+
Useful observability tools:
|
|
130
|
+
|
|
131
|
+
- `stealth_tabs_list`: list active tabs/pages.
|
|
132
|
+
- `stealth_tab_snapshot`: capture screenshot and page metadata.
|
|
133
|
+
- `stealth_session_timeline`: inspect recent action/recovery/debug events.
|
|
134
|
+
- `stealth_debug_report`: get redacted runtime diagnostics.
|
|
135
|
+
|
|
136
|
+
To expose a local CDP endpoint for supported clients, launch with `debug_cdp: true`, then call `stealth_get_cdp_endpoint`. The endpoint is localhost-only and should not be exposed directly to the internet.
|
|
137
|
+
|
|
138
|
+
## Orchestrator
|
|
139
|
+
|
|
140
|
+
Queue, schedule, and chain workflows with domain-aware concurrency:
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
from production.workflow_orchestrator import WorkflowOrchestrator
|
|
144
|
+
|
|
145
|
+
orch = WorkflowOrchestrator(domain_concurrency={"linkedin.com": 1})
|
|
146
|
+
await orch.enqueue("workflows/upwork/edit-title.yaml", priority=10)
|
|
147
|
+
await orch.schedule_recurring("workflows/linkedin/check-notifications.yaml", interval_seconds=3600)
|
|
148
|
+
await orch.run()
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Security
|
|
152
|
+
|
|
153
|
+
- **Input validation**: Type, length, pattern checks on all MCP tool params
|
|
154
|
+
- **Session isolation**: One context can't access another's browser instances
|
|
155
|
+
- **Policy engine**: YAML-based access control per site / step type
|
|
156
|
+
- **Approval gates**: Sensitive actions (navigate, execute_js) require explicit approval
|
|
157
|
+
|
|
158
|
+
## SDK
|
|
159
|
+
|
|
160
|
+
Use without MCP:
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from production.sdk import StealthClient
|
|
164
|
+
|
|
165
|
+
async with StealthClient(session_name="mybot") as client:
|
|
166
|
+
await client.navigate("https://example.com")
|
|
167
|
+
result = await client.execute_workflow("linkedin/send-connection-request", variables={"name": "Jane"})
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Plugins
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
from plugins.template import ExamplePlugin
|
|
174
|
+
|
|
175
|
+
class MyPlugin(ExamplePlugin):
|
|
176
|
+
name = "my-plugin"
|
|
177
|
+
async def on_navigate(self, ctx, url):
|
|
178
|
+
ctx.logger.info(f"[{self.name}] Navigating to {url}")
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Hooks: `on_launch`, `on_navigate`, `on_page_loaded`, `on_scraped`, `on_close`.
|
|
182
|
+
|
|
183
|
+
## Migration v1 → v2
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
python scripts/migrate_v1_to_v2.py --input workflow.yaml --output workflow-v2.yaml
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Deprecated APIs (`self.context`, `ConnectionPool`, ad-hoc MCP responses) have shims. See [docs/rfc/v2-migration.md](docs/rfc/v2-migration.md).
|
|
190
|
+
|
|
191
|
+
## Project Structure
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
├── core/ AgentBrowser, connection pool, session checkpoints
|
|
195
|
+
├── stealth/ TLS, scripts, Firefox adapter, caching
|
|
196
|
+
├── behavior/ Human simulation, personas, adaptive tuning
|
|
197
|
+
├── recovery/ Anti-block orchestrator
|
|
198
|
+
├── workflows/ Recorder, player, schema, library
|
|
199
|
+
├── production/ MCP server, SDK, orchestrator, security, profiler
|
|
200
|
+
├── plugins/ Plugin system with template
|
|
201
|
+
├── scripts/ Migration, evaluation, benchmarking
|
|
202
|
+
└── docs/ ADRs, RFCs, capability map, guides
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Documentation
|
|
206
|
+
|
|
207
|
+
- [Architecture Decision Records](docs/adr/)
|
|
208
|
+
- [Operator Setup Guide](docs/OPERATOR_SETUP.md)
|
|
209
|
+
- [Capability Map](docs/CAPABILITY_MAP.md)
|
|
210
|
+
- [MCP Browser Observability](docs/MCP_BROWSER_OBSERVABILITY.md)
|
|
211
|
+
- [v2 Migration RFC](docs/rfc/v2-migration.md)
|
|
212
|
+
- [Stealth Limitations](docs/STEALTH_LIMITATIONS.md)
|
|
213
|
+
- [Threat Model](docs/THREAT_MODEL.md)
|
|
214
|
+
|
|
215
|
+
## License
|
|
216
|
+
|
|
217
|
+
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|