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.
Files changed (140) hide show
  1. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/CHANGELOG.md +17 -0
  2. agentic_stealth_browser-2.1.0/PKG-INFO +257 -0
  3. agentic_stealth_browser-2.1.0/README.md +217 -0
  4. agentic_stealth_browser-2.1.0/agentic_stealth_browser.egg-info/PKG-INFO +257 -0
  5. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/SOURCES.txt +2 -0
  6. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/requires.txt +4 -0
  7. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/ai/ai_hooks.py +16 -5
  8. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/audit/logger.py +143 -68
  9. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/adaptive_tuner.py +86 -40
  10. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/human_behavior.py +162 -64
  11. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/orchestration.py +20 -20
  12. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/persona_rotator.py +38 -17
  13. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/account_health.py +37 -16
  14. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/account_warming.py +7 -6
  15. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/agent_browser.py +533 -175
  16. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/connection_pool.py +6 -2
  17. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/error_messages.py +13 -12
  18. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/feature_flags.py +5 -2
  19. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/session_checkpoint.py +5 -1
  20. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/types.py +14 -1
  21. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/linkedin/actions.py +9 -3
  22. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/Dockerfile +7 -4
  23. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/approval_gate.py +4 -1
  24. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/cli.py +103 -24
  25. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/deprecations.py +13 -3
  26. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/docker-healthcheck.py +2 -0
  27. agentic_stealth_browser-2.1.0/production/hermes_dashboard.py +921 -0
  28. agentic_stealth_browser-2.1.0/production/mcp_input_validator.py +248 -0
  29. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/mcp_server.py +260 -81
  30. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/mcp_session_isolation.py +22 -13
  31. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/metrics.py +61 -26
  32. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/otel_export.py +38 -33
  33. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/policy_engine.py +30 -11
  34. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/profiler.py +1 -4
  35. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/rate_limiter.py +38 -21
  36. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/workflow_orchestrator.py +41 -22
  37. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/proxy/proxy_manager.py +48 -21
  38. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/pyproject.toml +22 -2
  39. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/anti_block_orchestrator.py +307 -98
  40. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/detectors.py +75 -43
  41. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/explain_blocked.py +24 -7
  42. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/scraping/scraper.py +16 -8
  43. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/sessions/cookie_manager.py +250 -68
  44. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/sessions/session_manager.py +47 -17
  45. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/advanced_stealth.py +39 -13
  46. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/cache.py +13 -5
  47. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/firefox_adapter.py +3 -5
  48. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/headers.py +1 -1
  49. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/presets.py +27 -9
  50. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/profiles.py +34 -16
  51. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/tls_fingerprint.py +115 -59
  52. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/tls_ja3_ja4.py +139 -28
  53. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/debug_nowsecure.py +8 -3
  54. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/detection_check.py +1 -0
  55. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/detection_runner.py +34 -24
  56. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/fingerprint_scorecard.py +105 -44
  57. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/run_detection_tests.py +7 -7
  58. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_account_health.py +10 -2
  59. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_account_warming.py +3 -1
  60. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_adaptive_tuner.py +3 -3
  61. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_basic.py +1 -1
  62. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_cdp_snapshots.py +6 -6
  63. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_contract_agent_browser.py +52 -46
  64. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_cookie_manager_unit.py +7 -3
  65. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_differential.py +5 -0
  66. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_docker_config.py +18 -27
  67. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_e2e_anti_block_recovery.py +71 -26
  68. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_e2e_protected_sites_placeholder.py +3 -1
  69. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_golden_master.py +7 -9
  70. agentic_stealth_browser-2.1.0/tests/test_hermes_dashboard.py +200 -0
  71. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_human_behavior_fuzz.py +24 -63
  72. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_linkedin_actions.py +24 -19
  73. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mcp_contract.py +59 -34
  74. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mcp_server_runtime.py +122 -29
  75. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mcp_stealth_workflows.py +34 -9
  76. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_metrics_collector_unit.py +1 -1
  77. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_mutation_stealth.py +5 -9
  78. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_phase7_fixes.py +138 -37
  79. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_player.py +40 -21
  80. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_proxy_config_unit.py +5 -1
  81. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_proxy_manager.py +17 -41
  82. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_rate_limiter_unit.py +5 -2
  83. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recorder.py +57 -19
  84. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recovery.py +39 -23
  85. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recovery_phase1.py +7 -7
  86. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_recovery_state_machine.py +33 -9
  87. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_rehearsal_validation.py +42 -12
  88. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_selector_auto_heal.py +21 -6
  89. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_session_checkpoint.py +12 -11
  90. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stealth_coverage.py +10 -2
  91. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stealth_modules.py +11 -3
  92. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stress_multi_account.py +14 -2
  93. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_orchestrator.py +4 -3
  94. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_schema.py +33 -15
  95. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_schema_unit.py +42 -9
  96. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_workflow_versioning.py +108 -33
  97. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/action_interpreter.py +6 -1
  98. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/player.py +142 -71
  99. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/recorder.py +162 -90
  100. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/recovery.py +40 -14
  101. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/schema.py +46 -36
  102. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/selector_generator.py +76 -49
  103. agentic_stealth_browser-2.0.0/PKG-INFO +0 -370
  104. agentic_stealth_browser-2.0.0/README.md +0 -334
  105. agentic_stealth_browser-2.0.0/agentic_stealth_browser.egg-info/PKG-INFO +0 -370
  106. agentic_stealth_browser-2.0.0/production/mcp_input_validator.py +0 -184
  107. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/.env.example +0 -0
  108. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/LICENSE +0 -0
  109. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/MANIFEST.in +0 -0
  110. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/dependency_links.txt +0 -0
  111. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/entry_points.txt +0 -0
  112. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/agentic_stealth_browser.egg-info/top_level.txt +0 -0
  113. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/ai/__init__.py +0 -0
  114. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/audit/__init__.py +0 -0
  115. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/behavior/__init__.py +0 -0
  116. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/__init__.py +0 -0
  117. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/core/py.typed +0 -0
  118. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/docs/THREAT_MODEL.md +0 -0
  119. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/docs/using-as-library.md +0 -0
  120. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/examples/recipes/README.md +0 -0
  121. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/examples/recipes/linkedin.md +0 -0
  122. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/linkedin/__init__.py +0 -0
  123. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/__init__.py +0 -0
  124. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/audit_enrichment.py +0 -0
  125. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/production/docker-compose.yml +0 -0
  126. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/proxy/__init__.py +0 -0
  127. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/recovery/__init__.py +0 -0
  128. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/scraping/__init__.py +0 -0
  129. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/sessions/__init__.py +0 -0
  130. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/setup.cfg +0 -0
  131. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/stealth/__init__.py +0 -0
  132. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_connection_pool.py +0 -0
  133. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_detectors.py +0 -0
  134. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_integration_modules.py +0 -0
  135. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_persona_rotator.py +0 -0
  136. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_stealth_cache.py +0 -0
  137. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/tests/test_tls_ja3_ja4.py +0 -0
  138. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/__init__.py +0 -0
  139. {agentic_stealth_browser-2.0.0 → agentic_stealth_browser-2.1.0}/workflows/test-echo.yaml +0 -0
  140. {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
+ [![CI](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml/badge.svg)](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
44
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
45
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
46
+ [![Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://pypi.org/project/agentic-stealth-browser/)
47
+ [![Tests](https://img.shields.io/badge/tests-880%2B%20passing-brightgreen)](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
+ [![CI](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml/badge.svg)](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
6
+ [![Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://pypi.org/project/agentic-stealth-browser/)
7
+ [![Tests](https://img.shields.io/badge/tests-880%2B%20passing-brightgreen)](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).