superbrowser-sdk 2.1.0__tar.gz → 2.2.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.1.0 → superbrowser_sdk-2.2.0}/CHANGELOG.md +64 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/PKG-INFO +1 -1
- superbrowser_sdk-2.2.0/docs/api-ergonomics-audit.md +195 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/api-reference.md +4 -4
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/architecture.md +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/quickstart.md +6 -6
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/backend_selection.py +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/basic_usage.py +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/budget_tracking.py +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/error_handling.py +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/multi_tab_workflow.py +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/session_persistence.py +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/pyproject.toml +1 -1
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/browser_benchmark.py +2 -2
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/smoke_published.py +9 -8
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/__init__.py +1 -1
- superbrowser_sdk-2.2.0/src/super_browser/__main__.py +12 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/page.py +2 -2
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/cli/__init__.py +7 -7
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v194_features.py +2 -2
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_cli/test_unified_cli.py +7 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_release/test_smoke_published.py +51 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.env.example +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.github/workflows/benchmark.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.github/workflows/dco.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.github/workflows/e2e.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.github/workflows/publish.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.github/workflows/smoke.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.github/workflows/test.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.gitignore +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/.pre-commit-config.yaml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/CONTRIBUTING.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/Dockerfile +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/LICENSE +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/README.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/Super-Browser.png +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/00-SOURCE-INVENTORY.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/01-TRIAGE-QUEUE.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/AGENT-BROWSER-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/AGENT-S-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/BROWSER-HARNESS-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/BROWSER-USE-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/CROSS-PROJECT-SYNTHESIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/FIRECRAWL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/GAP-INVENTORY.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/HERMES-AGENT-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/HERMES-SELF-EVOLUTION-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/HTTPMORPH-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/IMPLEMENTATION-ROADMAP.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/LAVAGUE-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/OPENCLAW-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/PATCHRIGHT-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/PROJECT-CONFIG.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/SESSION-STATE.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/SKYVERN-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/STAGEHAND-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/UI-TARS-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/UI-TARS-DESKTOP-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/CHROMECLAW-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/CLAW-VARIANTS-ASSESSMENT.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/E2B-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/EVOSKILL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/GO-INFRA-ASSESSMENT.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/GUARDRAILS-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/KHOJ-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/LETTA-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/MCP-AGENT-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/MCP-ZERO-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/MEM0-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/OPENFGA-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/SKYLL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/TEMPORAL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/analysis/output/TOOL-BENCHMARK-ASSESSMENT.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/benchmarks/fixtures/behavioral.html +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/benchmarks/fixtures/dom-heavy.html +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/benchmarks/fixtures/form.html +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/benchmarks/fixtures/simple.html +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/conftest.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docker-compose.yml +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/agent-reliability.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/anti-detection-ejecta.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/api-stability.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/behavioral-synthesis.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/browser-networking.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/cloak-integration.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/consistency-engine.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/error-catalog.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/fingerprint-scoring.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/fingerprint-validation.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/gap-analysis.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/human-behavior.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/memory.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/migration/v1-to-v2.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/migration/v1.8-to-v1.9.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/operating-doctrine.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/platform-abstraction.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/plugins.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/recording.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/README.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/v2-decomposition.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/docs/stealth-coverage.md +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/cloak_stealth.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/fingerprint_scan.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/human_behavior.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/examples/stealth_mode.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/labels/config.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/agent_efficiency_benchmark.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/e2e_trend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/run_stealth_gauntlet.sh +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/validate_e2e_report.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/scripts/verify_release_artifact.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/debug.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/delegator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/facade.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/factory.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/openai_client.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/llm/protocol.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/loop.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/loop_detector.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/plugins.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/registry.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/router.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/structured_logging.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/agent/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/bezier.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/dwell.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/fitts.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/gauss.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/keyboard.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/mouse.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/navigation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/orchestrator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/prng.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/qwerty.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/scroll.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/session_seed.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/behavioral/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/backends/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/cdp.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/cloak_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/cloud.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/discovery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/engine.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/fetch.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/injectors/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/session.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/shutdown.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/browser/tabs.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/cascade.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/client.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/compressor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/cost_estimator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/credential_pool.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/governor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/budget/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/cli/commands.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/cli/interactive.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/cli/script.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/events/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/events/bus.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/events/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/cache.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/controller.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/decorator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/presets.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/recovery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/snapshot.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/interaction/vision.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/memory/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/memory/integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/memory/store.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/memory/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/plugins/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/plugins/decorators.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/plugins/hooks.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/py.typed +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recording/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recording/persistence.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recording/recorder.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recording/replayer.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recording/report.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recording/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/checkpoint.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/classifier.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/coordinator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/event_bus.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/format_validator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/reflection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/retry_tracker.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/session_recovery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/recovery/watchdogs.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/results/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/results/output.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/results/typed.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/results/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/results/validation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/action_redaction.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/approval.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/credential_vault.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/domain_filter.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/gate.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/injection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/manager.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/policy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/redactor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/security/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/session/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/session/proxy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/skills/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/skills/activation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/skills/markdown.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/skills/registry.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/skills/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/action_policy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/captcha.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/challenges/cache.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/challenges/pow.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/dag.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/derive.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/errors.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/inject.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/prng.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rule.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/diagnostics.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/headers.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/human.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/human_config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/ip_reputation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/manager.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/profiles/schema.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/proxy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/proxy_pool.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/report.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/scoring.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/tls_baselines.json +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/validation/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/validation/checks.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/validation/harness.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/validation/report.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/stealth/validation/suite.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/testing.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/cost_analytics.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/flow_logger.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/middleware.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/session_db.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/sinks.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/tracing/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/verification/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/verification/ax_diff.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/verification/hasher.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/verification/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/verification/verifier.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/cache.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/controller.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/coords.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/factory.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/ocr.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/providers.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/src/super_browser/vision/types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/conftest.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/conftest.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_01_example_nav.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_02_google_search.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_03_github_login.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_05_google_forms.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_06_google_flights.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_09_form_complex.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/conftest.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_behavioral_realism.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_challenge_detection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_interaction.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_live_navigation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_multi_tab.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_navigation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e/test_stealth_overhead.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/e2e_v1_3_journey.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/conftest.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_config_composition.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_engine_backends.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_error_paths.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_facade_smoke.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_full_lifecycle.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_multi_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_performance_smoke.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_playwright_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_public_api.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_stealth_abstraction.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v1100_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v150_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v160_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v170_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v180_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v190_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v191_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v192_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v193_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v195_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v1_3_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/integration/test_v1_4_features.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/pattern_validation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/conftest.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_cli_switches.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_live_sites.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/stealth_detection/test_webdriver.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_action_timeout.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_browser_transport.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_controller_rebinding.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_debug_mode.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_default_tooling.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_delegator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_error_screenshots.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_facade.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_facade_security.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_facade_security_control.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_facade_security_network.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_facade_security_session.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_fail_fast.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_llm.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_llm_budget.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_llm_production.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_llm_streaming.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_loop.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_loop_detector.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_prompt_isolation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_registry.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_retry_budget.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_streaming.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_structured_logging.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_tab_cap.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_task_02.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_agent/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/test_behavioral.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/test_dwell.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/test_navigation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/test_orchestrator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_behavioral/test_session_seed.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_benchmark/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_benchmark/test_efficiency.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_cdp.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_cdp_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_cloak_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_cloak_docs.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_cloak_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_discovery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_engine_protocol.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_fetch.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_injectors.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_page.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_patchright_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_playwright_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_selenium_backend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_session.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_browser/test_shutdown.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_cascade.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_cascade_governor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_circuit_breaker.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_client.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_compressor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_cost_estimator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_credential_pool.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_governor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_budget/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_cli/test_interactive.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_cli/test_script.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_cli/test_stealth_check.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_cli/test_stealth_validate.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_e2e/test_report_schema.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_e2e/test_trend.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_audio.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_browser_apis.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_canvas.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_timing.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_ejecta/test_webrtc.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_events/test_event_bus.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_governance_docs.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_cache.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_controller.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_decorator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_injection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_page_change.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_presets.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_recovery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_snapshot.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_interaction/test_vision.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_memory/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_memory/test_cli_config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_memory/test_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_memory/test_store.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recording/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recording/test_persistence.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recording/test_recorder.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recording/test_replayer.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_checkpoint.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_classifier.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_coordinator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_event_bus.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_format_validator.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_reflection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_retry_tracker.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_session_recovery.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_recovery/test_watchdogs.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_release/test_naming_consistency.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_release/test_verify_artifact.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/test_batch40_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/test_categories.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/test_output.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/test_typed.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_results/test_validation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_approval.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_credential_vault.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_domain_filter.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_injection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_manager.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_policy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_redaction_pipeline.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_redactor.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_security/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_session/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_session/test_proxy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_skills/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_skills/test_activation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_skills/test_integration.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_skills/test_markdown.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_skills/test_registry.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_skills/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_action_policy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_captcha.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_challenge_cache.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_challenge_config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_consistency_inject.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_diagnostics.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_headers.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_human.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_ip_reputation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_kasada_detection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_manager.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_profiles.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_proxy.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_proxy_pool.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_stealth/test_validation.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/test_cost_analytics.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/test_flow_logger.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/test_middleware.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/test_session_db.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/test_sinks.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_tracing/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_verification/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_verification/test_ax_diff.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_verification/test_hasher.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_verification/test_types.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_verification/test_verifier.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/__init__.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_cache.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_controller.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_coords.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_factory.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_ocr.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_providers.py +0 -0
- {superbrowser_sdk-2.1.0 → superbrowser_sdk-2.2.0}/tests/test_vision/test_types.py +0 -0
|
@@ -7,6 +7,70 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.2.0] — 2026-06-16
|
|
11
|
+
|
|
12
|
+
### Overview
|
|
13
|
+
|
|
14
|
+
**v2.2.0 — API Ergonomics**
|
|
15
|
+
|
|
16
|
+
v2.2 polishes the public API surface based on the Track D discovery
|
|
17
|
+
audit. No new features, no breaking changes — cleaner imports, better
|
|
18
|
+
CLI discoverability, and a new `python -m super_browser` entry point.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **`python -m super_browser` support**: New `__main__.py` delegates to
|
|
23
|
+
the CLI dispatcher, so users can run either `superbrowser version` or
|
|
24
|
+
`python -m super_browser version`.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **Standardized top-level imports**: All examples, quickstart, and docs
|
|
29
|
+
now use `from super_browser import SuperBrowser`, `Config`, and
|
|
30
|
+
`create_llm` instead of deep module paths.
|
|
31
|
+
- **CLI help clarified**:
|
|
32
|
+
- `stealth-check` → "Run offline fingerprint scoring and report"
|
|
33
|
+
- `stealth-validate` → "Validate fingerprint against baselines
|
|
34
|
+
(CI/regression mode)"
|
|
35
|
+
- `result-demo` → labeled as internal command
|
|
36
|
+
- **API reference cleaned**: Removed stale `SuperBrowserConfig`
|
|
37
|
+
references (class removed in v2.0) and the removed `core` field row
|
|
38
|
+
from `AgentConfig`.
|
|
39
|
+
- **`raw_page` deprecation updated**: Removal target changed from
|
|
40
|
+
"v2.1" to "v3.0" — the alias stays available through the v2.x series.
|
|
41
|
+
|
|
42
|
+
### Track D audit artifacts
|
|
43
|
+
|
|
44
|
+
- `docs/api-ergonomics-audit.md` — full discovery document with 15
|
|
45
|
+
findings across three buckets (patch-safe, backward-compatible polish,
|
|
46
|
+
defer).
|
|
47
|
+
|
|
48
|
+
## [2.1.1] — 2026-06-16
|
|
49
|
+
|
|
50
|
+
### Fixed — Smoke workflow install spec format
|
|
51
|
+
|
|
52
|
+
- **Smoke install specs were malformed** (`dist==version[extra]` instead
|
|
53
|
+
of `dist[extra]==version`), causing the post-release smoke workflow
|
|
54
|
+
to fail for any version-targeted run.
|
|
55
|
+
- Affects `[all]`, `[patchright]`, and `[playwright]` install checks in
|
|
56
|
+
`scripts/smoke_published.py`.
|
|
57
|
+
- Found by the v2.1.0 post-release smoke run — exactly the kind of
|
|
58
|
+
packaging bug the workflow was designed to catch.
|
|
59
|
+
- Added `TestInstallSpecFormat` regression test verifying PEP 508
|
|
60
|
+
extras-before-version ordering.
|
|
61
|
+
|
|
62
|
+
### Fixed — Benchmark deprecated API usage
|
|
63
|
+
|
|
64
|
+
- `scripts/browser_benchmark.py` used the deprecated `raw_page` attribute,
|
|
65
|
+
producing `DeprecationWarning` on every run.
|
|
66
|
+
- Replaced `page.raw_page.query_selector_all` → `page.backend_page`
|
|
67
|
+
- Replaced `page.raw_page.set_viewport_size` → `page.backend_page`
|
|
68
|
+
|
|
69
|
+
### Version metadata
|
|
70
|
+
|
|
71
|
+
- `pyproject.toml`, `__init__.py`, doc headers, test assertions bumped
|
|
72
|
+
to `2.1.1`.
|
|
73
|
+
|
|
10
74
|
## [2.1.0] — 2026-06-16
|
|
11
75
|
|
|
12
76
|
### Overview
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superbrowser-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.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,195 @@
|
|
|
1
|
+
# Track D — API Ergonomics Audit
|
|
2
|
+
|
|
3
|
+
> **v2.1.1 baseline** — 2026-06-16
|
|
4
|
+
>
|
|
5
|
+
> Discovery document for the v2.2 "API Ergonomics" track.
|
|
6
|
+
> No code changes in this audit — findings only.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Methodology
|
|
11
|
+
|
|
12
|
+
Systematic inspection of:
|
|
13
|
+
|
|
14
|
+
1. Public API surface (`__all__`, signatures, return types)
|
|
15
|
+
2. CLI help output, command naming, option consistency
|
|
16
|
+
3. Testing utilities (`E2EContext`, `MockLLMClient`, report builders)
|
|
17
|
+
4. Documentation (quickstart, API reference, architecture, examples)
|
|
18
|
+
5. Migration remnants from v1.x → v2.0
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Findings
|
|
23
|
+
|
|
24
|
+
### Bucket 1 — Patch-safe (docs, help text, examples, aliases)
|
|
25
|
+
|
|
26
|
+
These changes are safe to ship without any risk to existing code.
|
|
27
|
+
|
|
28
|
+
#### 1.1 Stale `SuperBrowserConfig` in API reference
|
|
29
|
+
|
|
30
|
+
`docs/api-reference.md` still references `SuperBrowserConfig` in three
|
|
31
|
+
places — a class removed in v2.0:
|
|
32
|
+
|
|
33
|
+
- Line 45: constructor signature shows `config: Optional[SuperBrowserConfig]`
|
|
34
|
+
- Line 54: parameter table lists `SuperBrowserConfig | None`
|
|
35
|
+
- Line 631: `AgentConfig.core` field table references `SuperBrowserConfig`
|
|
36
|
+
|
|
37
|
+
**Fix:** Replace all `SuperBrowserConfig` → `Config` in the API reference.
|
|
38
|
+
|
|
39
|
+
#### 1.2 Inconsistent import paths in examples and quickstart
|
|
40
|
+
|
|
41
|
+
The top-level package exports `SuperBrowser`, `Config`, `ActionResult`,
|
|
42
|
+
`StreamEvent`, and `create_llm` via `__all__`. But examples and docs use
|
|
43
|
+
inconsistent deep-import paths:
|
|
44
|
+
|
|
45
|
+
| Canonical (top-level) | Deep import used in docs/examples |
|
|
46
|
+
|:----------------------|:----------------------------------|
|
|
47
|
+
| `from super_browser import SuperBrowser` | `from super_browser.agent.facade import SuperBrowser` |
|
|
48
|
+
| `from super_browser import create_llm` | `from super_browser.agent.llm.factory import create_llm` |
|
|
49
|
+
| `from super_browser import Config` | `from super_browser.config import Config` |
|
|
50
|
+
|
|
51
|
+
Files affected:
|
|
52
|
+
- `examples/basic_usage.py`
|
|
53
|
+
- `examples/budget_tracking.py`
|
|
54
|
+
- `examples/error_handling.py`
|
|
55
|
+
- `examples/multi_tab_workflow.py`
|
|
56
|
+
- `examples/session_persistence.py`
|
|
57
|
+
- `docs/quickstart.md` (multiple sections)
|
|
58
|
+
|
|
59
|
+
**Fix:** Standardize all examples and quickstart to use top-level imports.
|
|
60
|
+
|
|
61
|
+
#### 1.3 Quickstart verification command uses deep import
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Current (deep import):
|
|
65
|
+
python -c "from super_browser.agent.facade import SuperBrowser; print('OK')"
|
|
66
|
+
|
|
67
|
+
# Should be:
|
|
68
|
+
python -c "from super_browser import SuperBrowser; print('OK')"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### 1.4 `raw_page` deprecation message is stale
|
|
72
|
+
|
|
73
|
+
The `DeprecationWarning` says:
|
|
74
|
+
|
|
75
|
+
> `raw_page is deprecated, use backend_page instead. Will be removed in v2.1.`
|
|
76
|
+
|
|
77
|
+
We are in v2.1.1. Either:
|
|
78
|
+
|
|
79
|
+
- **(a)** Update the message to say "Will be removed in v2.2" (defer)
|
|
80
|
+
- **(b)** Actually remove `raw_page` (breaking, see Bucket 3)
|
|
81
|
+
|
|
82
|
+
Recommendation: **(a)** — update the message, defer removal.
|
|
83
|
+
|
|
84
|
+
#### 1.5 CLI has no `python -m super_browser` entry point
|
|
85
|
+
|
|
86
|
+
Neither `python -m super_browser` nor `python -m super_browser.cli` works —
|
|
87
|
+
only the `superbrowser` console script does. Adding a `__main__.py` is a
|
|
88
|
+
common user expectation and trivially safe.
|
|
89
|
+
|
|
90
|
+
**Fix:** Add `src/super_browser/__main__.py` that calls `cli.main()`.
|
|
91
|
+
|
|
92
|
+
#### 1.6 CLI `result-demo` command is internal-looking
|
|
93
|
+
|
|
94
|
+
`result-demo` is a demonstration command that has no production use.
|
|
95
|
+
It clutters the top-level help output. Consider hiding it from the main
|
|
96
|
+
help listing or moving it to a `--debug` subgroup.
|
|
97
|
+
|
|
98
|
+
**Fix:** Remove from help listing (keep functional for backward compat).
|
|
99
|
+
|
|
100
|
+
#### 1.7 CLI `stealth-check` vs `stealth-validate` naming is confusing
|
|
101
|
+
|
|
102
|
+
Two similarly named commands with different purposes:
|
|
103
|
+
|
|
104
|
+
| Command | Purpose |
|
|
105
|
+
|:--------|:--------|
|
|
106
|
+
| `stealth-check` | Offline fingerprint scoring + report |
|
|
107
|
+
| `stealth-validate` | Fingerprint validation against baselines + CI mode |
|
|
108
|
+
|
|
109
|
+
**Fix:** Clarify in help text. Renaming would be a breaking change (defer).
|
|
110
|
+
|
|
111
|
+
### Bucket 2 — Backward-compatible polish
|
|
112
|
+
|
|
113
|
+
These add convenience without breaking existing code.
|
|
114
|
+
|
|
115
|
+
#### 2.1 `create_llm` should be in `__all__` already (confirmed OK)
|
|
116
|
+
|
|
117
|
+
Verified — `create_llm` is already exported at top level. No action needed.
|
|
118
|
+
|
|
119
|
+
#### 2.2 `ActionResult.ok` could have a boolean alias property
|
|
120
|
+
|
|
121
|
+
`ActionResult` uses `.ok` for success/failure. Some users may expect `.success`
|
|
122
|
+
or `.is_ok`. Currently only `.ok` exists. Adding a read-only property alias is
|
|
123
|
+
backward-compatible.
|
|
124
|
+
|
|
125
|
+
**Decision:** Low value, skip unless explicitly requested.
|
|
126
|
+
|
|
127
|
+
#### 2.3 `Config.from_env()` is not in quickstart's verification flow
|
|
128
|
+
|
|
129
|
+
The quickstart shows `Config.from_env()` but doesn't show how to verify it
|
|
130
|
+
succeeded without an LLM API key (validation will report a missing key).
|
|
131
|
+
|
|
132
|
+
**Fix:** Add a note in quickstart that `validate()` returns errors but doesn't
|
|
133
|
+
raise, and that the missing-API-key error is expected for browser-only use.
|
|
134
|
+
|
|
135
|
+
#### 2.4 Testing utilities could export `build_e2e_json_report` at a stable path
|
|
136
|
+
|
|
137
|
+
`build_e2e_json_report` is in `super_browser.testing` — good. But the E2E
|
|
138
|
+
schema v3 validator (`scripts/validate_e2e_report.py`) is not importable.
|
|
139
|
+
If users want to validate reports programmatically, they'd need to run the
|
|
140
|
+
script. Consider extracting the validator into an importable function.
|
|
141
|
+
|
|
142
|
+
**Decision:** Defer unless external consumers request it.
|
|
143
|
+
|
|
144
|
+
### Bucket 3 — Defer / avoid (risk to v2.x stability)
|
|
145
|
+
|
|
146
|
+
#### 3.1 Removing `raw_page` alias entirely
|
|
147
|
+
|
|
148
|
+
The migration doc said it would be removed in v2.1, but it still works with
|
|
149
|
+
a deprecation warning. Removing it would break any v1.x code that hasn't
|
|
150
|
+
migrated. Since v2.0 just shipped, defer to v3.0.
|
|
151
|
+
|
|
152
|
+
**Decision:** Defer. Update deprecation message to say "v3.0" instead.
|
|
153
|
+
|
|
154
|
+
#### 3.2 Removing legacy `core` sub-dict compat in `_build_agent()`
|
|
155
|
+
|
|
156
|
+
`_build_agent()` still merges a legacy `core` sub-dict for v1.x backward
|
|
157
|
+
compatibility. Removing it would break old YAML/dict configs. Defer.
|
|
158
|
+
|
|
159
|
+
**Decision:** Defer. No urgency — the compat path is ~5 lines of code.
|
|
160
|
+
|
|
161
|
+
#### 3.3 Renaming CLI commands
|
|
162
|
+
|
|
163
|
+
Renaming `stealth-check` → `stealth-score` or `stealth-validate` →
|
|
164
|
+
`stealth-baseline` would improve clarity but break scripts/automation.
|
|
165
|
+
|
|
166
|
+
**Decision:** Defer to a major version if at all.
|
|
167
|
+
|
|
168
|
+
#### 3.4 Removing `result-demo` CLI command
|
|
169
|
+
|
|
170
|
+
Removing it entirely would break anyone who uses it. Keep it functional
|
|
171
|
+
but hide from help (Bucket 1.6).
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Summary
|
|
176
|
+
|
|
177
|
+
| Bucket | Items | Risk | Recommended PR |
|
|
178
|
+
|:-------|------:|:-----|:---------------|
|
|
179
|
+
| **Patch-safe** | 7 | None | PR #163 |
|
|
180
|
+
| **Backward-compatible polish** | 4 | Minimal | Optional |
|
|
181
|
+
| **Defer** | 4 | Breaking | v3.0 |
|
|
182
|
+
|
|
183
|
+
### Recommended PR #163 scope (patch-safe only)
|
|
184
|
+
|
|
185
|
+
1. Fix `SuperBrowserConfig` → `Config` in API reference (3 occurrences)
|
|
186
|
+
2. Standardize examples to use top-level imports
|
|
187
|
+
3. Standardize quickstart to use top-level imports
|
|
188
|
+
4. Fix quickstart verification command
|
|
189
|
+
5. Update `raw_page` deprecation message to "v3.0"
|
|
190
|
+
6. Add `__main__.py` for `python -m super_browser` support
|
|
191
|
+
7. Hide `result-demo` from CLI help listing
|
|
192
|
+
8. Clarify `stealth-check` vs `stealth-validate` help text
|
|
193
|
+
|
|
194
|
+
All items are documentation, help text, or additive-only code changes.
|
|
195
|
+
No public API signatures change.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# API Reference
|
|
2
2
|
|
|
3
|
-
> **Super Browser** v2.
|
|
3
|
+
> **Super Browser** v2.2.0 — Complete public API documentation.
|
|
4
4
|
|
|
5
5
|
This reference covers every public class, method, and function in Super Browser. Classes are grouped by subsystem.
|
|
6
6
|
|
|
@@ -42,7 +42,7 @@ The primary entry point for all browser automation. Wraps the agent loop, stealt
|
|
|
42
42
|
|
|
43
43
|
```python
|
|
44
44
|
class SuperBrowser(
|
|
45
|
-
config: Optional[
|
|
45
|
+
config: Optional[Config] = None,
|
|
46
46
|
*,
|
|
47
47
|
tool_registry: Optional[ToolRegistry] = None,
|
|
48
48
|
llm_client: Optional[LLMClient] = None,
|
|
@@ -51,7 +51,7 @@ class SuperBrowser(
|
|
|
51
51
|
|
|
52
52
|
| Parameter | Type | Default | Description |
|
|
53
53
|
|---|---|---|---|
|
|
54
|
-
| `config` | `
|
|
54
|
+
| `config` | `Config \| None` | `None` | Agent configuration. Uses defaults when `None`. |
|
|
55
55
|
| `tool_registry` | `ToolRegistry \| None` | `None` | Custom tool registry. Creates a default registry when `None`. |
|
|
56
56
|
| `llm_client` | `LLMClient \| None` | `None` | LLM client for `act()` calls. **Required** for `act()`. |
|
|
57
57
|
|
|
@@ -628,7 +628,7 @@ if errors:
|
|
|
628
628
|
| `llm_provider` | `str` | `"anthropic"` | LLM provider: `"anthropic"` or `"openai"`. |
|
|
629
629
|
| `llm_model` | `str` | `"claude-sonnet-4-20250514"` | Model identifier. |
|
|
630
630
|
| `llm_api_key` | `str` | `""` | API key for the chosen provider. |
|
|
631
|
-
|
|
631
|
+
|
|
632
632
|
|
|
633
633
|
#### `TracingConfig`
|
|
634
634
|
|
|
@@ -26,7 +26,7 @@ pip install superbrowser-sdk[patchright]
|
|
|
26
26
|
Verify the installation:
|
|
27
27
|
|
|
28
28
|
```python
|
|
29
|
-
python -c "from super_browser
|
|
29
|
+
python -c "from super_browser import SuperBrowser; print('OK')"
|
|
30
30
|
# OK
|
|
31
31
|
```
|
|
32
32
|
|
|
@@ -68,7 +68,7 @@ Create `my_first_browser.py`:
|
|
|
68
68
|
"""5-minute Super Browser quickstart."""
|
|
69
69
|
|
|
70
70
|
import asyncio
|
|
71
|
-
from super_browser
|
|
71
|
+
from super_browser import SuperBrowser
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
class MockLLMClient:
|
|
@@ -151,7 +151,7 @@ export SB_DAILY_BUDGET=5.0
|
|
|
151
151
|
> browser is less detectable than headless).
|
|
152
152
|
|
|
153
153
|
```python
|
|
154
|
-
from super_browser
|
|
154
|
+
from super_browser import Config
|
|
155
155
|
|
|
156
156
|
config = Config.from_env()
|
|
157
157
|
errors = config.validate()
|
|
@@ -178,7 +178,7 @@ tracing:
|
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
```python
|
|
181
|
-
from super_browser
|
|
181
|
+
from super_browser import Config
|
|
182
182
|
|
|
183
183
|
config = Config.from_yaml("super-browser.yaml")
|
|
184
184
|
```
|
|
@@ -186,7 +186,7 @@ config = Config.from_yaml("super-browser.yaml")
|
|
|
186
186
|
### Option C: Dictionary
|
|
187
187
|
|
|
188
188
|
```python
|
|
189
|
-
from super_browser
|
|
189
|
+
from super_browser import Config
|
|
190
190
|
|
|
191
191
|
config = Config.from_dict({
|
|
192
192
|
"agent": {
|
|
@@ -205,7 +205,7 @@ config = Config.from_dict({
|
|
|
205
205
|
With a real API key, create an LLM client directly:
|
|
206
206
|
|
|
207
207
|
```python
|
|
208
|
-
from super_browser
|
|
208
|
+
from super_browser import create_llm
|
|
209
209
|
|
|
210
210
|
# Explicit
|
|
211
211
|
llm = create_llm(provider="anthropic", model="claude-sonnet-4-20250514", api_key="sk-ant-...")
|
|
@@ -12,7 +12,7 @@ import asyncio
|
|
|
12
12
|
import logging
|
|
13
13
|
|
|
14
14
|
from super_browser import Config
|
|
15
|
-
from super_browser
|
|
15
|
+
from super_browser import SuperBrowser
|
|
16
16
|
from super_browser.browser.config import SessionConfig
|
|
17
17
|
|
|
18
18
|
logging.basicConfig(level=logging.INFO, format="%(name)s %(levelname)s %(message)s")
|
|
@@ -18,7 +18,7 @@ import asyncio
|
|
|
18
18
|
import logging
|
|
19
19
|
from pathlib import Path
|
|
20
20
|
|
|
21
|
-
from super_browser
|
|
21
|
+
from super_browser import SuperBrowser
|
|
22
22
|
from super_browser.agent.llm.protocol import LLMClient
|
|
23
23
|
from super_browser.budget.governor import TokenBudgetGovernor
|
|
24
24
|
from super_browser.budget.types import (
|
|
@@ -12,7 +12,7 @@ Run:
|
|
|
12
12
|
import asyncio
|
|
13
13
|
import logging
|
|
14
14
|
|
|
15
|
-
from super_browser
|
|
15
|
+
from super_browser import SuperBrowser
|
|
16
16
|
from super_browser.results.types import FailureCategory
|
|
17
17
|
|
|
18
18
|
logging.basicConfig(level=logging.INFO, format="%(name)s %(levelname)s %(message)s")
|
|
@@ -11,7 +11,7 @@ Run:
|
|
|
11
11
|
import asyncio
|
|
12
12
|
import logging
|
|
13
13
|
|
|
14
|
-
from super_browser
|
|
14
|
+
from super_browser import SuperBrowser
|
|
15
15
|
|
|
16
16
|
logging.basicConfig(level=logging.INFO, format="%(name)s %(levelname)s %(message)s")
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
@@ -12,7 +12,7 @@ Run:
|
|
|
12
12
|
import asyncio
|
|
13
13
|
import logging
|
|
14
14
|
|
|
15
|
-
from super_browser
|
|
15
|
+
from super_browser import SuperBrowser
|
|
16
16
|
|
|
17
17
|
logging.basicConfig(level=logging.INFO, format="%(name)s %(levelname)s %(message)s")
|
|
18
18
|
logger = logging.getLogger(__name__)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "superbrowser-sdk"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.2.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" }
|
|
@@ -204,7 +204,7 @@ async def _bench_dom_query(base_url: str, runs: int) -> dict[str, Any]:
|
|
|
204
204
|
samples: list[float] = []
|
|
205
205
|
for _ in range(runs):
|
|
206
206
|
t0 = time.monotonic()
|
|
207
|
-
await page.query_selector_all("div")
|
|
207
|
+
await page.backend_page.query_selector_all("div")
|
|
208
208
|
elapsed = (time.monotonic() - t0) * 1000
|
|
209
209
|
samples.append(round(elapsed, 3))
|
|
210
210
|
await page.close()
|
|
@@ -244,7 +244,7 @@ async def _bench_screenshot(base_url: str, runs: int) -> dict[str, Any]:
|
|
|
244
244
|
try:
|
|
245
245
|
page = await engine.new_page()
|
|
246
246
|
await page.goto(f"{base_url}/simple.html", wait_until="load")
|
|
247
|
-
await page.
|
|
247
|
+
await page.backend_page.set_viewport_size({"width": 1280, "height": 720})
|
|
248
248
|
samples: list[float] = []
|
|
249
249
|
for _ in range(runs):
|
|
250
250
|
t0 = time.monotonic()
|
|
@@ -95,8 +95,9 @@ def run_smoke(
|
|
|
95
95
|
checks: list[dict[str, Any]] = []
|
|
96
96
|
started = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
|
|
97
97
|
|
|
98
|
-
# Determine install spec
|
|
99
|
-
|
|
98
|
+
# Determine install spec — extras go before version: dist[extra]==version
|
|
99
|
+
version_suffix = f"=={version}" if version else ""
|
|
100
|
+
install_spec = f"{dist}{version_suffix}" # for display only
|
|
100
101
|
|
|
101
102
|
with tempfile.TemporaryDirectory(prefix="sb_smoke_") as tmpdir:
|
|
102
103
|
tmp = Path(tmpdir)
|
|
@@ -114,10 +115,10 @@ def run_smoke(
|
|
|
114
115
|
|
|
115
116
|
# Install [all]
|
|
116
117
|
rc, out, err = _run(
|
|
117
|
-
[str(venv_python), "-m", "pip", "install", f"{
|
|
118
|
+
[str(venv_python), "-m", "pip", "install", f"{dist}[all]{version_suffix}"],
|
|
118
119
|
timeout=180,
|
|
119
120
|
)
|
|
120
|
-
checks.append(_check_result(f"install_all ({
|
|
121
|
+
checks.append(_check_result(f"install_all ({dist}[all]{version_suffix})", rc, out, err))
|
|
121
122
|
if rc != 0:
|
|
122
123
|
# No point continuing if base install fails
|
|
123
124
|
report = _build_report(started, install_spec, checks)
|
|
@@ -145,17 +146,17 @@ def run_smoke(
|
|
|
145
146
|
|
|
146
147
|
# Verify [patchright] extra installs without conflict
|
|
147
148
|
rc, out, err = _run(
|
|
148
|
-
[str(venv_python), "-m", "pip", "install", f"{
|
|
149
|
+
[str(venv_python), "-m", "pip", "install", f"{dist}[patchright]{version_suffix}"],
|
|
149
150
|
timeout=180,
|
|
150
151
|
)
|
|
151
|
-
checks.append(_check_result(f"install_patchright ({
|
|
152
|
+
checks.append(_check_result(f"install_patchright ({dist}[patchright]{version_suffix})", rc, out, err))
|
|
152
153
|
|
|
153
154
|
# Verify [playwright] extra installs without conflict
|
|
154
155
|
rc, out, err = _run(
|
|
155
|
-
[str(venv_python), "-m", "pip", "install", f"{
|
|
156
|
+
[str(venv_python), "-m", "pip", "install", f"{dist}[playwright]{version_suffix}"],
|
|
156
157
|
timeout=180,
|
|
157
158
|
)
|
|
158
|
-
checks.append(_check_result(f"install_playwright ({
|
|
159
|
+
checks.append(_check_result(f"install_playwright ({dist}[playwright]{version_suffix})", rc, out, err))
|
|
159
160
|
|
|
160
161
|
# Version match check (if version was specified)
|
|
161
162
|
if version and installed_version:
|
|
@@ -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.2.0"
|
|
10
10
|
|
|
11
11
|
__all__ = [
|
|
12
12
|
"SuperBrowser",
|
|
@@ -84,12 +84,12 @@ class PageHandle:
|
|
|
84
84
|
"""Deprecated alias for :attr:`backend_page`.
|
|
85
85
|
|
|
86
86
|
.. deprecated:: 2.0
|
|
87
|
-
Use :attr:`backend_page` instead. Will be removed in
|
|
87
|
+
Use :attr:`backend_page` instead. Will be removed in v3.0.
|
|
88
88
|
"""
|
|
89
89
|
import warnings
|
|
90
90
|
warnings.warn(
|
|
91
91
|
"raw_page is deprecated, use backend_page instead. "
|
|
92
|
-
"Will be removed in
|
|
92
|
+
"Will be removed in v3.0.",
|
|
93
93
|
DeprecationWarning,
|
|
94
94
|
stacklevel=2,
|
|
95
95
|
)
|
|
@@ -11,10 +11,10 @@ Commands:
|
|
|
11
11
|
script — Execute a YAML script file
|
|
12
12
|
replay — Replay a recording JSON file
|
|
13
13
|
act — Run a one-shot agent instruction
|
|
14
|
-
stealth-check — Run
|
|
15
|
-
stealth-validate —
|
|
14
|
+
stealth-check — Run offline fingerprint scoring and report
|
|
15
|
+
stealth-validate — Validate fingerprint against baselines (CI/regression mode)
|
|
16
16
|
memory — Manage per-domain agent memory
|
|
17
|
-
result-demo —
|
|
17
|
+
result-demo — Internal: result-type demo (not a primary command)
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
@@ -77,13 +77,13 @@ def main() -> None:
|
|
|
77
77
|
act_parser.add_argument("--max-steps", type=int, default=50, help="Max agent steps (default: 50)")
|
|
78
78
|
|
|
79
79
|
# stealth-check
|
|
80
|
-
stealth_check = sub.add_parser("stealth-check", help="Run
|
|
80
|
+
stealth_check = sub.add_parser("stealth-check", help="Run offline fingerprint scoring and report")
|
|
81
81
|
stealth_check.add_argument("--online", action="store_true", default=False, help="Run in online mode (requires browser)")
|
|
82
82
|
stealth_check.add_argument("--format", default="markdown", choices=["markdown", "html"], help="Report format (default: markdown)")
|
|
83
83
|
stealth_check.add_argument("--threshold", type=int, default=70, help="Pass threshold (default: 70)")
|
|
84
84
|
|
|
85
85
|
# stealth-validate
|
|
86
|
-
sv_parser = sub.add_parser("stealth-validate", help="
|
|
86
|
+
sv_parser = sub.add_parser("stealth-validate", help="Validate fingerprint against baselines (CI/regression mode)")
|
|
87
87
|
sv_parser.add_argument("--profile", default=None, help="Device profile ID")
|
|
88
88
|
sv_parser.add_argument("--seed", default=None, help="Seed for matrix derivation")
|
|
89
89
|
sv_parser.add_argument("--baseline-dir", default=None, help="Baseline directory")
|
|
@@ -105,8 +105,8 @@ def main() -> None:
|
|
|
105
105
|
memory_prune.add_argument("--dir", default=None, help="Memory directory")
|
|
106
106
|
memory_prune.add_argument("--ttl", type=int, default=30, help="TTL in days (default: 30)")
|
|
107
107
|
|
|
108
|
-
# result-demo
|
|
109
|
-
json_parser = sub.add_parser("result-demo", help="
|
|
108
|
+
# result-demo (internal — not a primary command, kept for backward compat)
|
|
109
|
+
json_parser = sub.add_parser("result-demo", help="internal: result-type demo")
|
|
110
110
|
json_parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
111
111
|
json_parser.add_argument("--fail", action="store_true", help="Generate a failure result")
|
|
112
112
|
json_parser.add_argument("--stale", action="store_true", help="Generate a stale-ref failure")
|
|
@@ -40,9 +40,9 @@ class TestV194APIReference:
|
|
|
40
40
|
def test_api_reference_version_header(self) -> None:
|
|
41
41
|
first_lines = Path("./docs/api-reference.md").read_text(encoding="utf-8").split("\n")[:5]
|
|
42
42
|
joined = "\n".join(first_lines)
|
|
43
|
-
assert "v2.
|
|
43
|
+
assert "v2.2.0" in joined
|
|
44
44
|
|
|
45
45
|
def test_architecture_version_header(self) -> None:
|
|
46
46
|
first_lines = Path("./docs/architecture.md").read_text(encoding="utf-8").split("\n")[:5]
|
|
47
47
|
joined = "\n".join(first_lines)
|
|
48
|
-
assert "v2.
|
|
48
|
+
assert "v2.2.0" in joined
|
|
@@ -118,3 +118,10 @@ class TestCLIEntryPoint:
|
|
|
118
118
|
# The package __file__ should point to __init__.py, not cli.py
|
|
119
119
|
assert cli.__file__.endswith("__init__.py")
|
|
120
120
|
assert "cli.py" not in cli.__file__
|
|
121
|
+
|
|
122
|
+
def test_module_entry_point_exists(self) -> None:
|
|
123
|
+
"""`python -m super_browser` works via `__main__.py`."""
|
|
124
|
+
import super_browser.__main__ as main_mod
|
|
125
|
+
|
|
126
|
+
assert hasattr(main_mod, "main")
|
|
127
|
+
assert callable(main_mod.main)
|