superbrowser-sdk 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.
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/CHANGELOG.md +12 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/PKG-INFO +1 -1
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/api-reference.md +30 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/mcp.md +9 -6
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/pyproject.toml +1 -1
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/__init__.py +1 -1
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/facade.py +54 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/mcp_server.py +69 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_diagnostics.py +3 -3
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_navigation.py +167 -11
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_server.py +4 -4
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.env.example +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/adversarial-v3.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/adversarial.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/benchmark.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/dco.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/e2e.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/publish.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/smoke.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/stress.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/test.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.gitignore +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.pre-commit-config.yaml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/CONTRIBUTING.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/Dockerfile +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/LICENSE +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/README.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/Super-Browser.png +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/behavioral.html +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/dom-heavy.html +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/form.html +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/simple.html +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docker-compose.yml +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/agent-reliability.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/anti-detection-ejecta.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/api-ergonomics-audit.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/api-stability.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/architecture.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/behavioral-synthesis.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/browser-networking.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/cloak-integration.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/consistency-engine.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/design/inspect_redaction.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/error-catalog.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/fingerprint-scoring.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/fingerprint-validation.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/gap-analysis.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/human-behavior.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/memory.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/migration/v1-to-v2.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/migration/v1.8-to-v1.9.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/operating-doctrine.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/platform-abstraction.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/plugins.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/quickstart.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/recording.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/README.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-decomposition.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/stealth-coverage.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/stealth-evidence.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/backend_selection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/basic_usage.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/budget_tracking.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/cloak_stealth.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/error_handling.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/fingerprint_scan.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/human_behavior.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/multi_tab_workflow.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/session_persistence.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/stealth_mode.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/adversarial_run.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/agent_efficiency_benchmark.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/browser_benchmark.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/e2e_trend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/run_stealth_gauntlet.sh +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/smoke_published.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/stress_real_world.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/validate_e2e_report.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/verify_release_artifact.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/__main__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/debug.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/delegator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/diagnostics.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/factory.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/openai_client.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/protocol.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/loop.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/loop_detector.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/plugins.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/registry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/router.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/structured_logging.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/bezier.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/dwell.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/fitts.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/gauss.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/keyboard.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/mouse.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/navigation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/orchestrator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/prng.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/qwerty.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/scroll.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/session_seed.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/cdp.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/cloak_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/cloud.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/discovery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/engine.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/fetch.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/page.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/session.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/shutdown.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/tabs.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/cascade.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/client.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/compressor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/cost_estimator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/credential_pool.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/governor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/commands.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/interactive.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/script.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/events/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/events/bus.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/events/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/cache.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/controller.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/decorator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/presets.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/recovery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/snapshot.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/vision.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/store.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/plugins/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/plugins/decorators.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/plugins/hooks.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/py.typed +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/persistence.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/recorder.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/replayer.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/report.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/checkpoint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/classifier.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/coordinator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/event_bus.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/format_validator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/reflection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/retry_tracker.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/session_recovery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/watchdogs.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/output.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/typed.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/validation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/action_redaction.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/approval.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/credential_vault.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/domain_filter.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/gate.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/injection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/manager.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/policy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/redactor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/session/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/session/proxy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/activation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/markdown.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/registry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/action_policy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/captcha.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/cache.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/pow.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/dag.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/derive.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/errors.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/inject.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/prng.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rule.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/diagnostics.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/headers.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/human.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/human_config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ip_reputation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/manager.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/schema.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/proxy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/proxy_pool.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/report.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/scoring.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/tls_baselines.json +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/checks.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/harness.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/report.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/suite.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/testing.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/cost_analytics.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/flow_logger.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/middleware.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/session_db.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/sinks.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/ax_diff.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/hasher.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/verifier.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/cache.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/controller.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/coords.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/factory.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/ocr.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/providers.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/stress/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/stress/server.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/controlled_server.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/report.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/scoring.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/targets.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_controlled_server.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_targets_unit.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_tier1_scanners.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_tier2_vendors.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_tier3_controlled.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/README.md +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/backends.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/core.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/engines/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/engines/scoring.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/harness.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/history.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/server.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/automation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/behavioral.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/controlled.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/ejector.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/external.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/network.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/pytest.ini +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/run.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_backends.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_behavioral_telemetry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_behavioral_vectors.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_core.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_external.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_harness_smoke.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_header_ordering.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_reporters.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_scoring.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_server.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_superbrowser_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_vectors.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_01_example_nav.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_02_google_search.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_03_github_login.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_05_google_forms.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_06_google_flights.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_09_form_complex.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_behavioral_realism.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_challenge_detection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_interaction.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_live_navigation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_multi_tab.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_navigation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_stealth_overhead.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e_v1_3_journey.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_config_composition.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_engine_backends.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_error_paths.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_facade_smoke.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_full_lifecycle.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_multi_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_performance_smoke.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_playwright_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_public_api.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_stealth_abstraction.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v1100_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v150_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v160_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v170_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v180_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v190_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v191_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v192_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v193_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v194_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v195_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v1_3_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v1_4_features.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/pattern_validation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/conftest.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_cli_switches.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_live_sites.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_webdriver.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_action_timeout.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_browser_transport.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_controller_rebinding.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_debug_mode.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_default_tooling.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_delegator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_error_screenshots.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_control.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_network.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_session.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_fail_fast.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm_budget.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm_production.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm_streaming.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_loop.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_loop_detector.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_prompt_isolation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_registry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_retry_budget.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_streaming.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_structured_logging.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_tab_cap.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_task_02.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_behavioral.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_dwell.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_hardening.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_navigation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_orchestrator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_session_seed.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmark/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmark/test_efficiency.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmarks/test_stress_real_world.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cdp.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cdp_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cloak_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cloak_docs.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cloak_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_discovery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_engine_protocol.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_fetch.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_injectors.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_page.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_patchright_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_playwright_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_selenium_backend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_session.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_shutdown.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_cascade.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_cascade_governor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_circuit_breaker.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_client.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_compressor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_cost_estimator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_credential_pool.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_governor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_interactive.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_script.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_stealth_check.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_stealth_validate.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_unified_cli.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_diagnostics.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_e2e/test_report_schema.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_e2e/test_trend.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_audio.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_browser_apis.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_canvas.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_timing.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_webrtc.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_events/test_event_bus.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_governance_docs.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_cache.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_controller.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_decorator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_injection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_page_change.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_presets.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_recovery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_snapshot.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_vision.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_entrypoint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_permissions.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_redaction.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_server_smoke.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_write_tools.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_write_tools_wave2.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/test_cli_config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/test_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/test_store.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/test_persistence.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/test_recorder.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/test_replayer.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_checkpoint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_classifier.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_coordinator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_event_bus.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_format_validator.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_reflection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_retry_tracker.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_session_recovery.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_watchdogs.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_release/test_naming_consistency.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_release/test_smoke_published.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_release/test_verify_artifact.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_batch40_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_categories.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_output.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_typed.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_validation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_runtime_correctness/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_runtime_correctness/test_runtime_fixes.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_approval.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_credential_vault.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_domain_filter.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_injection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_manager.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_policy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_redaction_pipeline.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_redactor.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_session/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_session/test_locale.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_session/test_proxy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_activation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_integration.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_markdown.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_registry.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_action_policy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_captcha.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_challenge_cache.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_challenge_config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_consistency_inject.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_diagnostics.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_headers.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_human.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_ip_reputation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_kasada_detection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_manager.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_profiles.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_proxy.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_proxy_pool.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_validation.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_cost_analytics.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_flow_logger.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_middleware.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_session_db.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_sinks.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_ax_diff.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_hasher.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_types.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_verifier.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/__init__.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_cache.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_controller.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_coords.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_factory.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_ocr.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_providers.py +0 -0
- {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_types.py +0 -0
|
@@ -5,6 +5,18 @@ 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.7.0] — 2026-06-26
|
|
9
|
+
|
|
10
|
+
### Added — MCP reload and history navigation tools (P3.0B)
|
|
11
|
+
|
|
12
|
+
- `reload`, `go_back`, `go_forward` are now navigation-tier MCP tools
|
|
13
|
+
(default-allowed, not action-budgeted). Each delegates to a new thin facade
|
|
14
|
+
method that calls the underlying Playwright page method.
|
|
15
|
+
- `go_back` and `go_forward` return a structured error when there is no
|
|
16
|
+
history entry to navigate to.
|
|
17
|
+
- Default advertised tools: 14 → 17; action mode: 20 → 23.
|
|
18
|
+
- Diagnostics remain session-wide after navigation.
|
|
19
|
+
|
|
8
20
|
## [2.6.0] — 2026-06-26
|
|
9
21
|
|
|
10
22
|
### Added — MCP switch_tab navigation tool (P3.0A)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superbrowser-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.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
|
|
@@ -101,6 +101,36 @@ if result.ok:
|
|
|
101
101
|
print(result.data.final_url) # "https://example.com/"
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
+
#### `reload(*, wait_until="domcontentloaded") → ActionResult`
|
|
105
|
+
|
|
106
|
+
Reload the current page.
|
|
107
|
+
|
|
108
|
+
| Parameter | Type | Default | Description |
|
|
109
|
+
|---|---|---|---|
|
|
110
|
+
| `wait_until` | `str` | `"domcontentloaded"` | Playwright load event to wait for. |
|
|
111
|
+
|
|
112
|
+
**Returns:** `ActionResult` with `data.url` (the page URL after reload).
|
|
113
|
+
|
|
114
|
+
#### `go_back(*, wait_until="domcontentloaded") → ActionResult`
|
|
115
|
+
|
|
116
|
+
Go back one step in browser history.
|
|
117
|
+
|
|
118
|
+
| Parameter | Type | Default | Description |
|
|
119
|
+
|---|---|---|---|
|
|
120
|
+
| `wait_until` | `str` | `"domcontentloaded"` | Playwright load event to wait for. |
|
|
121
|
+
|
|
122
|
+
**Returns:** `ActionResult` with `data.url`, or `ok=False` if there is no previous history entry.
|
|
123
|
+
|
|
124
|
+
#### `go_forward(*, wait_until="domcontentloaded") → ActionResult`
|
|
125
|
+
|
|
126
|
+
Go forward one step in browser history.
|
|
127
|
+
|
|
128
|
+
| Parameter | Type | Default | Description |
|
|
129
|
+
|---|---|---|---|
|
|
130
|
+
| `wait_until` | `str` | `"domcontentloaded"` | Playwright load event to wait for. |
|
|
131
|
+
|
|
132
|
+
**Returns:** `ActionResult` with `data.url`, or `ok=False` if there is no next history entry.
|
|
133
|
+
|
|
104
134
|
### Interaction
|
|
105
135
|
|
|
106
136
|
#### `click(target, *, description=None) → ActionResult`
|
|
@@ -5,8 +5,8 @@ Super Browser exposes its browser inspection and control surface over the
|
|
|
5
5
|
agents (Claude, Cursor, etc.) can observe and interact with a page without
|
|
6
6
|
scripting Python.
|
|
7
7
|
|
|
8
|
-
The stdio server advertises **
|
|
9
|
-
diagnostics +
|
|
8
|
+
The stdio server advertises **seventeen tools by default** (six inspect + five
|
|
9
|
+
diagnostics + six navigation) — enough to read a URL end-to-end and explain
|
|
10
10
|
why a read failed. When action mode is enabled, it advertises **six additional
|
|
11
11
|
action tools**; every action call is checked by
|
|
12
12
|
`MCPSessionPolicy` and `SecurityManager` before it can reach the browser.
|
|
@@ -31,12 +31,12 @@ python -m patchright install chromium
|
|
|
31
31
|
Either of:
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
|
-
superbrowser-mcp # default:
|
|
35
|
-
superbrowser-mcp --allow-actions #
|
|
34
|
+
superbrowser-mcp # default: 17 tools (inspect + diagnostics + navigation)
|
|
35
|
+
superbrowser-mcp --allow-actions # 23 tools (adds the action tier)
|
|
36
36
|
python -m super_browser.mcp_server
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
Both start a **stdio** server. The default server advertises
|
|
39
|
+
Both start a **stdio** server. The default server advertises 17 tools and
|
|
40
40
|
recognizes (but refuses) action-tool calls with a structured policy refusal.
|
|
41
41
|
|
|
42
42
|
Action mode can also be enabled via the environment:
|
|
@@ -149,6 +149,9 @@ and do **not** require action mode.
|
|
|
149
149
|
| `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. |
|
|
150
150
|
| `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. |
|
|
151
151
|
| `switch_tab` | `tab_id` (required, integer) | Switch the active browser tab by ID (from `list_tabs`). Changes the page the agent reads from. Diagnostics remain session-wide after switching; per-tab diagnostics are not supported yet. |
|
|
152
|
+
| `reload` | `wait_until` (optional) | Reload the current page. Returns the URL after reload. |
|
|
153
|
+
| `go_back` | `wait_until` (optional) | Go back one step in browser history. Returns a structured error if there is no previous entry. |
|
|
154
|
+
| `go_forward` | `wait_until` (optional) | Go forward one step in browser history. Returns a structured error if there is no next entry. |
|
|
152
155
|
|
|
153
156
|
`wait_for` accepts exactly one condition per call (deterministic single
|
|
154
157
|
results; compound waits can be added later as an explicit AND mode).
|
|
@@ -230,7 +233,7 @@ restricts the survivors.
|
|
|
230
233
|
|
|
231
234
|
The default server behavior partitions the surface by risk:
|
|
232
235
|
|
|
233
|
-
- **`list_tools()`** advertises only the Inspect + Navigation tiers (
|
|
236
|
+
- **`list_tools()`** advertises only the Inspect + Navigation tiers (17 tools).
|
|
234
237
|
- **`call_tool()`** still recognizes action-tool names and returns a structured
|
|
235
238
|
policy refusal (`refusal.reason = "actions are disabled"`), not an "Unknown
|
|
236
239
|
tool" error.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "superbrowser-sdk"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.7.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.7.0"
|
|
10
10
|
|
|
11
11
|
__all__ = [
|
|
12
12
|
"SuperBrowser",
|
|
@@ -240,6 +240,60 @@ class SuperBrowser:
|
|
|
240
240
|
method=ActionMethod.SELECTOR,
|
|
241
241
|
)
|
|
242
242
|
|
|
243
|
+
async def reload(self, *, wait_until: str = "domcontentloaded") -> ActionResult:
|
|
244
|
+
"""Reload the current page."""
|
|
245
|
+
if not self._page:
|
|
246
|
+
return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Not started"))
|
|
247
|
+
params = {"wait_until": wait_until}
|
|
248
|
+
sec = await self._check_facade_security("reload", params, security_level="sensitive")
|
|
249
|
+
if sec is not None:
|
|
250
|
+
return sec
|
|
251
|
+
wait_until = params["wait_until"]
|
|
252
|
+
start = time.monotonic()
|
|
253
|
+
await self._page.backend_page.reload(wait_until=wait_until)
|
|
254
|
+
return timed_action_result(
|
|
255
|
+
ok=True, start_ns=start, data={"url": self._page.url},
|
|
256
|
+
method=ActionMethod.SELECTOR,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
async def go_back(self, *, wait_until: str = "domcontentloaded") -> ActionResult:
|
|
260
|
+
"""Navigate to the previous page in browser history."""
|
|
261
|
+
if not self._page:
|
|
262
|
+
return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Not started"))
|
|
263
|
+
params = {"wait_until": wait_until}
|
|
264
|
+
sec = await self._check_facade_security("go_back", params, security_level="sensitive")
|
|
265
|
+
if sec is not None:
|
|
266
|
+
return sec
|
|
267
|
+
wait_until = params["wait_until"]
|
|
268
|
+
start = time.monotonic()
|
|
269
|
+
response = await self._page.backend_page.go_back(wait_until=wait_until)
|
|
270
|
+
if response is None:
|
|
271
|
+
return action_result(ok=False, error=ActionError(
|
|
272
|
+
ErrorCategory.PAGE_ERROR, "No history entry to go back to"))
|
|
273
|
+
return timed_action_result(
|
|
274
|
+
ok=True, start_ns=start, data={"url": self._page.url},
|
|
275
|
+
method=ActionMethod.SELECTOR,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
async def go_forward(self, *, wait_until: str = "domcontentloaded") -> ActionResult:
|
|
279
|
+
"""Navigate to the next page in browser history."""
|
|
280
|
+
if not self._page:
|
|
281
|
+
return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Not started"))
|
|
282
|
+
params = {"wait_until": wait_until}
|
|
283
|
+
sec = await self._check_facade_security("go_forward", params, security_level="sensitive")
|
|
284
|
+
if sec is not None:
|
|
285
|
+
return sec
|
|
286
|
+
wait_until = params["wait_until"]
|
|
287
|
+
start = time.monotonic()
|
|
288
|
+
response = await self._page.backend_page.go_forward(wait_until=wait_until)
|
|
289
|
+
if response is None:
|
|
290
|
+
return action_result(ok=False, error=ActionError(
|
|
291
|
+
ErrorCategory.PAGE_ERROR, "No history entry to go forward to"))
|
|
292
|
+
return timed_action_result(
|
|
293
|
+
ok=True, start_ns=start, data={"url": self._page.url},
|
|
294
|
+
method=ActionMethod.SELECTOR,
|
|
295
|
+
)
|
|
296
|
+
|
|
243
297
|
async def click(self, target: str, *, description: Optional[str] = None) -> ActionResult:
|
|
244
298
|
if not self._controller:
|
|
245
299
|
return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Browser not started. Call await sb.start() first."))
|
|
@@ -141,6 +141,51 @@ NAVIGATION_AUX_TOOLS: list[types.Tool] = [
|
|
|
141
141
|
"required": ["tab_id"],
|
|
142
142
|
},
|
|
143
143
|
),
|
|
144
|
+
types.Tool(
|
|
145
|
+
name="reload",
|
|
146
|
+
description="Reload the current page. Navigation-tier tool (default-allowed).",
|
|
147
|
+
inputSchema={
|
|
148
|
+
"type": "object",
|
|
149
|
+
"properties": {
|
|
150
|
+
"wait_until": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"enum": ["load", "domcontentloaded", "networkidle"],
|
|
153
|
+
"default": "domcontentloaded",
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
"required": [],
|
|
157
|
+
},
|
|
158
|
+
),
|
|
159
|
+
types.Tool(
|
|
160
|
+
name="go_back",
|
|
161
|
+
description="Go back one step in browser history. Navigation-tier tool (default-allowed).",
|
|
162
|
+
inputSchema={
|
|
163
|
+
"type": "object",
|
|
164
|
+
"properties": {
|
|
165
|
+
"wait_until": {
|
|
166
|
+
"type": "string",
|
|
167
|
+
"enum": ["load", "domcontentloaded", "networkidle"],
|
|
168
|
+
"default": "domcontentloaded",
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
"required": [],
|
|
172
|
+
},
|
|
173
|
+
),
|
|
174
|
+
types.Tool(
|
|
175
|
+
name="go_forward",
|
|
176
|
+
description="Go forward one step in browser history. Navigation-tier tool (default-allowed).",
|
|
177
|
+
inputSchema={
|
|
178
|
+
"type": "object",
|
|
179
|
+
"properties": {
|
|
180
|
+
"wait_until": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"enum": ["load", "domcontentloaded", "networkidle"],
|
|
183
|
+
"default": "domcontentloaded",
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
"required": [],
|
|
187
|
+
},
|
|
188
|
+
),
|
|
144
189
|
]
|
|
145
190
|
|
|
146
191
|
_NAVIGATION_AUX_TOOL_NAMES = frozenset(t.name for t in NAVIGATION_AUX_TOOLS)
|
|
@@ -924,6 +969,15 @@ class ToolDispatcher:
|
|
|
924
969
|
)
|
|
925
970
|
return None
|
|
926
971
|
|
|
972
|
+
if name in ("reload", "go_back", "go_forward"):
|
|
973
|
+
wait_until = arguments.get("wait_until", "domcontentloaded")
|
|
974
|
+
if wait_until not in ("load", "domcontentloaded", "networkidle"):
|
|
975
|
+
return _error_content(
|
|
976
|
+
"'wait_until' must be one of: load, domcontentloaded, networkidle",
|
|
977
|
+
kind="invalid_arguments",
|
|
978
|
+
)
|
|
979
|
+
return None
|
|
980
|
+
|
|
927
981
|
if name == "wait_for":
|
|
928
982
|
# timeout_ms: integer, 100 <= x <= 60000. Reject bool (int subtype).
|
|
929
983
|
timeout_ms = arguments.get("timeout_ms", 10000)
|
|
@@ -1048,6 +1102,21 @@ class ToolDispatcher:
|
|
|
1048
1102
|
ar = await sb.switch_tab(arguments["tab_id"])
|
|
1049
1103
|
return _text_content(_serialize_action_result(ar))
|
|
1050
1104
|
|
|
1105
|
+
async def _tool_reload(self, arguments: dict[str, Any]) -> list[types.TextContent]:
|
|
1106
|
+
sb = await self.runtime.get_browser()
|
|
1107
|
+
ar = await sb.reload(wait_until=arguments.get("wait_until", "domcontentloaded"))
|
|
1108
|
+
return _text_content(_serialize_action_result(ar))
|
|
1109
|
+
|
|
1110
|
+
async def _tool_go_back(self, arguments: dict[str, Any]) -> list[types.TextContent]:
|
|
1111
|
+
sb = await self.runtime.get_browser()
|
|
1112
|
+
ar = await sb.go_back(wait_until=arguments.get("wait_until", "domcontentloaded"))
|
|
1113
|
+
return _text_content(_serialize_action_result(ar))
|
|
1114
|
+
|
|
1115
|
+
async def _tool_go_forward(self, arguments: dict[str, Any]) -> list[types.TextContent]:
|
|
1116
|
+
sb = await self.runtime.get_browser()
|
|
1117
|
+
ar = await sb.go_forward(wait_until=arguments.get("wait_until", "domcontentloaded"))
|
|
1118
|
+
return _text_content(_serialize_action_result(ar))
|
|
1119
|
+
|
|
1051
1120
|
async def _tool_wait_for(self, arguments: dict[str, Any]) -> list[types.TextContent]:
|
|
1052
1121
|
"""Wait for exactly one page condition (selector/text/url/load_state).
|
|
1053
1122
|
|
|
@@ -75,16 +75,16 @@ class TestDiagnosticsAdvertisement:
|
|
|
75
75
|
from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
|
|
76
76
|
|
|
77
77
|
names = {t.name for t in _tools_for_policy(MCPSessionPolicy())}
|
|
78
|
-
assert len(names) ==
|
|
78
|
+
assert len(names) == 17
|
|
79
79
|
for diag in ("get_console_messages", "get_page_errors", "get_network_errors",
|
|
80
80
|
"list_requests", "get_request"):
|
|
81
81
|
assert diag in names
|
|
82
82
|
|
|
83
|
-
def
|
|
83
|
+
def test_action_mode_advertises_23_tools(self):
|
|
84
84
|
from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
|
|
85
85
|
|
|
86
86
|
names = {t.name for t in _tools_for_policy(MCPSessionPolicy(allow_actions=True))}
|
|
87
|
-
assert len(names) ==
|
|
87
|
+
assert len(names) == 23
|
|
88
88
|
|
|
89
89
|
def test_diagnostics_are_inspect_tier(self):
|
|
90
90
|
"""Diagnostics tools are in INSPECT_TOOL_NAMES (no action gate)."""
|
|
@@ -35,10 +35,10 @@ class TestTierConstants:
|
|
|
35
35
|
"get_network_errors", "list_requests", "get_request",
|
|
36
36
|
})
|
|
37
37
|
|
|
38
|
-
def
|
|
38
|
+
def test_navigation_tool_names_has_six_tools(self):
|
|
39
39
|
from super_browser.mcp_server import NAVIGATION_TOOL_NAMES
|
|
40
40
|
|
|
41
|
-
assert NAVIGATION_TOOL_NAMES == frozenset({"navigate", "wait_for", "switch_tab"})
|
|
41
|
+
assert NAVIGATION_TOOL_NAMES == frozenset({"navigate", "wait_for", "switch_tab", "reload", "go_back", "go_forward"})
|
|
42
42
|
|
|
43
43
|
def test_action_tool_names_has_six_tools(self):
|
|
44
44
|
from super_browser.mcp_server import ACTION_TOOL_NAMES
|
|
@@ -77,7 +77,7 @@ class TestTierConstants:
|
|
|
77
77
|
|
|
78
78
|
all_known = {
|
|
79
79
|
"browser_status", "current_url", "observe", "extract_text",
|
|
80
|
-
"screenshot", "list_tabs", "navigate", "wait_for", "switch_tab",
|
|
80
|
+
"screenshot", "list_tabs", "navigate", "wait_for", "switch_tab", "reload", "go_back", "go_forward",
|
|
81
81
|
"scroll", "press_key", "click", "fill", "open_tab", "close_tab",
|
|
82
82
|
"get_console_messages", "get_page_errors", "get_network_errors",
|
|
83
83
|
"list_requests", "get_request",
|
|
@@ -658,7 +658,7 @@ class TestToolAdvertisement:
|
|
|
658
658
|
|
|
659
659
|
advertised = _tools_for_policy(MCPSessionPolicy())
|
|
660
660
|
names = {t.name for t in advertised}
|
|
661
|
-
assert len(advertised) ==
|
|
661
|
+
assert len(advertised) == 17
|
|
662
662
|
# All 5 diagnostics tools present.
|
|
663
663
|
assert {"get_console_messages", "get_page_errors", "get_network_errors",
|
|
664
664
|
"list_requests", "get_request"} <= names
|
|
@@ -676,12 +676,12 @@ class TestToolAdvertisement:
|
|
|
676
676
|
assert {t.name for t in advertised} == DEFAULT_TOOL_NAMES
|
|
677
677
|
assert DEFAULT_TOOL_NAMES == INSPECT_TOOL_NAMES | NAVIGATION_TOOL_NAMES
|
|
678
678
|
|
|
679
|
-
def
|
|
679
|
+
def test_allow_actions_advertises_23_tools(self):
|
|
680
680
|
from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
|
|
681
681
|
|
|
682
682
|
advertised = _tools_for_policy(MCPSessionPolicy(allow_actions=True))
|
|
683
683
|
names = {t.name for t in advertised}
|
|
684
|
-
assert len(advertised) ==
|
|
684
|
+
assert len(advertised) == 23
|
|
685
685
|
# All 6 action tools present.
|
|
686
686
|
assert {"scroll", "press_key", "click", "fill", "open_tab", "close_tab"} <= names
|
|
687
687
|
|
|
@@ -697,28 +697,28 @@ class TestToolAdvertisement:
|
|
|
697
697
|
server = build_server()
|
|
698
698
|
policy = server._sb_policy # type: ignore[attr-defined]
|
|
699
699
|
names = {t.name for t in _tools_for_policy(policy)}
|
|
700
|
-
assert len(names) ==
|
|
700
|
+
assert len(names) == 17
|
|
701
701
|
assert "navigate" in names
|
|
702
702
|
assert "wait_for" in names
|
|
703
703
|
assert "get_console_messages" in names
|
|
704
704
|
assert "click" not in names
|
|
705
705
|
|
|
706
|
-
def
|
|
706
|
+
def test_build_server_allow_actions_advertises_23(self):
|
|
707
707
|
from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy, build_server
|
|
708
708
|
|
|
709
709
|
server = build_server(policy=MCPSessionPolicy(allow_actions=True))
|
|
710
710
|
policy = server._sb_policy # type: ignore[attr-defined]
|
|
711
711
|
names = {t.name for t in _tools_for_policy(policy)}
|
|
712
|
-
assert len(names) ==
|
|
712
|
+
assert len(names) == 23
|
|
713
713
|
|
|
714
|
-
def
|
|
714
|
+
def test_build_server_legacy_allow_writes_advertises_23(self):
|
|
715
715
|
"""Legacy allow_writes=True must still enable action tools."""
|
|
716
716
|
from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy, build_server
|
|
717
717
|
|
|
718
718
|
server = build_server(policy=MCPSessionPolicy(allow_writes=True))
|
|
719
719
|
policy = server._sb_policy # type: ignore[attr-defined]
|
|
720
720
|
names = {t.name for t in _tools_for_policy(policy)}
|
|
721
|
-
assert len(names) ==
|
|
721
|
+
assert len(names) == 23
|
|
722
722
|
|
|
723
723
|
|
|
724
724
|
# ============================================================================
|
|
@@ -1163,3 +1163,159 @@ class TestSwitchTabTool:
|
|
|
1163
1163
|
result = await dispatcher.dispatch("switch_tab", {"tab_id": 999})
|
|
1164
1164
|
payload = json.loads(result[0].text)
|
|
1165
1165
|
assert payload["ok"] is False
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
# ============================================================================
|
|
1169
|
+
# reload / go_back / go_forward (P3.0B) — navigation-tier MCP tools
|
|
1170
|
+
# ============================================================================
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
class TestHistoryNavigationTools:
|
|
1174
|
+
"""reload, go_back, go_forward are navigation-tier: default-allowed,
|
|
1175
|
+
delegate to the facade, don't consume action budget."""
|
|
1176
|
+
|
|
1177
|
+
def test_all_three_in_navigation_tool_names(self):
|
|
1178
|
+
from super_browser.mcp_server import NAVIGATION_TOOL_NAMES
|
|
1179
|
+
|
|
1180
|
+
for name in ("reload", "go_back", "go_forward"):
|
|
1181
|
+
assert name in NAVIGATION_TOOL_NAMES
|
|
1182
|
+
|
|
1183
|
+
def test_all_three_in_default_advertised_tools(self):
|
|
1184
|
+
from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
|
|
1185
|
+
|
|
1186
|
+
names = {t.name for t in _tools_for_policy(MCPSessionPolicy())}
|
|
1187
|
+
for name in ("reload", "go_back", "go_forward"):
|
|
1188
|
+
assert name in names
|
|
1189
|
+
|
|
1190
|
+
@pytest.mark.asyncio
|
|
1191
|
+
async def test_reload_dispatches_to_facade(self):
|
|
1192
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1193
|
+
fake_sb.reload = AsyncMock(return_value=_fake_action_result({"url": "https://example.com"}))
|
|
1194
|
+
result = await dispatcher.dispatch("reload", {})
|
|
1195
|
+
fake_sb.reload.assert_awaited_once()
|
|
1196
|
+
payload = json.loads(result[0].text)
|
|
1197
|
+
assert payload["ok"] is True
|
|
1198
|
+
|
|
1199
|
+
@pytest.mark.asyncio
|
|
1200
|
+
async def test_go_back_dispatches_to_facade(self):
|
|
1201
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1202
|
+
fake_sb.go_back = AsyncMock(return_value=_fake_action_result({"url": "https://prev.com"}))
|
|
1203
|
+
result = await dispatcher.dispatch("go_back", {})
|
|
1204
|
+
fake_sb.go_back.assert_awaited_once()
|
|
1205
|
+
assert json.loads(result[0].text)["ok"] is True
|
|
1206
|
+
|
|
1207
|
+
@pytest.mark.asyncio
|
|
1208
|
+
async def test_go_forward_dispatches_to_facade(self):
|
|
1209
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1210
|
+
fake_sb.go_forward = AsyncMock(return_value=_fake_action_result({"url": "https://next.com"}))
|
|
1211
|
+
result = await dispatcher.dispatch("go_forward", {})
|
|
1212
|
+
fake_sb.go_forward.assert_awaited_once()
|
|
1213
|
+
assert json.loads(result[0].text)["ok"] is True
|
|
1214
|
+
|
|
1215
|
+
@pytest.mark.asyncio
|
|
1216
|
+
async def test_passes_wait_until(self):
|
|
1217
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1218
|
+
fake_sb.reload = AsyncMock(return_value=_fake_action_result({"url": "x"}))
|
|
1219
|
+
await dispatcher.dispatch("reload", {"wait_until": "networkidle"})
|
|
1220
|
+
fake_sb.reload.assert_awaited_once_with(wait_until="networkidle")
|
|
1221
|
+
|
|
1222
|
+
@pytest.mark.asyncio
|
|
1223
|
+
async def test_invalid_wait_until_returns_error(self):
|
|
1224
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1225
|
+
fake_sb.reload = AsyncMock()
|
|
1226
|
+
result = await dispatcher.dispatch("reload", {"wait_until": "bogus"})
|
|
1227
|
+
payload = json.loads(result[0].text)
|
|
1228
|
+
assert payload["ok"] is False
|
|
1229
|
+
assert "invalid_arguments" in payload
|
|
1230
|
+
fake_sb.reload.assert_not_called()
|
|
1231
|
+
|
|
1232
|
+
@pytest.mark.asyncio
|
|
1233
|
+
async def test_do_not_require_allow_actions(self):
|
|
1234
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1235
|
+
for name, mock_name in [("reload", "reload"), ("go_back", "go_back"), ("go_forward", "go_forward")]:
|
|
1236
|
+
setattr(fake_sb, mock_name, AsyncMock(return_value=_fake_action_result({"url": "x"})))
|
|
1237
|
+
result = await dispatcher.dispatch(name, {})
|
|
1238
|
+
assert json.loads(result[0].text)["ok"] is True
|
|
1239
|
+
|
|
1240
|
+
@pytest.mark.asyncio
|
|
1241
|
+
async def test_do_not_increment_actions_used(self):
|
|
1242
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1243
|
+
fake_sb.reload = AsyncMock(return_value=_fake_action_result({"url": "x"}))
|
|
1244
|
+
fake_sb.go_back = AsyncMock(return_value=_fake_action_result({"url": "x"}))
|
|
1245
|
+
fake_sb.go_forward = AsyncMock(return_value=_fake_action_result({"url": "x"}))
|
|
1246
|
+
await dispatcher.dispatch("reload", {})
|
|
1247
|
+
await dispatcher.dispatch("go_back", {})
|
|
1248
|
+
await dispatcher.dispatch("go_forward", {})
|
|
1249
|
+
assert dispatcher.authorizer.policy.actions_used == 0
|
|
1250
|
+
|
|
1251
|
+
@pytest.mark.asyncio
|
|
1252
|
+
async def test_facade_error_returns_structured(self):
|
|
1253
|
+
"""When facade returns ok=False (e.g. no history), MCP reflects it."""
|
|
1254
|
+
dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
|
|
1255
|
+
err_result = MagicMock()
|
|
1256
|
+
err_result.ok = False
|
|
1257
|
+
err_result.data = None
|
|
1258
|
+
err_result.error = {"category": "page_error", "message": "No history entry"}
|
|
1259
|
+
err_result.meta = None
|
|
1260
|
+
fake_sb.go_back = AsyncMock(return_value=err_result)
|
|
1261
|
+
result = await dispatcher.dispatch("go_back", {})
|
|
1262
|
+
payload = json.loads(result[0].text)
|
|
1263
|
+
assert payload["ok"] is False
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
# ============================================================================
|
|
1267
|
+
# Facade security blocking (P3.0B review) — backend page not called when blocked
|
|
1268
|
+
# ============================================================================
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
class TestFacadeSecurityBlocking:
|
|
1272
|
+
"""The new facade methods (reload/go_back/go_forward) must call
|
|
1273
|
+
_check_facade_security before touching the backend page. When security
|
|
1274
|
+
blocks, the backend method must never be awaited."""
|
|
1275
|
+
|
|
1276
|
+
def _blocked_sb(self):
|
|
1277
|
+
"""A SuperBrowser whose _check_facade_security always returns a denial."""
|
|
1278
|
+
from super_browser import SuperBrowser
|
|
1279
|
+
from super_browser.results.types import ActionError, ErrorCategory, action_result
|
|
1280
|
+
|
|
1281
|
+
sb = SuperBrowser()
|
|
1282
|
+
# Pre-seed a fake page so the _page check passes.
|
|
1283
|
+
sb._page = MagicMock()
|
|
1284
|
+
sb._page.url = "https://example.com"
|
|
1285
|
+
sb._page.backend_page = MagicMock()
|
|
1286
|
+
sb._page.backend_page.reload = AsyncMock()
|
|
1287
|
+
sb._page.backend_page.go_back = AsyncMock()
|
|
1288
|
+
sb._page.backend_page.go_forward = AsyncMock()
|
|
1289
|
+
# Make _check_facade_security return a denial (not None).
|
|
1290
|
+
sb._check_facade_security = AsyncMock(return_value=action_result(
|
|
1291
|
+
ok=False, error=ActionError(ErrorCategory.SECURITY, "blocked")))
|
|
1292
|
+
return sb
|
|
1293
|
+
|
|
1294
|
+
@pytest.mark.asyncio
|
|
1295
|
+
async def test_reload_blocked_does_not_call_backend(self):
|
|
1296
|
+
sb = self._blocked_sb()
|
|
1297
|
+
result = await sb.reload()
|
|
1298
|
+
assert result.ok is False
|
|
1299
|
+
sb._page.backend_page.reload.assert_not_called()
|
|
1300
|
+
|
|
1301
|
+
@pytest.mark.asyncio
|
|
1302
|
+
async def test_go_back_blocked_does_not_call_backend(self):
|
|
1303
|
+
sb = self._blocked_sb()
|
|
1304
|
+
result = await sb.go_back()
|
|
1305
|
+
assert result.ok is False
|
|
1306
|
+
sb._page.backend_page.go_back.assert_not_called()
|
|
1307
|
+
|
|
1308
|
+
@pytest.mark.asyncio
|
|
1309
|
+
async def test_go_forward_blocked_does_not_call_backend(self):
|
|
1310
|
+
sb = self._blocked_sb()
|
|
1311
|
+
result = await sb.go_forward()
|
|
1312
|
+
assert result.ok is False
|
|
1313
|
+
sb._page.backend_page.go_forward.assert_not_called()
|
|
1314
|
+
|
|
1315
|
+
@pytest.mark.asyncio
|
|
1316
|
+
async def test_check_facade_security_is_called_for_all_three(self):
|
|
1317
|
+
sb = self._blocked_sb()
|
|
1318
|
+
await sb.reload()
|
|
1319
|
+
await sb.go_back()
|
|
1320
|
+
await sb.go_forward()
|
|
1321
|
+
assert sb._check_facade_security.call_count == 3
|
|
@@ -40,8 +40,8 @@ INSPECT_TOOL_NAMES = {
|
|
|
40
40
|
"list_requests", "get_request",
|
|
41
41
|
}
|
|
42
42
|
# Navigation-tier tool set (always advertised).
|
|
43
|
-
NAVIGATION_TOOL_NAMES = {"navigate", "wait_for", "switch_tab"}
|
|
44
|
-
# Default advertised set: Inspect + Navigation (
|
|
43
|
+
NAVIGATION_TOOL_NAMES = {"navigate", "wait_for", "switch_tab", "reload", "go_back", "go_forward"}
|
|
44
|
+
# Default advertised set: Inspect + Navigation (17 tools).
|
|
45
45
|
DEFAULT_TOOL_NAMES = INSPECT_TOOL_NAMES | NAVIGATION_TOOL_NAMES
|
|
46
46
|
# Action-tier tool set (advertised only when allow_actions=True).
|
|
47
47
|
ACTION_TOOL_NAMES = {
|
|
@@ -437,7 +437,7 @@ class TestServerWiring:
|
|
|
437
437
|
advertised = _tools_for_policy(policy)
|
|
438
438
|
advertised_names = {t.name for t in advertised}
|
|
439
439
|
assert advertised_names == DEFAULT_TOOL_NAMES
|
|
440
|
-
assert len(advertised) ==
|
|
440
|
+
assert len(advertised) == 17
|
|
441
441
|
|
|
442
442
|
def test_actions_enabled_server_advertises_exactly_19_tools(self):
|
|
443
443
|
"""build_server(policy=allow_actions=True) advertises all 19 tools,
|
|
@@ -449,7 +449,7 @@ class TestServerWiring:
|
|
|
449
449
|
advertised = _tools_for_policy(policy)
|
|
450
450
|
advertised_names = {t.name for t in advertised}
|
|
451
451
|
assert advertised_names == ALL_TOOL_NAMES
|
|
452
|
-
assert len(advertised) ==
|
|
452
|
+
assert len(advertised) == 23
|
|
453
453
|
|
|
454
454
|
@pytest.mark.asyncio
|
|
455
455
|
async def test_default_server_dispatch_returns_refusal_not_unknown(self):
|
|
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
|
{superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/v1.11.0-baseline-patchright.json
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
|