superbrowser-sdk 2.3.0__tar.gz → 2.4.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.
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/CHANGELOG.md +84 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/PKG-INFO +1 -1
- superbrowser_sdk-2.4.0/docs/mcp.md +291 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/pyproject.toml +1 -1
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/__init__.py +1 -1
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/mcp_server.py +504 -98
- superbrowser_sdk-2.4.0/tests/test_mcp_entrypoint.py +45 -0
- superbrowser_sdk-2.4.0/tests/test_mcp_navigation.py +1072 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_permissions.py +11 -6
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_server.py +30 -21
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_server_smoke.py +41 -22
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_write_tools.py +6 -4
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_write_tools_wave2.py +2 -1
- superbrowser_sdk-2.3.0/docs/mcp.md +0 -190
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.env.example +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/adversarial-v3.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/adversarial.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/benchmark.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/dco.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/e2e.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/publish.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/smoke.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/stress.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/test.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.gitignore +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.pre-commit-config.yaml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/CONTRIBUTING.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/Dockerfile +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/LICENSE +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/README.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/Super-Browser.png +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/behavioral.html +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/dom-heavy.html +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/form.html +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/simple.html +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docker-compose.yml +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/agent-reliability.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/anti-detection-ejecta.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/api-ergonomics-audit.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/api-reference.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/api-stability.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/architecture.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/behavioral-synthesis.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/browser-networking.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/cloak-integration.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/consistency-engine.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/error-catalog.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/fingerprint-scoring.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/fingerprint-validation.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/gap-analysis.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/human-behavior.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/memory.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/migration/v1-to-v2.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/migration/v1.8-to-v1.9.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/operating-doctrine.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/platform-abstraction.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/plugins.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/quickstart.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/recording.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/README.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-decomposition.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/stealth-coverage.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/stealth-evidence.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/backend_selection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/basic_usage.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/budget_tracking.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/cloak_stealth.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/error_handling.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/fingerprint_scan.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/human_behavior.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/multi_tab_workflow.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/session_persistence.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/stealth_mode.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/adversarial_run.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/agent_efficiency_benchmark.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/browser_benchmark.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/e2e_trend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/run_stealth_gauntlet.sh +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/smoke_published.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/stress_real_world.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/validate_e2e_report.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/verify_release_artifact.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/__main__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/debug.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/delegator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/facade.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/factory.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/openai_client.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/protocol.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/loop.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/loop_detector.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/plugins.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/registry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/router.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/structured_logging.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/bezier.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/dwell.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/fitts.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/gauss.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/keyboard.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/mouse.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/navigation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/orchestrator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/prng.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/qwerty.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/scroll.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/session_seed.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/cdp.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/cloak_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/cloud.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/discovery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/engine.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/fetch.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/page.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/session.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/shutdown.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/tabs.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/cascade.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/client.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/compressor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/cost_estimator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/credential_pool.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/governor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/commands.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/interactive.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/script.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/events/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/events/bus.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/events/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/cache.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/controller.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/decorator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/presets.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/recovery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/snapshot.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/vision.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/store.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/plugins/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/plugins/decorators.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/plugins/hooks.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/py.typed +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/persistence.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/recorder.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/replayer.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/report.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/checkpoint.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/classifier.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/coordinator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/event_bus.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/format_validator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/reflection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/retry_tracker.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/session_recovery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/watchdogs.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/output.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/typed.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/validation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/action_redaction.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/approval.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/credential_vault.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/domain_filter.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/gate.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/injection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/manager.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/policy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/redactor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/session/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/session/proxy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/activation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/markdown.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/registry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/action_policy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/captcha.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/cache.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/pow.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/dag.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/derive.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/errors.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/inject.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/prng.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rule.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/diagnostics.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/headers.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/human.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/human_config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ip_reputation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/manager.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/schema.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/proxy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/proxy_pool.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/report.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/scoring.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/tls_baselines.json +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/checks.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/harness.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/report.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/suite.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/testing.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/cost_analytics.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/flow_logger.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/middleware.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/session_db.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/sinks.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/ax_diff.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/hasher.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/verifier.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/cache.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/controller.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/coords.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/factory.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/ocr.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/providers.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/stress/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/stress/server.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/controlled_server.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/report.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/scoring.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/targets.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_controlled_server.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_targets_unit.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_tier1_scanners.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_tier2_vendors.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_tier3_controlled.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/README.md +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/backends.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/core.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/engines/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/engines/scoring.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/harness.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/history.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/server.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/automation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/behavioral.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/controlled.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/ejector.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/external.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/network.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/pytest.ini +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/run.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_backends.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_behavioral_telemetry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_behavioral_vectors.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_core.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_external.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_harness_smoke.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_header_ordering.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_reporters.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_scoring.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_server.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_superbrowser_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_vectors.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_01_example_nav.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_02_google_search.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_03_github_login.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_05_google_forms.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_06_google_flights.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_09_form_complex.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_behavioral_realism.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_challenge_detection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_interaction.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_live_navigation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_multi_tab.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_navigation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_stealth_overhead.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e_v1_3_journey.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_config_composition.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_engine_backends.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_error_paths.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_facade_smoke.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_full_lifecycle.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_multi_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_performance_smoke.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_playwright_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_public_api.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_stealth_abstraction.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v1100_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v150_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v160_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v170_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v180_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v190_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v191_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v192_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v193_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v194_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v195_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v1_3_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v1_4_features.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/pattern_validation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/conftest.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_cli_switches.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_live_sites.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_webdriver.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_action_timeout.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_browser_transport.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_controller_rebinding.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_debug_mode.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_default_tooling.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_delegator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_error_screenshots.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_control.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_network.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_session.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_fail_fast.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm_budget.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm_production.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm_streaming.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_loop.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_loop_detector.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_prompt_isolation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_registry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_retry_budget.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_streaming.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_structured_logging.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_tab_cap.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_task_02.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_behavioral.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_dwell.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_hardening.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_navigation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_orchestrator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_session_seed.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmark/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmark/test_efficiency.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmarks/test_stress_real_world.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cdp.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cdp_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cloak_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cloak_docs.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cloak_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_discovery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_engine_protocol.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_fetch.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_injectors.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_page.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_patchright_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_playwright_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_selenium_backend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_session.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_shutdown.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_cascade.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_cascade_governor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_circuit_breaker.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_client.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_compressor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_cost_estimator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_credential_pool.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_governor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_interactive.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_script.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_stealth_check.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_stealth_validate.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_unified_cli.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_e2e/test_report_schema.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_e2e/test_trend.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_audio.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_browser_apis.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_canvas.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_timing.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_webrtc.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_events/test_event_bus.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_governance_docs.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_cache.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_controller.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_decorator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_injection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_page_change.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_presets.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_recovery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_snapshot.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_vision.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/test_cli_config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/test_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/test_store.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/test_persistence.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/test_recorder.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/test_replayer.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_checkpoint.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_classifier.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_coordinator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_event_bus.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_format_validator.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_reflection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_retry_tracker.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_session_recovery.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_watchdogs.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_release/test_naming_consistency.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_release/test_smoke_published.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_release/test_verify_artifact.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_batch40_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_categories.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_output.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_typed.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_validation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_runtime_correctness/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_runtime_correctness/test_runtime_fixes.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_approval.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_credential_vault.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_domain_filter.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_injection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_manager.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_policy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_redaction_pipeline.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_redactor.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_session/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_session/test_locale.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_session/test_proxy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_activation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_integration.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_markdown.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_registry.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_action_policy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_captcha.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_challenge_cache.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_challenge_config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_consistency_inject.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_diagnostics.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_headers.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_human.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_ip_reputation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_kasada_detection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_manager.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_profiles.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_proxy.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_proxy_pool.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_validation.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_cost_analytics.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_flow_logger.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_middleware.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_session_db.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_sinks.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_ax_diff.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_hasher.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_types.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_verifier.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/__init__.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_cache.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_controller.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_coords.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_factory.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_ocr.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_providers.py +0 -0
- {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_types.py +0 -0
|
@@ -5,6 +5,90 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.4.0] — 2026-06-23
|
|
9
|
+
|
|
10
|
+
### Added — MCP Server P1: Navigation Workflows
|
|
11
|
+
|
|
12
|
+
The default MCP server can now read a URL end-to-end (`navigate → wait_for →
|
|
13
|
+
observe/extract_text/screenshot`) without action mode. The tool surface was
|
|
14
|
+
re-partitioned into a **four-tier model**:
|
|
15
|
+
|
|
16
|
+
- **Inspect tier** (always advertised): `browser_status`, `current_url`,
|
|
17
|
+
`observe`, `extract_text`, `screenshot`, `list_tabs`.
|
|
18
|
+
- **Navigation tier** (always advertised): `navigate`, `wait_for` (new).
|
|
19
|
+
Navigation mutates browser state (page acquisition) but is default-allowed
|
|
20
|
+
because reading requires a page to read. It is `SecurityManager`-checked and
|
|
21
|
+
audited (both approvals and denials) in the default stdio / `build_server()`
|
|
22
|
+
path, but it does **not** consume the action budget. Bare
|
|
23
|
+
`ToolDispatcher(runtime)` integrations may navigate without an attached
|
|
24
|
+
authorizer; in that case no audit/security check is performed.
|
|
25
|
+
- **Action tier** (requires `--allow-actions` / `SB_MCP_ALLOW_ACTIONS=1`):
|
|
26
|
+
`scroll`, `press_key`, `click`, `fill`, `open_tab`, `close_tab`.
|
|
27
|
+
- **High-risk tier** (not implemented): `download`, `upload`, `act`, arbitrary JS.
|
|
28
|
+
|
|
29
|
+
New APIs:
|
|
30
|
+
|
|
31
|
+
- `wait_for` tool: wait for exactly one page condition (`selector` / `text` /
|
|
32
|
+
`url` / `load_state`) with `timeout_ms` (100–60000, default 10000).
|
|
33
|
+
- `MCPSessionPolicy.allow_actions` (primary) with `allow_writes` retained as a
|
|
34
|
+
backward-compatibility alias.
|
|
35
|
+
- `MCPAuthorizer.record_audit()` — public audit helper for navigation-tier
|
|
36
|
+
entries; returns the `MCPAuthorizationResult` it constructed.
|
|
37
|
+
- `--allow-actions` CLI flag and `SB_MCP_ALLOW_ACTIONS` env var
|
|
38
|
+
(truthy sentinels: `1`, `true`, `yes`, `on`).
|
|
39
|
+
- `SB_MCP_DOMAIN_ALLOWLIST` / `SB_MCP_DOMAIN_BLOCKLIST` env vars for opt-in
|
|
40
|
+
domain filtering on the default stdio server (comma- or whitespace-separated;
|
|
41
|
+
glob patterns supported).
|
|
42
|
+
- `run_server()` now constructs a default `SecurityManager` so navigation is
|
|
43
|
+
security-checked in the default stdio path; callers may pass
|
|
44
|
+
`security_manager=` to override (or `None` to disable).
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- **Default advertised tool count: 6 → 8** (adds `navigate` and `wait_for`).
|
|
49
|
+
- `navigate` moved from the action-gated write tier to the default-allowed
|
|
50
|
+
navigation tier.
|
|
51
|
+
- Action-gate refusal message changed from `"writes are disabled"` to
|
|
52
|
+
`"actions are disabled"` (the gate protects the Action tier).
|
|
53
|
+
- `_tools_for_policy()` now advertises `DEFAULT_TOOLS` (inspect + navigation)
|
|
54
|
+
by default and adds `ACTION_TOOLS` when `allow_actions` is set.
|
|
55
|
+
- `main()` now uses `argparse` (previously raw `sys.argv` substring matching).
|
|
56
|
+
|
|
57
|
+
### Compatibility notes
|
|
58
|
+
|
|
59
|
+
- The action-gate refusal `reason` changed from `"writes are disabled"` to
|
|
60
|
+
`"actions are disabled"`. Clients/docs pattern-matching the old string should
|
|
61
|
+
update. (`MCPSessionPolicy(allow_writes=True)` callers are otherwise
|
|
62
|
+
unaffected — the flag still enables action tools via the compat alias.)
|
|
63
|
+
- The default stdio server now advertises 8 tools, not 6. Clients asserting on
|
|
64
|
+
the advertised count should update.
|
|
65
|
+
|
|
66
|
+
### Fixed
|
|
67
|
+
|
|
68
|
+
- Fixed default navigation dispatch so bare `ToolDispatcher(runtime)`
|
|
69
|
+
integrations can use `navigate` without requiring an authorizer; security
|
|
70
|
+
checks and audit still run when an authorizer/security manager is attached,
|
|
71
|
+
including the default stdio server path.
|
|
72
|
+
|
|
73
|
+
### Internal
|
|
74
|
+
|
|
75
|
+
- Tier constants: `INSPECT_TOOLS` / `NAVIGATION_TOOLS` / `ACTION_TOOLS` /
|
|
76
|
+
`DEFAULT_TOOLS` and their `_NAME` frozensets. (`PHASE1_TOOLS`,
|
|
77
|
+
`PHASE2B_TOOLS`, `PHASE2B_WAVE2_TOOLS`, and `WRITE_TOOL_NAMES` retained as
|
|
78
|
+
aliases for backward-compat imports.)
|
|
79
|
+
- `_validate_write_args` split into `_validate_navigation_args` and
|
|
80
|
+
`_validate_action_args`; the old name remains as a routing alias.
|
|
81
|
+
- `wait_for` reaches the raw Patchright/Playwright page via
|
|
82
|
+
`sb._page.backend_page` (one hop); the deprecated `.raw_page` accessor is
|
|
83
|
+
not used.
|
|
84
|
+
|
|
85
|
+
## [2.3.1] — 2026-06-22
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
|
|
89
|
+
- Fixed `superbrowser-mcp` / `python -m super_browser.mcp_server` startup crash caused by `logging.Stderr` (which does not exist in Python's stdlib); the MCP server entry point now configures logging with `sys.stderr`.
|
|
90
|
+
- Added entry-point bootstrap coverage so the MCP console-script path is exercised directly.
|
|
91
|
+
|
|
8
92
|
## [2.3.0] — 2026-06-22
|
|
9
93
|
|
|
10
94
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superbrowser-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade
|
|
5
5
|
Project-URL: Homepage, https://github.com/Octo-Lex/Super-Browser
|
|
6
6
|
Project-URL: Documentation, https://github.com/Octo-Lex/Super-Browser#readme
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Super Browser MCP Server
|
|
2
|
+
|
|
3
|
+
Super Browser exposes its browser inspection and control surface over the
|
|
4
|
+
[Model Context Protocol](https://modelcontextprotocol.io) so that AI coding
|
|
5
|
+
agents (Claude, Cursor, etc.) can observe and interact with a page without
|
|
6
|
+
scripting Python.
|
|
7
|
+
|
|
8
|
+
The stdio server advertises **eight tools by default** (six inspect + two
|
|
9
|
+
navigation) — enough to read a URL end-to-end. When action mode is enabled,
|
|
10
|
+
it advertises **six additional action tools**; every action call is checked by
|
|
11
|
+
`MCPSessionPolicy` and `SecurityManager` before it can reach the browser.
|
|
12
|
+
|
|
13
|
+
See [RFC #178](https://github.com/Octo-Lex/Super-Browser/issues/178) for the
|
|
14
|
+
design history.
|
|
15
|
+
|
|
16
|
+
> `screenshot` captures the rendered page contents as the browser sees them. There is no automatic redaction; callers decide when to invoke it.
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install 'superbrowser-sdk[mcp,patchright]'
|
|
22
|
+
python -m patchright install chromium
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`[mcp]` pulls the lightweight `mcp` SDK (no browser deps of its own).
|
|
26
|
+
`[patchright]` provides the browser backend the server drives.
|
|
27
|
+
|
|
28
|
+
## Run
|
|
29
|
+
|
|
30
|
+
Either of:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
superbrowser-mcp # default: 8 tools (inspect + navigation)
|
|
34
|
+
superbrowser-mcp --allow-actions # 14 tools (adds the action tier)
|
|
35
|
+
python -m super_browser.mcp_server
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Both start a **stdio** server. The default server advertises 8 tools and
|
|
39
|
+
recognizes (but refuses) action-tool calls with a structured policy refusal.
|
|
40
|
+
|
|
41
|
+
Action mode can also be enabled via the environment:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
SB_MCP_ALLOW_ACTIONS=1 superstl-browser-mcp
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Accepted truthy values: `1`, `true`, `yes`, `on` (case-insensitive).
|
|
48
|
+
|
|
49
|
+
## Client configuration
|
|
50
|
+
|
|
51
|
+
### Claude Desktop / Claude Code
|
|
52
|
+
|
|
53
|
+
Add to your MCP config (`claude_desktop_config.json` or the equivalent):
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"mcpServers": {
|
|
58
|
+
"super-browser": {
|
|
59
|
+
"command": "superbrowser-mcp"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Or, if you prefer the module form:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"super-browser": {
|
|
71
|
+
"command": "python",
|
|
72
|
+
"args": ["-m", "super_browser.mcp_server"]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
To enable action tools:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"super-browser": {
|
|
84
|
+
"command": "superbrowser-mcp",
|
|
85
|
+
"args": ["--allow-actions"]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Cursor
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"mcpServers": {
|
|
96
|
+
"super-browser": {
|
|
97
|
+
"command": "superbrowser-mcp"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Tools
|
|
104
|
+
|
|
105
|
+
All tools return structured JSON (`{"ok": bool, ...}`) as `TextContent`. The
|
|
106
|
+
screenshot tool additionally returns an `ImageContent` block.
|
|
107
|
+
|
|
108
|
+
The tool surface is partitioned into four tiers. The first two are always
|
|
109
|
+
advertised; the third requires action mode; the fourth is not implemented.
|
|
110
|
+
|
|
111
|
+
### Inspect tier (always advertised)
|
|
112
|
+
|
|
113
|
+
| Tool | Args | Behavior | Lazy-starts browser? |
|
|
114
|
+
|---|---|---|---|
|
|
115
|
+
| `browser_status` | none | Runtime status (running, backend). | No |
|
|
116
|
+
| `current_url` | none | Current URL, or a structured "not started" state. | No |
|
|
117
|
+
| `observe` | none | Page state: URL, title, interactive/total element counts. | Yes |
|
|
118
|
+
| `extract_text` | `query` (required), `selector` (optional) | Text content, optionally scoped to a CSS selector. | Yes |
|
|
119
|
+
| `screenshot` | `full_page` (optional, default `false`) | Base64 PNG of the viewport or full page. | Yes |
|
|
120
|
+
| `list_tabs` | none | Snapshot of open tabs. | Yes |
|
|
121
|
+
|
|
122
|
+
### Navigation tier (always advertised)
|
|
123
|
+
|
|
124
|
+
Navigation mutates browser state (page acquisition) but is default-allowed
|
|
125
|
+
because reading requires a page to read. It is always checked by the
|
|
126
|
+
`SecurityManager` and is audited, but it does **not** consume the action
|
|
127
|
+
budget and does **not** require action mode.
|
|
128
|
+
|
|
129
|
+
| Tool | Args | Behavior |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `navigate` | `url` (required), `wait_until` (optional) | Go to a URL. URL is passed to `SecurityManager` for injection detection, secret redaction, and domain allow/block enforcement. |
|
|
132
|
+
| `wait_for` | exactly one of `selector` / `text` / `url` / `load_state`; `timeout_ms` (optional, 100–60000, default 10000) | Wait for a page condition before the next read. |
|
|
133
|
+
|
|
134
|
+
`wait_for` accepts exactly one condition per call (deterministic single
|
|
135
|
+
results; compound waits can be added later as an explicit AND mode).
|
|
136
|
+
|
|
137
|
+
#### Read workflow
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
navigate → wait_for → observe / extract_text / screenshot
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
This is the default-mode loop an agent uses to read a page.
|
|
144
|
+
|
|
145
|
+
### Action tier (advertised when action mode is enabled)
|
|
146
|
+
|
|
147
|
+
| Tool | Args | Security level |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| `scroll` | `direction` (optional), `amount` (optional) | SENSITIVE |
|
|
150
|
+
| `press_key` | `key` (required) | SENSITIVE |
|
|
151
|
+
| `click` | `target` (required), `description` (optional) | SENSITIVE |
|
|
152
|
+
| `fill` | `target` (required), `value` (required), `clear_first` (optional), `description` (optional) | SENSITIVE |
|
|
153
|
+
| `open_tab` | `url` (optional) | SENSITIVE — URL passed to `SecurityManager` when provided |
|
|
154
|
+
| `close_tab` | `tab_id` (required) | SENSITIVE |
|
|
155
|
+
|
|
156
|
+
`fill` sends only the literal value supplied by the caller. It does not
|
|
157
|
+
retrieve, infer, store, or auto-fill credentials.
|
|
158
|
+
|
|
159
|
+
#### Action workflow
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
superbrowser-mcp --allow-actions
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Action calls pass through the full authorization path (action gate →
|
|
166
|
+
action-count budget → timeout budget → `SecurityManager` → audit) before
|
|
167
|
+
reaching the browser.
|
|
168
|
+
|
|
169
|
+
### High-risk tier (not implemented)
|
|
170
|
+
|
|
171
|
+
`download`, `upload`, `act` (the LLM agent loop), and arbitrary JS execution
|
|
172
|
+
are not implemented. They will return a structured "Unknown tool" error and
|
|
173
|
+
will require a separate design pass before implementation.
|
|
174
|
+
|
|
175
|
+
## Domain filtering
|
|
176
|
+
|
|
177
|
+
Navigation is always security-checked, but domain allow/block enforcement is
|
|
178
|
+
**opt-in** via environment variables. With neither set, the domain filter is
|
|
179
|
+
allow-all (injection detection and secret redaction still run).
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Block specific hosts (comma- or whitespace-separated; glob patterns allowed)
|
|
183
|
+
SB_MCP_DOMAIN_BLOCKLIST="evil.com, *.test" superstl-browser-mcp
|
|
184
|
+
|
|
185
|
+
# Restrict to an allowlist (anything not matching is denied)
|
|
186
|
+
SB_MCP_DOMAIN_ALLOWLIST="example.com, docs.example.com" superstl-browser-mcp
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
When both are set, the blocklist is evaluated first; the allowlist then
|
|
190
|
+
restricts the survivors.
|
|
191
|
+
|
|
192
|
+
## Four-tier tool model
|
|
193
|
+
|
|
194
|
+
The default server behavior partitions the surface by risk:
|
|
195
|
+
|
|
196
|
+
- **`list_tools()`** advertises only the Inspect + Navigation tiers (8 tools).
|
|
197
|
+
- **`call_tool()`** still recognizes action-tool names and returns a structured
|
|
198
|
+
policy refusal (`refusal.reason = "actions are disabled"`), not an "Unknown
|
|
199
|
+
tool" error.
|
|
200
|
+
|
|
201
|
+
This means clients don't see action tools by default, but manual or
|
|
202
|
+
unadvertised action calls are handled cleanly rather than misclassified.
|
|
203
|
+
|
|
204
|
+
### Permission model (action tools)
|
|
205
|
+
|
|
206
|
+
Every action-tier call passes through a central authorization path before
|
|
207
|
+
reaching the browser:
|
|
208
|
+
|
|
209
|
+
1. **Action-enabled check** — `MCPSessionPolicy.allow_actions` must be `True`
|
|
210
|
+
2. **Action-count check** — `actions_used` must not exceed `max_actions`
|
|
211
|
+
3. **Timeout-budget check** — session elapsed time must not exceed `timeout_seconds`
|
|
212
|
+
4. **`SecurityManager.check_action()`** — domain allow/block lists, action policy, injection detection, redaction
|
|
213
|
+
5. **Audit log** — every action attempt (allowed or denied) is recorded
|
|
214
|
+
|
|
215
|
+
Navigation-tier calls use a lighter path: argument validation →
|
|
216
|
+
`SecurityManager.check_action()` (navigate only) → audit (both approvals and
|
|
217
|
+
denials) → handler. They bypass the action gate, action-count budget, and
|
|
218
|
+
timeout budget.
|
|
219
|
+
|
|
220
|
+
All denials return structured JSON as normal MCP content, never raised:
|
|
221
|
+
|
|
222
|
+
```json
|
|
223
|
+
{
|
|
224
|
+
"ok": false,
|
|
225
|
+
"refusal": {
|
|
226
|
+
"tool": "navigate",
|
|
227
|
+
"blocked_by": "security_manager",
|
|
228
|
+
"reason": "domain_filter",
|
|
229
|
+
"security_level": "sensitive"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Lifecycle
|
|
235
|
+
|
|
236
|
+
- One browser per server process.
|
|
237
|
+
- The browser lazy-starts on the first browser-dependent tool call
|
|
238
|
+
(`navigate`, `wait_for`, `observe`, `extract_text`, `screenshot`,
|
|
239
|
+
`list_tabs`, or any action tool that reaches the facade after authorization).
|
|
240
|
+
- `browser_status` and `current_url` are safe to call before startup and do
|
|
241
|
+
**not** force a launch.
|
|
242
|
+
- On server close, the runtime calls `SuperBrowser.stop()` to tear down.
|
|
243
|
+
|
|
244
|
+
## Errors
|
|
245
|
+
|
|
246
|
+
Errors are returned as structured JSON, never raised across the MCP boundary:
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
{"ok": false, "error": "Unknown tool: '__missing__'. Available: [...]" }
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Argument-validation errors use the `invalid_arguments` key:
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{"ok": false, "invalid_arguments": "'query' is required and must be a non-empty string"}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
`wait_for` timeouts return a structured timeout result:
|
|
259
|
+
|
|
260
|
+
```json
|
|
261
|
+
{"ok": false, "timeout": true, "reason": "Timeout 10000ms exceeded"}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Behavior changes
|
|
265
|
+
|
|
266
|
+
### `superbrowser-sdk` 2.4 — navigation tier
|
|
267
|
+
|
|
268
|
+
Prior to 2.4, the default MCP server advertised 6 read-only tools and gated
|
|
269
|
+
**all** side-effecting tools (including `navigate`) behind `allow_writes=True`.
|
|
270
|
+
|
|
271
|
+
In 2.4 the tool surface was re-partitioned into four tiers:
|
|
272
|
+
|
|
273
|
+
- `navigate` moved into a default-allowed **Navigation tier** (reading requires
|
|
274
|
+
page acquisition). It is still `SecurityManager`-checked and audited.
|
|
275
|
+
- `wait_for` was added (navigation tier).
|
|
276
|
+
- The former "write tools" became the **Action tier**, gated by
|
|
277
|
+
`allow_actions` (`--allow-actions` / `SB_MCP_ALLOW_ACTIONS`).
|
|
278
|
+
- The action-gate refusal message changed from `"writes are disabled"` to
|
|
279
|
+
`"actions are disabled"`. Clients pattern-matching the old string must update.
|
|
280
|
+
|
|
281
|
+
`allow_writes` remains as a backward-compatibility alias for `allow_actions`
|
|
282
|
+
in `MCPSessionPolicy`; existing callers using `MCPSessionPolicy(allow_writes=True)`
|
|
283
|
+
continue to work.
|
|
284
|
+
|
|
285
|
+
## Reference
|
|
286
|
+
|
|
287
|
+
- Design: [RFC #178](https://github.com/Octo-Lex/Super-Browser/issues/178)
|
|
288
|
+
- The deleted prior server (`a370cf9`) is recoverable from git history for
|
|
289
|
+
reference — it shipped 10 tools including 6 side-effecting ones with no
|
|
290
|
+
permission model and no tests. The current server is the deliberate
|
|
291
|
+
correction: tested, permissioned, tiered, with structured refusals and audit logging.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "superbrowser-sdk"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.4.0"
|
|
8
8
|
description = "Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -6,7 +6,7 @@ from super_browser.agent.types import StreamEvent as StreamEvent # noqa: F401
|
|
|
6
6
|
from super_browser.config import Config as Config # noqa: F401
|
|
7
7
|
from super_browser.results.types import ActionResult as ActionResult # noqa: F401
|
|
8
8
|
|
|
9
|
-
__version__ = "2.
|
|
9
|
+
__version__ = "2.4.0"
|
|
10
10
|
|
|
11
11
|
__all__ = [
|
|
12
12
|
"SuperBrowser",
|