agentic-stealth-browser 2.6.0__tar.gz → 2.7.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.6.0 → agentic_stealth_browser-2.7.0}/CHANGELOG.md +44 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/PKG-INFO +19 -14
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/README.md +7 -2
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/SECURITY.md +4 -2
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/agentic_stealth_browser.egg-info/PKG-INFO +19 -14
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/agentic_stealth_browser.egg-info/SOURCES.txt +3 -0
- agentic_stealth_browser-2.7.0/agentic_stealth_browser.egg-info/requires.txt +13 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/agent_browser.py +3 -0
- agentic_stealth_browser-2.7.0/docs/DATA_HANDLING.md +19 -0
- agentic_stealth_browser-2.7.0/docs/INCIDENT_RESPONSE.md +22 -0
- agentic_stealth_browser-2.7.0/docs/KEY_MANAGEMENT.md +9 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/agentic_stealth_mcp.py +1 -1
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/playwright_mcp.py +1 -1
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/pyproject.toml +12 -12
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_attach_over_cdp.py +5 -0
- agentic_stealth_browser-2.6.0/agentic_stealth_browser.egg-info/requires.txt +0 -13
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/.env.example +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/CODE_OF_CONDUCT.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/CONTRIBUTING.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/LICENSE +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/MANIFEST.in +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/agentic_stealth_browser.egg-info/dependency_links.txt +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/agentic_stealth_browser.egg-info/entry_points.txt +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/agentic_stealth_browser.egg-info/top_level.txt +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/ai/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/ai/ai_hooks.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/assets/hn-demo.gif +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/audit/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/audit/logger.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/behavior/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/behavior/adaptive_tuner.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/behavior/human_behavior.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/behavior/orchestration.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/behavior/persona_rotator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/badge_gen.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/dashboard_gen.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/history.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/py.typed +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/readme_gen.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/runner.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/score.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/sites.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/templates/badge.svg.j2 +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/templates/dashboard.html.j2 +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/account_health.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/account_warming.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/connection_pool.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/error_messages.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/feature_flags.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/py.typed +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/session_checkpoint.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/core/types.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/ATTACH_OVER_CDP.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/README.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/agentic-stealth-browser-analysis-report.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/canary/README.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/canary/badge.svg +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/canary/history.jsonl +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/canary/index.html +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/canary.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/plans/2026-06-01-v2.4.0-attach-mode-hardening.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/plans/2026-06-03-v2.5.0-real-backend-adapters.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/plans/misc/GOAL_MODE_HERMES_BROWSER_DASHBOARD.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/plans/misc/HN_POST.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/plans/misc/OPEN_SOURCE_READINESS.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/docs/plans/misc/RELEASE_AUTONOMOUS_PLAN.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/examples/recipes/01_cloudflare_bypass.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/examples/recipes/02_linkedin_search.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/examples/recipes/03_amazon_product.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/examples/recipes/README.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/examples/recipes/linkedin.md +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/linkedin/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/linkedin/actions.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/mcp_security.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/plugins/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/plugins/template/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/plugins/template/plugin.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/Dockerfile +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/_jsonrpc_stdio.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/base.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/cdp_bridge.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/approval_gate.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/audit_enrichment.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/cli.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/dashboard_adapter_bridge.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/deprecations.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/docker-compose.yml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/docker-healthcheck.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/hermes_dashboard.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/mcp_input_validator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/mcp_server.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/mcp_session_isolation.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/metrics.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/otel_export.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/policy_engine.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/profiler.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/rate_limiter.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/sdk/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/sdk/client.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/workflow_orchestrator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/proxy/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/proxy/proxy_manager.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/recovery/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/recovery/anti_block_orchestrator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/recovery/detectors.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/recovery/explain_blocked.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scraping/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scraping/scraper.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/canary_run.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/evaluate_stealth.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/generate-demo-gif.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/health_check.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/hn-demo.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/make-gif.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/migrate_v1_to_v2.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/perf_benchmark.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/scripts/setup_rbb.sh +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/sessions/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/sessions/cookie_manager.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/sessions/session_manager.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/setup.cfg +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/advanced_stealth.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/cache.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/firefox_adapter.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/headers.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/presets.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/profiles.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/tls_fingerprint.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/stealth/tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/debug_nowsecure.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/detection_check.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/detection_runner.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/fingerprint_scorecard.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/run_detection_tests.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/stealth_harness/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/stealth_harness/collect.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/stealth_harness/test_stealth.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_account_health.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_account_warming.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_adapter_agentic_stealth_mcp.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_adapter_cdp_bridge.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_adapter_playwright_mcp.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_adaptive_tuner.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_backend_adapter_contract.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_basic.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_cdp_snapshots.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_connection_pool.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_contract_agent_browser.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_cookie_manager_unit.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_dashboard_protocol_bridge.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_detectors.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_differential.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_docker_config.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_e2e_anti_block_recovery.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_e2e_protected_sites_placeholder.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_golden_master.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_hermes_dashboard.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_human_behavior_fuzz.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_integration_modules.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_linkedin_actions.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_mcp_contract.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_mcp_server_runtime.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_mcp_stealth_workflows.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_mcp_url_safety.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_metrics_collector_unit.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_mutation_stealth.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_persona_rotator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_phase7_fixes.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_player.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_proxy_config_unit.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_proxy_manager.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_rate_limiter_unit.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_recorder.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_recovery.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_recovery_phase1.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_recovery_state_machine.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_rehearsal_validation.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_selector_auto_heal.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_session_checkpoint.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_stealth_cache.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_stealth_coverage.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_stealth_modules.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_stress_multi_account.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_tls_ja3_ja4.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_workflow_orchestrator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_workflow_schema.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_workflow_schema_unit.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_workflow_versioning.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/__init__.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/action_interpreter.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/auto-session-test.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/common/login.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/common/verify-email.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/linkedin/send-connection-request.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/meta-test.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/simple-test.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/teach-test/test-teach.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/upwork/add-portfolio-item.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/upwork/apply.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/upwork/edit-title.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/upwork/submit-proposal.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/library/upwork/update-rate.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/player.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/recorder.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/recovery.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/schema.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/selector_generator.py +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/test-echo.yaml +0 -0
- {agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/workflows/variable_resolver.py +0 -0
|
@@ -9,6 +9,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [2.7.0] — Enterprise Hardening (2026-07-18)
|
|
13
|
+
|
|
14
|
+
Auditability, supply-chain, and business-facing hardening from a full enterprise
|
|
15
|
+
audit. No breaking changes; no runtime behavior change on existing flows.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Acceptable Use Policy** (`ACCEPTABLE_USE.md`) + a `## Legal & Acceptable Use`
|
|
19
|
+
section in the README — authorized-use scope, prohibited uses (ToS/robots/CFAA/
|
|
20
|
+
GDPR-CCPA), operator responsibility, and rate-limit good-citizenship, for an
|
|
21
|
+
anti-bot tool that enterprise/legal review can pass through procurement.
|
|
22
|
+
- **Compliance docs** (`docs/`): `INCIDENT_RESPONSE.md` (credential/key-compromise
|
|
23
|
+
playbook, triage severities, post-incident), `KEY_MANAGEMENT.md` (secret
|
|
24
|
+
inventory + env sourcing + rotation), `DATA_HANDLING.md` (what is persisted,
|
|
25
|
+
data-controller statement, retention + deletion posture).
|
|
26
|
+
- **Navigation success/failure metrics** (`core/agent_browser.py`): `safe_goto`
|
|
27
|
+
now emits `requests_success` / `requests_failed` counters and calls
|
|
28
|
+
`metrics.record_error("navigation", …)` on failure, so `MetricsCollector`'s
|
|
29
|
+
`success_rate` reflects real traffic instead of being permanently 100%.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
- **Dependency lower bounds** (`pyproject.toml`): the seven previously-unpinned
|
|
33
|
+
runtime deps and the four dev deps now carry `>=` floors set to
|
|
34
|
+
CVE-safe/current releases (e.g. `aiohttp>=3.10.11`, `cryptography>=43.0.1`,
|
|
35
|
+
`jinja2>=3.1.5`), so a fresh install can no longer resolve a known-vulnerable
|
|
36
|
+
release. No upper caps — existing installs are unaffected.
|
|
37
|
+
- **README claims hedged** for an enterprise audience: the tagline and the
|
|
38
|
+
"zero-flag" line are now framed as a point-in-time canary snapshot, not a
|
|
39
|
+
guarantee.
|
|
40
|
+
- `pyproject.toml` version 2.6.0 → 2.7.0; MCP `clientInfo.version` handshake
|
|
41
|
+
strings in the two stdio adapters aligned to 2.7.0.
|
|
42
|
+
|
|
43
|
+
### Security
|
|
44
|
+
- **Release-metadata gate** (`.github/workflows/publish.yml`): the build job now
|
|
45
|
+
runs `twine check --strict dist/*` before upload, so malformed metadata can no
|
|
46
|
+
longer burn an immutable PyPI version.
|
|
47
|
+
- **SECURITY.md supported-versions table** corrected from a stale `0.8.x` to
|
|
48
|
+
`2.7.x` (`< 2.7` unsupported), with a note that the table is updated every
|
|
49
|
+
release.
|
|
50
|
+
|
|
51
|
+
### Testing
|
|
52
|
+
- The five live-Chromium attach tests in `tests/test_attach_over_cdp.py` are now
|
|
53
|
+
marked `@pytest.mark.e2e`, so the default (non-e2e) CI run no longer errors when
|
|
54
|
+
a browser is unavailable and the deterministic subset stays green.
|
|
55
|
+
|
|
12
56
|
## [2.6.0] — Stealth & MCP Hardening (2026-07-12)
|
|
13
57
|
|
|
14
58
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-stealth-browser
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.0
|
|
4
4
|
Summary: Production-grade, human-mimicking browser automation framework for autonomous agents. Survives modern anti-bot systems.
|
|
5
5
|
Author-email: Shane W <shanewas@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -23,23 +23,23 @@ Classifier: Framework :: AsyncIO
|
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
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
|
|
26
|
+
Requires-Dist: playwright>=1.45
|
|
27
|
+
Requires-Dist: aiohttp>=3.10.11
|
|
28
|
+
Requires-Dist: cryptography>=43.0.1
|
|
29
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
30
|
+
Requires-Dist: fastapi>=0.115.0
|
|
31
|
+
Requires-Dist: jinja2>=3.1.5
|
|
32
|
+
Requires-Dist: uvicorn>=0.32.0
|
|
33
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"
|
|
34
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
37
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
38
38
|
Dynamic: license-file
|
|
39
39
|
|
|
40
40
|
# Agentic Stealth Browser
|
|
41
41
|
|
|
42
|
-
**Playwright gets detected. This
|
|
42
|
+
**Playwright gets detected. This is much harder to detect.**
|
|
43
43
|
|
|
44
44
|
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
45
45
|
[](LICENSE)
|
|
@@ -51,6 +51,10 @@ Dynamic: license-file
|
|
|
51
51
|
<img src="assets/hn-demo.gif" alt="Agentic Stealth Browser Demo" width="90%">
|
|
52
52
|
</p>
|
|
53
53
|
|
|
54
|
+
## Legal & Acceptable Use
|
|
55
|
+
|
|
56
|
+
This is an anti-bot-evasion tool. Read the [Acceptable Use Policy](ACCEPTABLE_USE.md) before use — you are responsible for using it lawfully and within the target site's Terms of Service.
|
|
57
|
+
|
|
54
58
|
## What is this
|
|
55
59
|
|
|
56
60
|
A production-grade stealth browser automation library for Python, built on Playwright.
|
|
@@ -95,7 +99,8 @@ Sites don't just check your User-Agent anymore. They check *everything*:
|
|
|
95
99
|
| **Account warming** | Nothing | 14-day graduated ramp-up per account |
|
|
96
100
|
|
|
97
101
|
Result: **passes bot.sannysoft.com, pixelscan.net, and CreepJS** with zero flags in
|
|
98
|
-
headless mode (detection canaries run every 4 hours
|
|
102
|
+
headless mode as of the latest 4-hourly canary run (detection canaries run every 4 hours
|
|
103
|
+
via `docs/canary.md`).
|
|
99
104
|
|
|
100
105
|
---
|
|
101
106
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agentic Stealth Browser
|
|
2
2
|
|
|
3
|
-
**Playwright gets detected. This
|
|
3
|
+
**Playwright gets detected. This is much harder to detect.**
|
|
4
4
|
|
|
5
5
|
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
6
6
|
[](LICENSE)
|
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
<img src="assets/hn-demo.gif" alt="Agentic Stealth Browser Demo" width="90%">
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
+
## Legal & Acceptable Use
|
|
16
|
+
|
|
17
|
+
This is an anti-bot-evasion tool. Read the [Acceptable Use Policy](ACCEPTABLE_USE.md) before use — you are responsible for using it lawfully and within the target site's Terms of Service.
|
|
18
|
+
|
|
15
19
|
## What is this
|
|
16
20
|
|
|
17
21
|
A production-grade stealth browser automation library for Python, built on Playwright.
|
|
@@ -56,7 +60,8 @@ Sites don't just check your User-Agent anymore. They check *everything*:
|
|
|
56
60
|
| **Account warming** | Nothing | 14-day graduated ramp-up per account |
|
|
57
61
|
|
|
58
62
|
Result: **passes bot.sannysoft.com, pixelscan.net, and CreepJS** with zero flags in
|
|
59
|
-
headless mode (detection canaries run every 4 hours
|
|
63
|
+
headless mode as of the latest 4-hourly canary run (detection canaries run every 4 hours
|
|
64
|
+
via `docs/canary.md`).
|
|
60
65
|
|
|
61
66
|
---
|
|
62
67
|
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
| Version | Supported |
|
|
6
6
|
| ------- | ------------------ |
|
|
7
|
-
|
|
|
8
|
-
| <
|
|
7
|
+
| 2.7.x | :white_check_mark: |
|
|
8
|
+
| < 2.7 | :x: |
|
|
9
|
+
|
|
10
|
+
This table is updated as part of every release; a release is not complete until the current minor version appears here.
|
|
9
11
|
|
|
10
12
|
## Reporting a Vulnerability
|
|
11
13
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentic-stealth-browser
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.0
|
|
4
4
|
Summary: Production-grade, human-mimicking browser automation framework for autonomous agents. Survives modern anti-bot systems.
|
|
5
5
|
Author-email: Shane W <shanewas@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -23,23 +23,23 @@ Classifier: Framework :: AsyncIO
|
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
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
|
|
26
|
+
Requires-Dist: playwright>=1.45
|
|
27
|
+
Requires-Dist: aiohttp>=3.10.11
|
|
28
|
+
Requires-Dist: cryptography>=43.0.1
|
|
29
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
30
|
+
Requires-Dist: fastapi>=0.115.0
|
|
31
|
+
Requires-Dist: jinja2>=3.1.5
|
|
32
|
+
Requires-Dist: uvicorn>=0.32.0
|
|
33
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"
|
|
34
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
35
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
37
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
38
38
|
Dynamic: license-file
|
|
39
39
|
|
|
40
40
|
# Agentic Stealth Browser
|
|
41
41
|
|
|
42
|
-
**Playwright gets detected. This
|
|
42
|
+
**Playwright gets detected. This is much harder to detect.**
|
|
43
43
|
|
|
44
44
|
[](https://github.com/shanewas/agentic-stealth-browser/actions/workflows/ci.yml)
|
|
45
45
|
[](LICENSE)
|
|
@@ -51,6 +51,10 @@ Dynamic: license-file
|
|
|
51
51
|
<img src="assets/hn-demo.gif" alt="Agentic Stealth Browser Demo" width="90%">
|
|
52
52
|
</p>
|
|
53
53
|
|
|
54
|
+
## Legal & Acceptable Use
|
|
55
|
+
|
|
56
|
+
This is an anti-bot-evasion tool. Read the [Acceptable Use Policy](ACCEPTABLE_USE.md) before use — you are responsible for using it lawfully and within the target site's Terms of Service.
|
|
57
|
+
|
|
54
58
|
## What is this
|
|
55
59
|
|
|
56
60
|
A production-grade stealth browser automation library for Python, built on Playwright.
|
|
@@ -95,7 +99,8 @@ Sites don't just check your User-Agent anymore. They check *everything*:
|
|
|
95
99
|
| **Account warming** | Nothing | 14-day graduated ramp-up per account |
|
|
96
100
|
|
|
97
101
|
Result: **passes bot.sannysoft.com, pixelscan.net, and CreepJS** with zero flags in
|
|
98
|
-
headless mode (detection canaries run every 4 hours
|
|
102
|
+
headless mode as of the latest 4-hourly canary run (detection canaries run every 4 hours
|
|
103
|
+
via `docs/canary.md`).
|
|
99
104
|
|
|
100
105
|
---
|
|
101
106
|
|
|
@@ -1272,6 +1272,7 @@ class AgentBrowser:
|
|
|
1272
1272
|
self.account_warming.record_page_visit(url)
|
|
1273
1273
|
self.connection_pool.release_context(domain)
|
|
1274
1274
|
self.adaptive_tuner.record_feedback(blocked=False, platform=platform)
|
|
1275
|
+
self.metrics.increment("requests_success")
|
|
1275
1276
|
return True
|
|
1276
1277
|
except Exception as e:
|
|
1277
1278
|
# P3: Record failure to all tracking systems
|
|
@@ -1284,6 +1285,8 @@ class AgentBrowser:
|
|
|
1284
1285
|
self.logger.log_error(
|
|
1285
1286
|
"safe_goto_failed", str(e), {"url": url, "platform": platform}
|
|
1286
1287
|
)
|
|
1288
|
+
self.metrics.increment("requests_failed")
|
|
1289
|
+
self.metrics.record_error("navigation", str(e))
|
|
1287
1290
|
return False
|
|
1288
1291
|
|
|
1289
1292
|
async def load_cookies(self, cookies_path: str):
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Data Handling & Retention
|
|
2
|
+
|
|
3
|
+
## What the tool persists
|
|
4
|
+
|
|
5
|
+
- Scraped results (wherever the operator's workflow writes them)
|
|
6
|
+
- Cookies under `sessions/`
|
|
7
|
+
- Screenshots under `checkpoints/`
|
|
8
|
+
|
|
9
|
+
## Data controller
|
|
10
|
+
|
|
11
|
+
The operator running this tool is the data controller for any data it collects or persists. The maintainers are not.
|
|
12
|
+
|
|
13
|
+
## Retention recommendation
|
|
14
|
+
|
|
15
|
+
By default, retain persisted files no longer than necessary for the operator's task — 30 days is a reasonable starting point unless the operator's own policy or applicable law requires otherwise.
|
|
16
|
+
|
|
17
|
+
## Deletion
|
|
18
|
+
|
|
19
|
+
Deletion is the operator's responsibility. Documented deletion means removing the relevant files under `sessions/` and `checkpoints/`.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Security Incident Response
|
|
2
|
+
|
|
3
|
+
## Reporting
|
|
4
|
+
|
|
5
|
+
See [SECURITY.md](../SECURITY.md) for how to report a vulnerability.
|
|
6
|
+
|
|
7
|
+
## Credential / Key Compromise
|
|
8
|
+
|
|
9
|
+
1. Rotate the leaked secret.
|
|
10
|
+
2. Invalidate live dashboard sessions by rotating `DashboardSettings.secret_key`.
|
|
11
|
+
3. Delete affected session cookie files under `sessions/`.
|
|
12
|
+
4. Force re-login for all operators.
|
|
13
|
+
|
|
14
|
+
## Triage Severity
|
|
15
|
+
|
|
16
|
+
- **SEV1** — key/credential leak
|
|
17
|
+
- **SEV2** — data exposure
|
|
18
|
+
- **SEV3** — availability
|
|
19
|
+
|
|
20
|
+
## Post-Incident
|
|
21
|
+
|
|
22
|
+
Record the incident in the CHANGELOG Security section.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Key Management
|
|
2
|
+
|
|
3
|
+
| Secret | Source | Rotation procedure |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| Cookie encryption key | env var | Generate a new key, re-encrypt or discard existing session cookie files under `sessions/`, force re-login. |
|
|
6
|
+
| Dashboard `secret_key` (`DashboardSettings.secret_key`) | env var | Set a new value, restart the dashboard process — this invalidates all live dashboard sessions. |
|
|
7
|
+
| HMAC / audit keys | env var | Generate a new key, redeploy, allow a short overlap window if signed artifacts must remain verifiable during rotation. |
|
|
8
|
+
|
|
9
|
+
Keys must come from environment variables and must never be committed to the repository. Rotation should be performed immediately on suspected compromise (see [docs/INCIDENT_RESPONSE.md](INCIDENT_RESPONSE.md)) and periodically as routine hygiene.
|
|
@@ -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.7.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"
|
|
@@ -26,21 +26,21 @@ classifiers = [
|
|
|
26
26
|
"Framework :: AsyncIO",
|
|
27
27
|
]
|
|
28
28
|
dependencies = [
|
|
29
|
-
"playwright",
|
|
30
|
-
"aiohttp",
|
|
31
|
-
"cryptography",
|
|
32
|
-
"pyyaml",
|
|
33
|
-
"fastapi",
|
|
34
|
-
"jinja2",
|
|
35
|
-
"uvicorn",
|
|
29
|
+
"playwright>=1.45",
|
|
30
|
+
"aiohttp>=3.10.11",
|
|
31
|
+
"cryptography>=43.0.1",
|
|
32
|
+
"pyyaml>=6.0.2",
|
|
33
|
+
"fastapi>=0.115.0",
|
|
34
|
+
"jinja2>=3.1.5",
|
|
35
|
+
"uvicorn>=0.32.0",
|
|
36
36
|
]
|
|
37
37
|
|
|
38
38
|
[project.optional-dependencies]
|
|
39
39
|
dev = [
|
|
40
|
-
"pytest",
|
|
41
|
-
"pytest-asyncio",
|
|
42
|
-
"pytest-cov",
|
|
43
|
-
"httpx",
|
|
40
|
+
"pytest>=8.0",
|
|
41
|
+
"pytest-asyncio>=0.23",
|
|
42
|
+
"pytest-cov>=5.0",
|
|
43
|
+
"httpx>=0.27",
|
|
44
44
|
]
|
|
45
45
|
|
|
46
46
|
[project.scripts]
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/tests/test_attach_over_cdp.py
RENAMED
|
@@ -251,6 +251,7 @@ async def remote_chromium(tmp_path):
|
|
|
251
251
|
await _kill_if_alive()
|
|
252
252
|
|
|
253
253
|
|
|
254
|
+
@pytest.mark.e2e
|
|
254
255
|
async def test_attach_over_cdp_live_new_context(remote_chromium):
|
|
255
256
|
port, proc = remote_chromium
|
|
256
257
|
ab = AgentBrowser(session_name="t-attach", anonymous=True, ephemeral=True)
|
|
@@ -284,6 +285,7 @@ async def test_attach_over_cdp_live_new_context(remote_chromium):
|
|
|
284
285
|
assert proc.returncode is None
|
|
285
286
|
|
|
286
287
|
|
|
288
|
+
@pytest.mark.e2e
|
|
287
289
|
async def test_attach_over_cdp_reports_stealth_install_failure(
|
|
288
290
|
remote_chromium, monkeypatch
|
|
289
291
|
):
|
|
@@ -321,6 +323,7 @@ async def test_attach_over_cdp_reports_stealth_install_failure(
|
|
|
321
323
|
assert proc.returncode is None
|
|
322
324
|
|
|
323
325
|
|
|
326
|
+
@pytest.mark.e2e
|
|
324
327
|
async def test_attach_over_cdp_stealth_not_requested(remote_chromium):
|
|
325
328
|
"""When apply_stealth=False, stealth_applied is False but no error is set."""
|
|
326
329
|
port, proc = remote_chromium
|
|
@@ -358,6 +361,7 @@ async def test_teardown_mode_init_is_none():
|
|
|
358
361
|
assert ab._teardown_mode is None
|
|
359
362
|
|
|
360
363
|
|
|
364
|
+
@pytest.mark.e2e
|
|
361
365
|
async def test_teardown_mode_set_to_attached_owned(remote_chromium):
|
|
362
366
|
"""attach_over_cdp(new_context=True) sets ATTACHED_OWNED_CTX."""
|
|
363
367
|
from core.agent_browser import TeardownMode
|
|
@@ -371,6 +375,7 @@ async def test_teardown_mode_set_to_attached_owned(remote_chromium):
|
|
|
371
375
|
assert proc.returncode is None
|
|
372
376
|
|
|
373
377
|
|
|
378
|
+
@pytest.mark.e2e
|
|
374
379
|
async def test_teardown_mode_set_to_attached_adopted(remote_chromium):
|
|
375
380
|
"""attach_over_cdp(adopt existing) sets ATTACHED_ADOPTED_CTX."""
|
|
376
381
|
from core.agent_browser import TeardownMode
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/templates/badge.svg.j2
RENAMED
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/canary/templates/dashboard.html.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/examples/recipes/linkedin.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/plugins/template/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/adapters/cdp_bridge.py
RENAMED
|
File without changes
|
|
File without changes
|
{agentic_stealth_browser-2.6.0 → agentic_stealth_browser-2.7.0}/production/audit_enrichment.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|