agentic-stealth-browser 2.1.1__tar.gz → 2.3.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.1.1 → agentic_stealth_browser-2.3.0}/CHANGELOG.md +31 -2
- agentic_stealth_browser-2.3.0/PKG-INFO +184 -0
- agentic_stealth_browser-2.3.0/README.md +145 -0
- agentic_stealth_browser-2.3.0/agentic_stealth_browser.egg-info/PKG-INFO +184 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/agent_browser.py +9 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/mcp_server.py +1 -1
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/pyproject.toml +1 -1
- agentic_stealth_browser-2.1.1/PKG-INFO +0 -383
- agentic_stealth_browser-2.1.1/README.md +0 -344
- agentic_stealth_browser-2.1.1/agentic_stealth_browser.egg-info/PKG-INFO +0 -383
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/.env.example +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/LICENSE +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/MANIFEST.in +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/agentic_stealth_browser.egg-info/SOURCES.txt +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/agentic_stealth_browser.egg-info/dependency_links.txt +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/agentic_stealth_browser.egg-info/entry_points.txt +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/agentic_stealth_browser.egg-info/requires.txt +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/agentic_stealth_browser.egg-info/top_level.txt +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/ai/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/ai/ai_hooks.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/audit/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/audit/logger.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/behavior/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/behavior/adaptive_tuner.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/behavior/human_behavior.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/behavior/orchestration.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/behavior/persona_rotator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/account_health.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/account_warming.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/connection_pool.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/error_messages.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/feature_flags.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/py.typed +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/session_checkpoint.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/core/types.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/examples/recipes/README.md +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/examples/recipes/linkedin.md +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/linkedin/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/linkedin/actions.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/Dockerfile +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/approval_gate.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/audit_enrichment.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/cli.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/deprecations.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/docker-compose.yml +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/docker-healthcheck.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/hermes_dashboard.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/mcp_input_validator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/mcp_session_isolation.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/metrics.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/otel_export.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/policy_engine.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/profiler.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/rate_limiter.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/production/workflow_orchestrator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/proxy/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/proxy/proxy_manager.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/recovery/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/recovery/anti_block_orchestrator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/recovery/detectors.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/recovery/explain_blocked.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/scraping/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/scraping/scraper.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/sessions/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/sessions/cookie_manager.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/sessions/session_manager.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/setup.cfg +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/advanced_stealth.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/cache.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/firefox_adapter.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/headers.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/presets.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/profiles.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/tls_fingerprint.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/stealth/tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/debug_nowsecure.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/detection_check.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/detection_runner.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/fingerprint_scorecard.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/run_detection_tests.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_account_health.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_account_warming.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_adaptive_tuner.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_basic.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_cdp_snapshots.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_connection_pool.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_contract_agent_browser.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_cookie_manager_unit.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_detectors.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_differential.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_docker_config.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_e2e_anti_block_recovery.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_e2e_protected_sites_placeholder.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_golden_master.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_hermes_dashboard.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_human_behavior_fuzz.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_integration_modules.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_linkedin_actions.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_mcp_contract.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_mcp_server_runtime.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_mcp_stealth_workflows.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_metrics_collector_unit.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_mutation_stealth.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_persona_rotator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_phase7_fixes.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_player.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_proxy_config_unit.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_proxy_manager.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_rate_limiter_unit.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_recorder.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_recovery.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_recovery_phase1.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_recovery_state_machine.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_rehearsal_validation.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_selector_auto_heal.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_session_checkpoint.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_stealth_cache.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_stealth_coverage.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_stealth_modules.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_stress_multi_account.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_workflow_orchestrator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_workflow_schema.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_workflow_schema_unit.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/tests/test_workflow_versioning.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/__init__.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/action_interpreter.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/player.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/recorder.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/recovery.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/schema.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/selector_generator.py +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/test-echo.yaml +0 -0
- {agentic_stealth_browser-2.1.1 → agentic_stealth_browser-2.3.0}/workflows/variable_resolver.py +0 -0
|
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [2.3.0] — Show HN & Community Launch (2026-05-28)
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Show HN preparation**: Complete README overhaul with demo GIF, streamlined onboarding, and community-facing tone. (#HN)
|
|
14
|
+
- **Buy Me A Coffee badge**: Support link in README for community sponsorship. (#badge)
|
|
15
|
+
- **`_browser_process` exposure**: External PID tracking via `AgentBrowser._browser_process`, enabling process-level monitoring and recovery. (#pid)
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- Full README rewrite for PyPI + HN audience (pip-first install path, Quick Start with CLI + Python SDK + MCP, reduced wall-of-text, more code examples).
|
|
19
|
+
- Demo GIF (`assets/hn-demo.gif`) showing end-to-end stealth browser flow.
|
|
20
|
+
- Various lint fixes for demo scripts.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Stray temp files cleaned from repo root.
|
|
24
|
+
- Ruff formatting applied across all Python sources.
|
|
25
|
+
|
|
26
|
+
## [2.1.1] — PyPI & Docs Consolidation (2026-05-27)
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- **PyPI publish workflow** (`.github/workflows/pypi-publish.yml`): OIDC trusted publishing for automated release deployment. (#pypi)
|
|
30
|
+
- **PyPI release readiness**: README polished for pip-first consumption, badges and metadata tuned for PyPI listing.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
- **Docs consolidation**: `docs/` folder removed, all documentation consolidated into README.md for a single source of truth. Content preserved (THREAT_MODEL, STEALTH_LIMITATIONS, ADRs, etc. remain accessible via GitHub blob links).
|
|
34
|
+
- ruff formatting applied across dashboard codebase.
|
|
35
|
+
|
|
10
36
|
## [2.1.0] — Hermes Browser Dashboard (2026-05-30)
|
|
11
37
|
|
|
12
38
|
### Added
|
|
@@ -272,8 +298,11 @@ See the full v0.9.0 milestone and the stacked PRs #383/#384/#385 for implementat
|
|
|
272
298
|
|
|
273
299
|
---
|
|
274
300
|
|
|
275
|
-
[unreleased]: https://github.com/shanewas/agentic-stealth-browser/compare/
|
|
276
|
-
[
|
|
301
|
+
[unreleased]: https://github.com/shanewas/agentic-stealth-browser/compare/v2.3.0...HEAD
|
|
302
|
+
[2.3.0]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v2.3.0
|
|
303
|
+
[2.1.1]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v2.1.1
|
|
304
|
+
[2.1.0]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v2.1.0
|
|
305
|
+
[2.0.0]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v2.0.0
|
|
277
306
|
[0.9.0]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v0.9.0
|
|
278
307
|
[0.2.0]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v0.2.0
|
|
279
308
|
[0.1.0]: https://github.com/shanewas/agentic-stealth-browser/releases/tag/v0.1.0
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentic-stealth-browser
|
|
3
|
+
Version: 2.3.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-Expression: 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: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
|
|
21
|
+
Classifier: Topic :: Software Development :: Testing
|
|
22
|
+
Classifier: Framework :: AsyncIO
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: playwright
|
|
27
|
+
Requires-Dist: aiohttp
|
|
28
|
+
Requires-Dist: cryptography
|
|
29
|
+
Requires-Dist: pyyaml
|
|
30
|
+
Requires-Dist: fastapi
|
|
31
|
+
Requires-Dist: jinja2
|
|
32
|
+
Requires-Dist: uvicorn
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: pytest; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
37
|
+
Requires-Dist: httpx; extra == "dev"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# Agentic Stealth Browser
|
|
41
|
+
|
|
42
|
+
**Playwright gets detected. This doesn't.**
|
|
43
|
+
|
|
44
|
+
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
45
|
+
[](LICENSE)
|
|
46
|
+
[](https://www.python.org/downloads/)
|
|
47
|
+
[](https://pypi.org/project/agentic-stealth-browser/)
|
|
48
|
+
[](tests/)
|
|
49
|
+
[](https://buymeacoffee.com/shanewas)
|
|
50
|
+
|
|
51
|
+
<p align="center">
|
|
52
|
+
<img src="assets/hn-demo.gif" alt="Agentic Stealth Browser Demo" width="90%">
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
Production-grade stealth browser automation that **survives Cloudflare, LinkedIn, Amazon, and other anti-bot systems** by looking convincingly human at every layer.
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install agentic-stealth-browser
|
|
59
|
+
playwright install --with-deps chromium
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from core.agent_browser import AgentBrowser
|
|
64
|
+
|
|
65
|
+
async with AgentBrowser(session_name="demo") as browser:
|
|
66
|
+
await browser.launch(headless=True)
|
|
67
|
+
await browser.safe_goto("https://bot.sannysoft.com")
|
|
68
|
+
# ✓ passes WebGL, Canvas, AudioContext, WebRTC, and TLS fingerprinting
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Why vanilla Playwright fails
|
|
74
|
+
|
|
75
|
+
Sites don't just check your User-Agent anymore. They check *everything*:
|
|
76
|
+
|
|
77
|
+
| Attack Surface | Vanilla Playwright | This library |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| **TLS handshake** (JA3/JA4 fingerprint) | Standard Python TLS — instantly identifiable | Region-spoofed profiles (US, Japan, EU, Korea) |
|
|
80
|
+
| **Navigator APIs** (`navigator.webdriver`, `plugins`, `languages`) | Leaks automation flags everywhere | Every property patched before first paint |
|
|
81
|
+
| **WebGL / Canvas fingerprint** | Headless GPU renders differently | Consistent buffers across sessions |
|
|
82
|
+
| **Human behavior** | Robotic clicks, instant typing | Bézier mouse curves, variable speed, fatigue simulation |
|
|
83
|
+
| **Auto-recovery** | None — blocks = failure | CAPTCHA detection → proxy rotation → retry chain |
|
|
84
|
+
| **Account warming** | Nothing | 14-day graduated ramp-up per account |
|
|
85
|
+
|
|
86
|
+
Result: **passes bot.sannysoft.com, pixelscan.net, and CreepJS** with zero flags in headless mode.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Quick Start
|
|
91
|
+
|
|
92
|
+
### CLI (easiest)
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Health check + stealth fingerprint test
|
|
96
|
+
stealth-browser health --preset linkedin_2026 --region us
|
|
97
|
+
|
|
98
|
+
# Start the operator dashboard
|
|
99
|
+
agentic-stealth-browser dashboard
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Python SDK
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from core.agent_browser import AgentBrowser
|
|
106
|
+
|
|
107
|
+
async with AgentBrowser(
|
|
108
|
+
session_name="my-session",
|
|
109
|
+
region="japan",
|
|
110
|
+
headless=True
|
|
111
|
+
) as browser:
|
|
112
|
+
await browser.launch()
|
|
113
|
+
await browser.safe_goto("https://example.com")
|
|
114
|
+
# TLS-spoofed, no webdriver leak, human-like interaction ready
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### MCP (for AI agent clients)
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"mcpServers": {
|
|
122
|
+
"stealth-browser": {
|
|
123
|
+
"command": "python",
|
|
124
|
+
"args": ["-m", "production.mcp_server"]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Then: `stealth_launch` → `stealth_navigate` → `stealth_scrape` → `stealth_close`.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Key Features
|
|
135
|
+
|
|
136
|
+
| Feature | What It Does |
|
|
137
|
+
|---|---|
|
|
138
|
+
| **TLS Fingerprinting** | JA3/JA4 region profiles |
|
|
139
|
+
| **Human Behavior** | Mouse wobble, typing mistakes, fatigue, distraction |
|
|
140
|
+
| **Auto Recovery** | Block detection → proxy/session rotation → retry |
|
|
141
|
+
| **Account Warming** | 14-day gradual ramp-up for new accounts |
|
|
142
|
+
| **Workflow Orchestrator** | Queue, schedule, domain concurrency, retries, persistence |
|
|
143
|
+
| **Python SDK** | `StealthClient` — async API without MCP |
|
|
144
|
+
| **Security Governance** | Input validation, session isolation, policy engine, approval gates |
|
|
145
|
+
| **Adaptive Stealth** | Per-domain behavior profiles with FeedbackStore telemetry |
|
|
146
|
+
| **Plugin System** | Lifecycle hooks via `BasePlugin` |
|
|
147
|
+
| **Operator Dashboard** | Live DevTools, CAPTCHA intervention, workflow recording |
|
|
148
|
+
| **Feature Flags** | Runtime capability discovery per browser backend |
|
|
149
|
+
| **Performance Profiling** | Timing decorators + `perf_benchmark.py` |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Full Documentation
|
|
154
|
+
|
|
155
|
+
- **Workflow System** — record real browser actions via CDP, replay as YAML (13 step types)
|
|
156
|
+
- **Operator Dashboard** — Grok/X-inspired dark UI, live browser view, CAPTCHA solving, workflow recording
|
|
157
|
+
- **Orchestrator** — queue, schedule, chain workflows with domain-aware concurrency
|
|
158
|
+
- **Security** — input validation, session isolation, policy engine, approval gates
|
|
159
|
+
- **SDK** — `StealthClient` async API without MCP
|
|
160
|
+
- **Plugins** — lifecycle hooks for custom behavior
|
|
161
|
+
- **VPS Deployment** — systemd, Caddy reverse proxy, Cloudflare Tunnel patterns
|
|
162
|
+
- **Migration v1 → v2** — deprecation shims, migration guide, script
|
|
163
|
+
|
|
164
|
+
See sections below for each topic. For release history: [CHANGELOG.md](CHANGELOG.md).
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Project Structure
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
├── core/ AgentBrowser, connection pool, session checkpoints
|
|
172
|
+
├── stealth/ TLS, scripts, Firefox adapter, caching
|
|
173
|
+
├── behavior/ Human simulation, personas, adaptive tuning
|
|
174
|
+
├── recovery/ Anti-block orchestrator
|
|
175
|
+
├── workflows/ Recorder, player, schema, library
|
|
176
|
+
├── production/ MCP server, SDK, orchestrator, security, profiler
|
|
177
|
+
├── plugins/ Plugin system with template
|
|
178
|
+
├── scripts/ Migration, evaluation, benchmarking
|
|
179
|
+
└── tests/ 880+ contract + integration tests
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## License
|
|
183
|
+
|
|
184
|
+
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Agentic Stealth Browser
|
|
2
|
+
|
|
3
|
+
**Playwright gets detected. This doesn't.**
|
|
4
|
+
|
|
5
|
+
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://www.python.org/downloads/)
|
|
8
|
+
[](https://pypi.org/project/agentic-stealth-browser/)
|
|
9
|
+
[](tests/)
|
|
10
|
+
[](https://buymeacoffee.com/shanewas)
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<img src="assets/hn-demo.gif" alt="Agentic Stealth Browser Demo" width="90%">
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
Production-grade stealth browser automation that **survives Cloudflare, LinkedIn, Amazon, and other anti-bot systems** by looking convincingly human at every layer.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pip install agentic-stealth-browser
|
|
20
|
+
playwright install --with-deps chromium
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from core.agent_browser import AgentBrowser
|
|
25
|
+
|
|
26
|
+
async with AgentBrowser(session_name="demo") as browser:
|
|
27
|
+
await browser.launch(headless=True)
|
|
28
|
+
await browser.safe_goto("https://bot.sannysoft.com")
|
|
29
|
+
# ✓ passes WebGL, Canvas, AudioContext, WebRTC, and TLS fingerprinting
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Why vanilla Playwright fails
|
|
35
|
+
|
|
36
|
+
Sites don't just check your User-Agent anymore. They check *everything*:
|
|
37
|
+
|
|
38
|
+
| Attack Surface | Vanilla Playwright | This library |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| **TLS handshake** (JA3/JA4 fingerprint) | Standard Python TLS — instantly identifiable | Region-spoofed profiles (US, Japan, EU, Korea) |
|
|
41
|
+
| **Navigator APIs** (`navigator.webdriver`, `plugins`, `languages`) | Leaks automation flags everywhere | Every property patched before first paint |
|
|
42
|
+
| **WebGL / Canvas fingerprint** | Headless GPU renders differently | Consistent buffers across sessions |
|
|
43
|
+
| **Human behavior** | Robotic clicks, instant typing | Bézier mouse curves, variable speed, fatigue simulation |
|
|
44
|
+
| **Auto-recovery** | None — blocks = failure | CAPTCHA detection → proxy rotation → retry chain |
|
|
45
|
+
| **Account warming** | Nothing | 14-day graduated ramp-up per account |
|
|
46
|
+
|
|
47
|
+
Result: **passes bot.sannysoft.com, pixelscan.net, and CreepJS** with zero flags in headless mode.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
### CLI (easiest)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Health check + stealth fingerprint test
|
|
57
|
+
stealth-browser health --preset linkedin_2026 --region us
|
|
58
|
+
|
|
59
|
+
# Start the operator dashboard
|
|
60
|
+
agentic-stealth-browser dashboard
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Python SDK
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from core.agent_browser import AgentBrowser
|
|
67
|
+
|
|
68
|
+
async with AgentBrowser(
|
|
69
|
+
session_name="my-session",
|
|
70
|
+
region="japan",
|
|
71
|
+
headless=True
|
|
72
|
+
) as browser:
|
|
73
|
+
await browser.launch()
|
|
74
|
+
await browser.safe_goto("https://example.com")
|
|
75
|
+
# TLS-spoofed, no webdriver leak, human-like interaction ready
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### MCP (for AI agent clients)
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"stealth-browser": {
|
|
84
|
+
"command": "python",
|
|
85
|
+
"args": ["-m", "production.mcp_server"]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Then: `stealth_launch` → `stealth_navigate` → `stealth_scrape` → `stealth_close`.
|
|
92
|
+
|
|
93
|
+
---
|
|
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` |
|
|
108
|
+
| **Operator Dashboard** | Live DevTools, CAPTCHA intervention, workflow recording |
|
|
109
|
+
| **Feature Flags** | Runtime capability discovery per browser backend |
|
|
110
|
+
| **Performance Profiling** | Timing decorators + `perf_benchmark.py` |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Full Documentation
|
|
115
|
+
|
|
116
|
+
- **Workflow System** — record real browser actions via CDP, replay as YAML (13 step types)
|
|
117
|
+
- **Operator Dashboard** — Grok/X-inspired dark UI, live browser view, CAPTCHA solving, workflow recording
|
|
118
|
+
- **Orchestrator** — queue, schedule, chain workflows with domain-aware concurrency
|
|
119
|
+
- **Security** — input validation, session isolation, policy engine, approval gates
|
|
120
|
+
- **SDK** — `StealthClient` async API without MCP
|
|
121
|
+
- **Plugins** — lifecycle hooks for custom behavior
|
|
122
|
+
- **VPS Deployment** — systemd, Caddy reverse proxy, Cloudflare Tunnel patterns
|
|
123
|
+
- **Migration v1 → v2** — deprecation shims, migration guide, script
|
|
124
|
+
|
|
125
|
+
See sections below for each topic. For release history: [CHANGELOG.md](CHANGELOG.md).
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Project Structure
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
├── core/ AgentBrowser, connection pool, session checkpoints
|
|
133
|
+
├── stealth/ TLS, scripts, Firefox adapter, caching
|
|
134
|
+
├── behavior/ Human simulation, personas, adaptive tuning
|
|
135
|
+
├── recovery/ Anti-block orchestrator
|
|
136
|
+
├── workflows/ Recorder, player, schema, library
|
|
137
|
+
├── production/ MCP server, SDK, orchestrator, security, profiler
|
|
138
|
+
├── plugins/ Plugin system with template
|
|
139
|
+
├── scripts/ Migration, evaluation, benchmarking
|
|
140
|
+
└── tests/ 880+ contract + integration tests
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## License
|
|
144
|
+
|
|
145
|
+
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentic-stealth-browser
|
|
3
|
+
Version: 2.3.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-Expression: 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: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
|
|
21
|
+
Classifier: Topic :: Software Development :: Testing
|
|
22
|
+
Classifier: Framework :: AsyncIO
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: playwright
|
|
27
|
+
Requires-Dist: aiohttp
|
|
28
|
+
Requires-Dist: cryptography
|
|
29
|
+
Requires-Dist: pyyaml
|
|
30
|
+
Requires-Dist: fastapi
|
|
31
|
+
Requires-Dist: jinja2
|
|
32
|
+
Requires-Dist: uvicorn
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: pytest; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
37
|
+
Requires-Dist: httpx; extra == "dev"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# Agentic Stealth Browser
|
|
41
|
+
|
|
42
|
+
**Playwright gets detected. This doesn't.**
|
|
43
|
+
|
|
44
|
+
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
45
|
+
[](LICENSE)
|
|
46
|
+
[](https://www.python.org/downloads/)
|
|
47
|
+
[](https://pypi.org/project/agentic-stealth-browser/)
|
|
48
|
+
[](tests/)
|
|
49
|
+
[](https://buymeacoffee.com/shanewas)
|
|
50
|
+
|
|
51
|
+
<p align="center">
|
|
52
|
+
<img src="assets/hn-demo.gif" alt="Agentic Stealth Browser Demo" width="90%">
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
Production-grade stealth browser automation that **survives Cloudflare, LinkedIn, Amazon, and other anti-bot systems** by looking convincingly human at every layer.
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install agentic-stealth-browser
|
|
59
|
+
playwright install --with-deps chromium
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from core.agent_browser import AgentBrowser
|
|
64
|
+
|
|
65
|
+
async with AgentBrowser(session_name="demo") as browser:
|
|
66
|
+
await browser.launch(headless=True)
|
|
67
|
+
await browser.safe_goto("https://bot.sannysoft.com")
|
|
68
|
+
# ✓ passes WebGL, Canvas, AudioContext, WebRTC, and TLS fingerprinting
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Why vanilla Playwright fails
|
|
74
|
+
|
|
75
|
+
Sites don't just check your User-Agent anymore. They check *everything*:
|
|
76
|
+
|
|
77
|
+
| Attack Surface | Vanilla Playwright | This library |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| **TLS handshake** (JA3/JA4 fingerprint) | Standard Python TLS — instantly identifiable | Region-spoofed profiles (US, Japan, EU, Korea) |
|
|
80
|
+
| **Navigator APIs** (`navigator.webdriver`, `plugins`, `languages`) | Leaks automation flags everywhere | Every property patched before first paint |
|
|
81
|
+
| **WebGL / Canvas fingerprint** | Headless GPU renders differently | Consistent buffers across sessions |
|
|
82
|
+
| **Human behavior** | Robotic clicks, instant typing | Bézier mouse curves, variable speed, fatigue simulation |
|
|
83
|
+
| **Auto-recovery** | None — blocks = failure | CAPTCHA detection → proxy rotation → retry chain |
|
|
84
|
+
| **Account warming** | Nothing | 14-day graduated ramp-up per account |
|
|
85
|
+
|
|
86
|
+
Result: **passes bot.sannysoft.com, pixelscan.net, and CreepJS** with zero flags in headless mode.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Quick Start
|
|
91
|
+
|
|
92
|
+
### CLI (easiest)
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Health check + stealth fingerprint test
|
|
96
|
+
stealth-browser health --preset linkedin_2026 --region us
|
|
97
|
+
|
|
98
|
+
# Start the operator dashboard
|
|
99
|
+
agentic-stealth-browser dashboard
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Python SDK
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from core.agent_browser import AgentBrowser
|
|
106
|
+
|
|
107
|
+
async with AgentBrowser(
|
|
108
|
+
session_name="my-session",
|
|
109
|
+
region="japan",
|
|
110
|
+
headless=True
|
|
111
|
+
) as browser:
|
|
112
|
+
await browser.launch()
|
|
113
|
+
await browser.safe_goto("https://example.com")
|
|
114
|
+
# TLS-spoofed, no webdriver leak, human-like interaction ready
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### MCP (for AI agent clients)
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"mcpServers": {
|
|
122
|
+
"stealth-browser": {
|
|
123
|
+
"command": "python",
|
|
124
|
+
"args": ["-m", "production.mcp_server"]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Then: `stealth_launch` → `stealth_navigate` → `stealth_scrape` → `stealth_close`.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Key Features
|
|
135
|
+
|
|
136
|
+
| Feature | What It Does |
|
|
137
|
+
|---|---|
|
|
138
|
+
| **TLS Fingerprinting** | JA3/JA4 region profiles |
|
|
139
|
+
| **Human Behavior** | Mouse wobble, typing mistakes, fatigue, distraction |
|
|
140
|
+
| **Auto Recovery** | Block detection → proxy/session rotation → retry |
|
|
141
|
+
| **Account Warming** | 14-day gradual ramp-up for new accounts |
|
|
142
|
+
| **Workflow Orchestrator** | Queue, schedule, domain concurrency, retries, persistence |
|
|
143
|
+
| **Python SDK** | `StealthClient` — async API without MCP |
|
|
144
|
+
| **Security Governance** | Input validation, session isolation, policy engine, approval gates |
|
|
145
|
+
| **Adaptive Stealth** | Per-domain behavior profiles with FeedbackStore telemetry |
|
|
146
|
+
| **Plugin System** | Lifecycle hooks via `BasePlugin` |
|
|
147
|
+
| **Operator Dashboard** | Live DevTools, CAPTCHA intervention, workflow recording |
|
|
148
|
+
| **Feature Flags** | Runtime capability discovery per browser backend |
|
|
149
|
+
| **Performance Profiling** | Timing decorators + `perf_benchmark.py` |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Full Documentation
|
|
154
|
+
|
|
155
|
+
- **Workflow System** — record real browser actions via CDP, replay as YAML (13 step types)
|
|
156
|
+
- **Operator Dashboard** — Grok/X-inspired dark UI, live browser view, CAPTCHA solving, workflow recording
|
|
157
|
+
- **Orchestrator** — queue, schedule, chain workflows with domain-aware concurrency
|
|
158
|
+
- **Security** — input validation, session isolation, policy engine, approval gates
|
|
159
|
+
- **SDK** — `StealthClient` async API without MCP
|
|
160
|
+
- **Plugins** — lifecycle hooks for custom behavior
|
|
161
|
+
- **VPS Deployment** — systemd, Caddy reverse proxy, Cloudflare Tunnel patterns
|
|
162
|
+
- **Migration v1 → v2** — deprecation shims, migration guide, script
|
|
163
|
+
|
|
164
|
+
See sections below for each topic. For release history: [CHANGELOG.md](CHANGELOG.md).
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Project Structure
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
├── core/ AgentBrowser, connection pool, session checkpoints
|
|
172
|
+
├── stealth/ TLS, scripts, Firefox adapter, caching
|
|
173
|
+
├── behavior/ Human simulation, personas, adaptive tuning
|
|
174
|
+
├── recovery/ Anti-block orchestrator
|
|
175
|
+
├── workflows/ Recorder, player, schema, library
|
|
176
|
+
├── production/ MCP server, SDK, orchestrator, security, profiler
|
|
177
|
+
├── plugins/ Plugin system with template
|
|
178
|
+
├── scripts/ Migration, evaluation, benchmarking
|
|
179
|
+
└── tests/ 880+ contract + integration tests
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## License
|
|
183
|
+
|
|
184
|
+
MIT. See [LICENSE](LICENSE) and [CHANGELOG.md](CHANGELOG.md).
|
|
@@ -250,6 +250,7 @@ class AgentBrowser:
|
|
|
250
250
|
self.use_pooled_context: bool = use_pooled_context # #57/#48/#47 scalability: when True, launch uses shared browser pool instead of per-instance launch_persistent_context
|
|
251
251
|
self._using_pool: bool = False
|
|
252
252
|
self._pooled_ctx_id: Optional[int] = None # track for release
|
|
253
|
+
self._browser_process = None # set after launch for PID tracking
|
|
253
254
|
|
|
254
255
|
# #136: Tool-level rate limiter for public API surface (MCP tool calls)
|
|
255
256
|
if rate_limits is not None:
|
|
@@ -636,6 +637,14 @@ class AgentBrowser:
|
|
|
636
637
|
self.browser = await pw.chromium.launch_persistent_context(**lp_kwargs)
|
|
637
638
|
self.browser_context = self.browser
|
|
638
639
|
|
|
640
|
+
# Capture browser subprocess PID for external lifecycle management
|
|
641
|
+
try:
|
|
642
|
+
pw_browser_obj = self.browser.browser # BrowserContext -> Browser
|
|
643
|
+
if pw_browser_obj is not None:
|
|
644
|
+
self._browser_process = pw_browser_obj.process
|
|
645
|
+
except Exception:
|
|
646
|
+
self._browser_process = None
|
|
647
|
+
|
|
639
648
|
# #377: discover CDP WS endpoint if enabled (uses Chrome's DevToolsActivePort + /json/version; stdlib only)
|
|
640
649
|
if getattr(self, "debug_cdp", False):
|
|
641
650
|
try:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agentic-stealth-browser"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.3.0"
|
|
8
8
|
description = "Production-grade, human-mimicking browser automation framework for autonomous agents. Survives modern anti-bot systems."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|