superbrowser-sdk 2.0.2__tar.gz → 2.1.1__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.1/.github/workflows/benchmark.yml +49 -0
- superbrowser_sdk-2.1.1/.github/workflows/e2e.yml +62 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/.github/workflows/publish.yml +4 -1
- superbrowser_sdk-2.1.1/.github/workflows/smoke.yml +74 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/.gitignore +13 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/CHANGELOG.md +87 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/PKG-INFO +1 -1
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/api-reference.md +1 -1
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/architecture.md +1 -1
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/fingerprint-scoring.md +3 -3
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/fingerprint-validation.md +5 -5
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/memory.md +4 -4
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/quickstart.md +74 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/pyproject.toml +1 -1
- superbrowser_sdk-2.1.1/scripts/browser_benchmark.py +483 -0
- superbrowser_sdk-2.1.1/scripts/e2e_trend.py +307 -0
- superbrowser_sdk-2.1.1/scripts/smoke_published.py +263 -0
- superbrowser_sdk-2.1.1/scripts/validate_e2e_report.py +263 -0
- superbrowser_sdk-2.1.1/scripts/verify_release_artifact.py +306 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/__init__.py +1 -1
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/cli/interactive.py +1 -1
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/testing.py +58 -30
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/conftest.py +83 -6
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v194_features.py +2 -2
- superbrowser_sdk-2.1.1/tests/test_benchmarks/test_browser_benchmark.py +447 -0
- superbrowser_sdk-2.1.1/tests/test_e2e/test_report_schema.py +359 -0
- superbrowser_sdk-2.1.1/tests/test_e2e/test_trend.py +395 -0
- superbrowser_sdk-2.1.1/tests/test_release/test_naming_consistency.py +112 -0
- superbrowser_sdk-2.1.1/tests/test_release/test_smoke_published.py +318 -0
- superbrowser_sdk-2.1.1/tests/test_release/test_verify_artifact.py +133 -0
- superbrowser_sdk-2.1.1/tests/test_stealth/test_e2e_lifecycle.py +454 -0
- superbrowser_sdk-2.1.1/tests/test_stealth/test_e2e_reporting.py +193 -0
- superbrowser_sdk-2.0.2/scripts/browser_benchmark.py +0 -555
- superbrowser_sdk-2.0.2/tests/test_stealth/test_e2e_lifecycle.py +0 -220
- superbrowser_sdk-2.0.2/tests/test_stealth/test_e2e_reporting.py +0 -110
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/.env.example +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/.github/workflows/dco.yml +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/.github/workflows/test.yml +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/.pre-commit-config.yaml +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/CONTRIBUTING.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/Dockerfile +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/LICENSE +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/README.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/Super-Browser.png +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/00-SOURCE-INVENTORY.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/01-TRIAGE-QUEUE.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/AGENT-BROWSER-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/AGENT-S-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/BROWSER-HARNESS-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/BROWSER-USE-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/CROSS-PROJECT-SYNTHESIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/FIRECRAWL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/GAP-INVENTORY.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/HERMES-AGENT-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/HERMES-SELF-EVOLUTION-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/HTTPMORPH-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/IMPLEMENTATION-ROADMAP.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/LAVAGUE-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/OPENCLAW-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/PATCHRIGHT-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/PROJECT-CONFIG.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/SESSION-STATE.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/SKYVERN-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/STAGEHAND-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/UI-TARS-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/UI-TARS-DESKTOP-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/CHROMECLAW-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/CLAW-VARIANTS-ASSESSMENT.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/E2B-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/EVOSKILL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/GO-INFRA-ASSESSMENT.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/GUARDRAILS-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/KHOJ-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/LETTA-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/MCP-AGENT-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/MCP-ZERO-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/MEM0-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/OPENFGA-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/SKYLL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/TEMPORAL-ANALYSIS.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/analysis/output/TOOL-BENCHMARK-ASSESSMENT.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/benchmarks/fixtures/behavioral.html +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/benchmarks/fixtures/dom-heavy.html +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/benchmarks/fixtures/form.html +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/benchmarks/fixtures/simple.html +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/conftest.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docker-compose.yml +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/agent-reliability.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/anti-detection-ejecta.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/api-stability.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/behavioral-synthesis.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/browser-networking.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/cloak-integration.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/consistency-engine.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/discovery/DISCOVERY-REPORT.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/error-catalog.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/gap-analysis.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/human-behavior.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/migration/v1-to-v2.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/migration/v1.8-to-v1.9.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/operating-doctrine.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/platform-abstraction.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/plugins.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/recording.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/README.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/v2-decomposition.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/docs/stealth-coverage.md +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/backend_selection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/basic_usage.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/budget_tracking.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/cloak_stealth.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/error_handling.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/fingerprint_scan.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/human_behavior.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/multi_tab_workflow.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/session_persistence.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/examples/stealth_mode.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/labels/config.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/scripts/agent_efficiency_benchmark.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/scripts/run_stealth_gauntlet.sh +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/debug.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/delegator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/facade.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/anthropic_client.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/browser_transport.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/budget_aware.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/factory.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/openai_client.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/llm/protocol.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/loop.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/loop_detector.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/plugins.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/registry.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/router.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/structured_logging.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/agent/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/bezier.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/dwell.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/fitts.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/gauss.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/keyboard.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/mouse.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/navigation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/orchestrator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/prng.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/qwerty.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/scroll.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/session_seed.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/behavioral/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/backends/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/backends/cdp_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/backends/patchright_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/backends/playwright_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/backends/selenium_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/cdp.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/cloak_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/cloud.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/discovery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/engine.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/fetch.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/injectors/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/injectors/page_injector.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/page.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/session.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/shutdown.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/browser/tabs.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/cascade.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/client.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/compressor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/cost_estimator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/credential_pool.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/governor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/budget/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/cli/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/cli/commands.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/cli/script.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/events/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/events/bus.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/events/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/cache.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/controller.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/decorator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/presets.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/recovery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/snapshot.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/interaction/vision.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/memory/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/memory/integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/memory/store.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/memory/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/plugins/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/plugins/decorators.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/plugins/hooks.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/py.typed +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recording/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recording/persistence.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recording/recorder.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recording/replayer.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recording/report.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recording/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/checkpoint.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/classifier.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/coordinator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/event_bus.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/format_validator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/reflection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/retry_tracker.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/session_recovery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/recovery/watchdogs.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/results/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/results/output.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/results/typed.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/results/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/results/validation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/action_redaction.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/approval.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/credential_vault.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/domain_filter.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/gate.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/injection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/manager.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/policy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/redactor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/security/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/session/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/session/proxy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/skills/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/skills/activation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/skills/markdown.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/skills/registry.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/skills/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/action_policy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/captcha.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/challenges/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/challenges/cache.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/challenges/pow.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/challenges/turnstile.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/dag.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/derive.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/errors.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/inject.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/matrix.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/prng.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rule.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/diagnostics.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/audio.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/canvas.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/registry.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/timing.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/fingerprint_score.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/headers.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/human.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/human_config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/ip_reputation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/manager.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/host_detect.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/profiles/schema.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/proxy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/proxy_pool.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/report.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/scoring.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/tls_baselines.json +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/user_agent_pool.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/validation/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/validation/checks.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/validation/harness.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/validation/report.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/stealth/validation/suite.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/cost_analytics.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/flow_logger.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/middleware.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/session_db.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/sinks.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/tracing/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/verification/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/verification/ax_diff.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/verification/hasher.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/verification/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/verification/verifier.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/cache.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/controller.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/coords.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/factory.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/ocr.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/providers.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/src/super_browser/vision/types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/conftest.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/conftest.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_01_example_nav.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_02_google_search.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_03_github_login.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_04_amazon_search.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_05_google_forms.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_06_google_flights.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_08_reddit_spa.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_09_form_complex.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/discovery/test_task_10_signup_flow.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_behavioral_realism.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_challenge_detection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_interaction.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_live_navigation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_multi_tab.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_navigation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e/test_stealth_overhead.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/e2e_v1_3_journey.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/conftest.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_config_composition.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_engine_backends.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_error_paths.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_facade_smoke.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_full_lifecycle.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_multi_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_performance_smoke.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_playwright_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_public_api.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_stealth_abstraction.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v1100_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v150_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v160_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v170_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v180_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v190_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v191_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v192_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v193_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v195_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v1_3_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/integration/test_v1_4_features.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/pattern_validation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/conftest.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_chrome_runtime.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_cli_switches.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_headless_indicators.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_live_sites.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_runtime_enable.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/stealth_detection/test_webdriver.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_action_timeout.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_browser_transport.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_controller_rebinding.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_debug_mode.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_default_tooling.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_delegator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_error_screenshots.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_facade.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_facade_security.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_facade_security_control.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_facade_security_file_tab.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_facade_security_network.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_facade_security_session.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_fail_fast.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_llm.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_llm_budget.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_llm_production.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_llm_streaming.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_loop.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_loop_detector.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_prompt_isolation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_registry.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_retry_budget.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_streaming.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_structured_logging.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_tab_cap.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_task_02.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_agent/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/test_behavioral.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/test_dwell.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/test_human_config_dwell.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/test_navigation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/test_orchestrator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_behavioral/test_session_seed.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_benchmark/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_benchmark/test_efficiency.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_cdp.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_cdp_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_cloak_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_cloak_docs.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_cloak_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_discovery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_engine_protocol.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_fetch.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_injectors.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_page.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_patchright_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_playwright_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_selenium_backend.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_session.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_browser/test_shutdown.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_cascade.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_cascade_governor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_circuit_breaker.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_client.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_compressor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_cost_estimator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_credential_pool.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_governor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_budget/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_cli/test_interactive.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_cli/test_script.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_cli/test_stealth_check.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_cli/test_stealth_validate.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_cli/test_unified_cli.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_audio.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_batch37_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_batch38_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_browser_apis.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_canvas.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_timing.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_ejecta/test_webrtc.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_events/test_event_bus.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_events/test_lifecycle_hooks.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_governance_docs.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_cache.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_controller.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_decorator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_injection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_page_change.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_presets.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_recovery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_snapshot.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_interaction/test_vision.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_memory/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_memory/test_cli_config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_memory/test_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_memory/test_store.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recording/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recording/test_persistence.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recording/test_recorder.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recording/test_replayer.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_checkpoint.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_classifier.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_coordinator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_event_bus.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_format_validator.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_reflection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_retry_tracker.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_session_recovery.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_recovery/test_watchdogs.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/test_batch40_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/test_categories.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/test_output.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/test_typed.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_results/test_validation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_approval.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_credential_vault.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_domain_filter.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_injection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_manager.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_policy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_redaction_pipeline.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_redactor.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_security/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_session/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_session/test_proxy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_skills/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_skills/test_activation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_skills/test_integration.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_skills/test_markdown.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_skills/test_registry.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_skills/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_action_policy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_captcha.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_captcha_resolution.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_challenge_cache.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_challenge_config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_consistency_inject.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_diagnostics.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_fingerprint_score.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_headers.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_human.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_human_behavior_v2.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_ip_reputation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_kasada_detection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_manager.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_network_stealth_config.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_profiles.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_proxy.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_proxy_pool.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_stealth_bridge.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_turnstile_detection.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_user_agent_pool.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_stealth/test_validation.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/test_cost_analytics.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/test_flow_logger.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/test_middleware.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/test_session_db.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/test_sinks.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_tracing/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_verification/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_verification/test_ax_diff.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_verification/test_hasher.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_verification/test_types.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_verification/test_verifier.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/__init__.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_cache.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_controller.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_coords.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_factory.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_ocr.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_providers.py +0 -0
- {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.1}/tests/test_vision/test_types.py +0 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: Benchmark
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
iterations:
|
|
7
|
+
description: "Iterations per metric"
|
|
8
|
+
required: false
|
|
9
|
+
default: "5"
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
benchmark:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 10
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
|
|
22
|
+
- name: Install package with patchright
|
|
23
|
+
run: pip install -e ".[dev,patchright]"
|
|
24
|
+
|
|
25
|
+
- name: Install browser
|
|
26
|
+
run: python -m patchright install chromium
|
|
27
|
+
|
|
28
|
+
- name: Install OS deps for Chromium
|
|
29
|
+
run: |
|
|
30
|
+
sudo apt-get update
|
|
31
|
+
sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \
|
|
32
|
+
libcups2 libdrm2 libdbus-1-3 libxkbcommon0 libatspi2.0-0 libxcomposite1 \
|
|
33
|
+
libxdamage1 libxfixes3 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2
|
|
34
|
+
|
|
35
|
+
- name: Run benchmark
|
|
36
|
+
run: |
|
|
37
|
+
python scripts/browser_benchmark.py \
|
|
38
|
+
--fixtures benchmarks/fixtures \
|
|
39
|
+
--out-dir benchmarks/results \
|
|
40
|
+
--iterations ${{ github.event.inputs.iterations }} \
|
|
41
|
+
--warmup 1
|
|
42
|
+
|
|
43
|
+
- name: Upload benchmark results
|
|
44
|
+
if: always()
|
|
45
|
+
uses: actions/upload-artifact@v4
|
|
46
|
+
with:
|
|
47
|
+
name: benchmark-results
|
|
48
|
+
path: benchmarks/results/
|
|
49
|
+
retention-days: 90
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: E2E Real-Browser Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
live:
|
|
7
|
+
description: "Run live navigation tests (requires network)"
|
|
8
|
+
required: false
|
|
9
|
+
default: "false"
|
|
10
|
+
type: choice
|
|
11
|
+
options:
|
|
12
|
+
- "false"
|
|
13
|
+
- "true"
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
e2e:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
timeout-minutes: 10
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
- uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
|
|
26
|
+
- name: Install package with patchright
|
|
27
|
+
run: pip install -e ".[dev,patchright]"
|
|
28
|
+
|
|
29
|
+
- name: Install browser
|
|
30
|
+
run: python -m patchright install chromium
|
|
31
|
+
|
|
32
|
+
- name: Install OS deps for Chromium
|
|
33
|
+
run: |
|
|
34
|
+
sudo apt-get update
|
|
35
|
+
sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \
|
|
36
|
+
libcups2 libdrm2 libdbus-1-3 libxkbcommon0 libatspi2.0-0 libxcomposite1 \
|
|
37
|
+
libxdamage1 libxfixes3 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2
|
|
38
|
+
|
|
39
|
+
- name: Run E2E tests
|
|
40
|
+
env:
|
|
41
|
+
SB_E2E: "1"
|
|
42
|
+
SB_E2E_LIVE: ${{ github.event.inputs.live == 'true' && '1' || '' }}
|
|
43
|
+
SB_HEADLESS: "1"
|
|
44
|
+
run: |
|
|
45
|
+
python -m pytest tests/e2e/ -v --tb=short
|
|
46
|
+
|
|
47
|
+
- name: Upload E2E reports
|
|
48
|
+
if: always()
|
|
49
|
+
uses: actions/upload-artifact@v4
|
|
50
|
+
with:
|
|
51
|
+
name: e2e-reports
|
|
52
|
+
path: tests/e2e/artifacts/
|
|
53
|
+
retention-days: 30
|
|
54
|
+
|
|
55
|
+
- name: Upload failure screenshots
|
|
56
|
+
if: failure()
|
|
57
|
+
uses: actions/upload-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: e2e-screenshots
|
|
60
|
+
path: tests/e2e/artifacts/*-failure.png
|
|
61
|
+
if-no-files-found: ignore
|
|
62
|
+
retention-days: 14
|
|
@@ -24,9 +24,12 @@ jobs:
|
|
|
24
24
|
- name: Build package
|
|
25
25
|
run: python -m build
|
|
26
26
|
|
|
27
|
-
- name: Verify package
|
|
27
|
+
- name: Verify package (twine)
|
|
28
28
|
run: twine check dist/*
|
|
29
29
|
|
|
30
|
+
- name: Verify release artifact (guard)
|
|
31
|
+
run: python scripts/verify_release_artifact.py dist/superbrowser_sdk-*.whl README.md docs/
|
|
32
|
+
|
|
30
33
|
- name: Publish to PyPI
|
|
31
34
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
32
35
|
# Uses trusted publisher (no API token needed)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
name: Post-Release Smoke
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
# Run daily at 08:00 UTC to catch PyPI-side breakages early
|
|
6
|
+
- cron: "0 8 * * *"
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
version:
|
|
10
|
+
description: "Specific version to smoke test (default: latest)"
|
|
11
|
+
required: false
|
|
12
|
+
default: ""
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
smoke:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
timeout-minutes: 10
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
issues: write
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.12"
|
|
27
|
+
|
|
28
|
+
- name: Run smoke test
|
|
29
|
+
run: |
|
|
30
|
+
ARGS=""
|
|
31
|
+
if [ -n "${{ github.event.inputs.version }}" ]; then
|
|
32
|
+
ARGS="--version ${{ github.event.inputs.version }}"
|
|
33
|
+
fi
|
|
34
|
+
python scripts/smoke_published.py \
|
|
35
|
+
--out smoke-results/smoke-report.json \
|
|
36
|
+
--md smoke-results/smoke-report.md \
|
|
37
|
+
$ARGS
|
|
38
|
+
|
|
39
|
+
- name: Upload smoke report
|
|
40
|
+
if: always()
|
|
41
|
+
uses: actions/upload-artifact@v4
|
|
42
|
+
with:
|
|
43
|
+
name: smoke-report
|
|
44
|
+
path: smoke-results/
|
|
45
|
+
retention-days: 30
|
|
46
|
+
|
|
47
|
+
- name: Open issue on failure
|
|
48
|
+
if: failure() && github.event_name == 'schedule'
|
|
49
|
+
uses: actions/github-script@v7
|
|
50
|
+
with:
|
|
51
|
+
script: |
|
|
52
|
+
const fs = require('fs');
|
|
53
|
+
let report;
|
|
54
|
+
try {
|
|
55
|
+
report = JSON.parse(fs.readFileSync('smoke-results/smoke-report.json', 'utf-8'));
|
|
56
|
+
} catch (e) {
|
|
57
|
+
report = { summary: { failed: 'unknown' } };
|
|
58
|
+
}
|
|
59
|
+
const body = [
|
|
60
|
+
`## Automated Post-Release Smoke Failure`,
|
|
61
|
+
``,
|
|
62
|
+
`**Trigger:** ${{ github.event_name }}`,
|
|
63
|
+
`**Run:** ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}`,
|
|
64
|
+
`**Failed checks:** ${report.summary?.failed ?? 'unknown'}`,
|
|
65
|
+
``,
|
|
66
|
+
`See the [smoke report artifact](../actions/runs/${{ github.run_id }}) for details.`,
|
|
67
|
+
].join('\n');
|
|
68
|
+
await github.rest.issues.create({
|
|
69
|
+
owner: context.repo.owner,
|
|
70
|
+
repo: context.repo.repo,
|
|
71
|
+
title: `🚨 Post-release smoke failure (${new Date().toISOString().split('T')[0]})`,
|
|
72
|
+
body,
|
|
73
|
+
labels: ['bug', 'release'],
|
|
74
|
+
});
|
|
@@ -61,3 +61,16 @@ NUL
|
|
|
61
61
|
sessions/
|
|
62
62
|
sources/
|
|
63
63
|
events.jsonl
|
|
64
|
+
|
|
65
|
+
# E2E test artifacts
|
|
66
|
+
tests/e2e/artifacts/
|
|
67
|
+
|
|
68
|
+
# Benchmark results
|
|
69
|
+
benchmarks/results/
|
|
70
|
+
|
|
71
|
+
# Smoke test results
|
|
72
|
+
smoke-results/
|
|
73
|
+
|
|
74
|
+
# E2E trend artifacts
|
|
75
|
+
tests/e2e/artifacts/e2e-history.json
|
|
76
|
+
tests/e2e/artifacts/e2e-trend.md
|
|
@@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.1.1] — 2026-06-16
|
|
11
|
+
|
|
12
|
+
### Fixed — Smoke workflow install spec format
|
|
13
|
+
|
|
14
|
+
- **Smoke install specs were malformed** (`dist==version[extra]` instead
|
|
15
|
+
of `dist[extra]==version`), causing the post-release smoke workflow
|
|
16
|
+
to fail for any version-targeted run.
|
|
17
|
+
- Affects `[all]`, `[patchright]`, and `[playwright]` install checks in
|
|
18
|
+
`scripts/smoke_published.py`.
|
|
19
|
+
- Found by the v2.1.0 post-release smoke run — exactly the kind of
|
|
20
|
+
packaging bug the workflow was designed to catch.
|
|
21
|
+
- Added `TestInstallSpecFormat` regression test verifying PEP 508
|
|
22
|
+
extras-before-version ordering.
|
|
23
|
+
|
|
24
|
+
### Fixed — Benchmark deprecated API usage
|
|
25
|
+
|
|
26
|
+
- `scripts/browser_benchmark.py` used the deprecated `raw_page` attribute,
|
|
27
|
+
producing `DeprecationWarning` on every run.
|
|
28
|
+
- Replaced `page.raw_page.query_selector_all` → `page.backend_page`
|
|
29
|
+
- Replaced `page.raw_page.set_viewport_size` → `page.backend_page`
|
|
30
|
+
|
|
31
|
+
### Version metadata
|
|
32
|
+
|
|
33
|
+
- `pyproject.toml`, `__init__.py`, doc headers, test assertions bumped
|
|
34
|
+
to `2.1.1`.
|
|
35
|
+
|
|
36
|
+
## [2.1.0] — 2026-06-16
|
|
37
|
+
|
|
38
|
+
### Overview
|
|
39
|
+
|
|
40
|
+
**v2.1.0 — Operational Maturity**
|
|
41
|
+
|
|
42
|
+
v2.1 makes Super Browser easier to operate, validate, benchmark, and
|
|
43
|
+
monitor after release. No new stealth features, no API redesigns —
|
|
44
|
+
this release adds the operational infrastructure needed to trust the
|
|
45
|
+
E2E signal, catch packaging regressions before users do, and track
|
|
46
|
+
performance over time.
|
|
47
|
+
|
|
48
|
+
### Added — Benchmarking (Track A)
|
|
49
|
+
|
|
50
|
+
- Offline real-browser benchmark harness (`scripts/browser_benchmark.py`)
|
|
51
|
+
measuring 9 metrics: browser launch, new page, navigation (simple/form/
|
|
52
|
+
DOM-heavy), DOM query, click+fill, screenshot, and memory delta.
|
|
53
|
+
- Local fixture-backed pages only — no network dependency.
|
|
54
|
+
- JSON schema v1 output with mean/median/min/max/stdev per metric.
|
|
55
|
+
- Markdown report for human-readable consumption.
|
|
56
|
+
- Configurable iterations, warmup, headless mode, backend selection.
|
|
57
|
+
- `timeout_s` enforcement via `asyncio.wait_for` on all operations.
|
|
58
|
+
- Fixture HTTP server cleanup in `try/finally`.
|
|
59
|
+
- Manual `benchmark.yml` workflow (`workflow_dispatch` only, 90-day artifacts).
|
|
60
|
+
|
|
61
|
+
### Added — Release Observability (Track B)
|
|
62
|
+
|
|
63
|
+
- Post-release PyPI smoke workflow (`scripts/smoke_published.py`).
|
|
64
|
+
- Fresh-venv install validation: `[all]`, `[patchright]`, `[playwright]`,
|
|
65
|
+
`import super_browser`, `superbrowser version`, `superbrowser info`.
|
|
66
|
+
- Version match check when `--version` specified.
|
|
67
|
+
- JSON + Markdown smoke report output.
|
|
68
|
+
- Daily scheduled run at 08:00 UTC + manual `workflow_dispatch`.
|
|
69
|
+
- Automatic GitHub issue creation on scheduled failures.
|
|
70
|
+
- Report always written, even on early failures (venv creation, install).
|
|
71
|
+
- Explicit `issues: write` permission for auto-issue behavior.
|
|
72
|
+
|
|
73
|
+
### Added — E2E Reporting (Track C)
|
|
74
|
+
|
|
75
|
+
- **Schema v3**: Formalized E2E report contract with stdlib validator
|
|
76
|
+
(`scripts/validate_e2e_report.py`). Required: `schema_version`,
|
|
77
|
+
`timestamp_utc`, `environment`, `config`, `summary`, `tests`, `artifacts`.
|
|
78
|
+
Per-test entries: `name`, `status`, `duration_s`, `file`, `error`,
|
|
79
|
+
`screenshot`.
|
|
80
|
+
- **Failure metadata**: `error` field populated from `call.excinfo` /
|
|
81
|
+
`report.longrepr`. `screenshot` field populated on failure, attached by
|
|
82
|
+
`nodeid` match. Both nullable for passed/skipped tests.
|
|
83
|
+
- **Historical trend artifacts** (`scripts/e2e_trend.py`): Archives
|
|
84
|
+
validated reports into `e2e-history.json` (max 30 runs, dedup by
|
|
85
|
+
timestamp). Renders `e2e-trend.md` with pass-rate, duration, budget, and
|
|
86
|
+
failure trends.
|
|
87
|
+
- **Lifecycle integration**: Report validation, failure metadata capture,
|
|
88
|
+
and trend generation all wired into `pytest_sessionfinish`.
|
|
89
|
+
|
|
90
|
+
### Operational Safety
|
|
91
|
+
|
|
92
|
+
- No benchmark performance thresholds (measurement only).
|
|
93
|
+
- No E2E regression gates (observational trends).
|
|
94
|
+
- No live tests enabled by default.
|
|
95
|
+
- Default CI unaffected by any new workflow.
|
|
96
|
+
|
|
10
97
|
## [2.0.2] — 2026-06-15
|
|
11
98
|
|
|
12
99
|
### Fixed — CLI entry point (#148)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superbrowser-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.1.1
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# API Reference
|
|
2
2
|
|
|
3
|
-
> **Super Browser** v2.
|
|
3
|
+
> **Super Browser** v2.1.1 — 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
|
|
|
@@ -172,13 +172,13 @@ The `stealth-check` CLI command provides quick fingerprint assessment:
|
|
|
172
172
|
|
|
173
173
|
```bash
|
|
174
174
|
# Offline check (default) — no browser needed
|
|
175
|
-
|
|
175
|
+
superbrowser stealth-check
|
|
176
176
|
|
|
177
177
|
# With options
|
|
178
|
-
|
|
178
|
+
superbrowser stealth-check --format html --threshold 80
|
|
179
179
|
|
|
180
180
|
# Online check — requires live browser
|
|
181
|
-
|
|
181
|
+
superbrowser stealth-check --online
|
|
182
182
|
```
|
|
183
183
|
|
|
184
184
|
### Options
|
|
@@ -30,13 +30,13 @@ The fingerprint validation suite provides 8 cross-surface consistency checks tha
|
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
# Capture baseline for current profile
|
|
33
|
-
|
|
33
|
+
superbrowser stealth-validate --capture-baseline
|
|
34
34
|
|
|
35
35
|
# Run validation against baseline
|
|
36
|
-
|
|
36
|
+
superbrowser stealth-validate --profile windows-chrome-stable --seed my-session
|
|
37
37
|
|
|
38
38
|
# CI mode: exit code 1 on any regression
|
|
39
|
-
|
|
39
|
+
superbrowser stealth-validate --ci
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
## Programmatic Usage
|
|
@@ -62,8 +62,8 @@ for check in report.checks:
|
|
|
62
62
|
|
|
63
63
|
The `--ci` flag compares current results against a saved baseline:
|
|
64
64
|
|
|
65
|
-
1. First run: `
|
|
66
|
-
2. CI run: `
|
|
65
|
+
1. First run: `superbrowser stealth-validate --capture-baseline` saves baseline JSON
|
|
66
|
+
2. CI run: `superbrowser stealth-validate --ci` compares and exits 1 on regression
|
|
67
67
|
3. Baselines stored in `~/.config/super-browser/baselines/{profile_id}.json`
|
|
68
68
|
|
|
69
69
|
A check is a **regression** if it passed in the baseline but fails now. Checks that were already failing are not flagged as regressions.
|
|
@@ -224,16 +224,16 @@ Memory can be managed from the command line:
|
|
|
224
224
|
|
|
225
225
|
```bash
|
|
226
226
|
# List all domains with stored memory
|
|
227
|
-
|
|
227
|
+
superbrowser memory list
|
|
228
228
|
|
|
229
229
|
# Show memory for a specific domain
|
|
230
|
-
|
|
230
|
+
superbrowser memory show shop.example.com
|
|
231
231
|
|
|
232
232
|
# Clear memory for a domain
|
|
233
|
-
|
|
233
|
+
superbrowser memory clear shop.example.com
|
|
234
234
|
|
|
235
235
|
# Prune expired entries
|
|
236
|
-
|
|
236
|
+
superbrowser memory prune
|
|
237
237
|
```
|
|
238
238
|
|
|
239
239
|
---
|
|
@@ -400,3 +400,77 @@ Ensure you have a Chromium-based browser installed:
|
|
|
400
400
|
pip install superbrowser-sdk[patchright]
|
|
401
401
|
python -m patchright install chromium
|
|
402
402
|
```
|
|
403
|
+
|
|
404
|
+
## E2E Tests (Real-Browser)
|
|
405
|
+
|
|
406
|
+
Super Browser ships with an opt-in E2E test suite that exercises real
|
|
407
|
+
browser interactions against local fixture pages. These tests are **not**
|
|
408
|
+
run in default CI — you enable them explicitly.
|
|
409
|
+
|
|
410
|
+
### Prerequisites
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
pip install superbrowser-sdk[patchright]
|
|
414
|
+
python -m patchright install chromium
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Running locally
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
# Run all local E2E tests (headless)
|
|
421
|
+
SB_E2E=1 pytest tests/e2e/
|
|
422
|
+
|
|
423
|
+
# Run with visible browser (debugging)
|
|
424
|
+
SB_E2E=1 SB_HEADLESS=0 pytest tests/e2e/
|
|
425
|
+
|
|
426
|
+
# Include live navigation tests (requires network)
|
|
427
|
+
SB_E2E=1 SB_E2E_LIVE=1 pytest tests/e2e/
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### Environment variables
|
|
431
|
+
|
|
432
|
+
| Variable | Default | Description |
|
|
433
|
+
|:---------|:--------|:-------------|
|
|
434
|
+
| `SB_E2E` | unset | Enables E2E tests. If unset, all tests skip. |
|
|
435
|
+
| `SB_E2E_LIVE` | unset | Enables live navigation tests (external network). |
|
|
436
|
+
| `SB_HEADLESS` | `1` | Set to `0` for headed browser mode (debugging). |
|
|
437
|
+
| `SB_BACKEND` | `patchright` | Browser backend. |
|
|
438
|
+
| `SB_E2E_BUDGET_S` | `120` | Suite-level time budget in seconds. |
|
|
439
|
+
| `SB_E2E_REPORT_DIR` | `tests/e2e/artifacts/` | Report output directory. |
|
|
440
|
+
|
|
441
|
+
### Reports
|
|
442
|
+
|
|
443
|
+
After a run, JSON and Markdown reports are written to
|
|
444
|
+
`tests/e2e/artifacts/`:
|
|
445
|
+
|
|
446
|
+
- `e2e-report.json` — structured results (schema v3, validated)
|
|
447
|
+
- `e2e-report.md` — human-readable summary
|
|
448
|
+
- `{test_name}-failure.png` — screenshots on failure (best-effort)
|
|
449
|
+
|
|
450
|
+
The JSON report follows schema v3. You can validate any report file:
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
python scripts/validate_e2e_report.py tests/e2e/artifacts/e2e-report.json
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
After each E2E run, the trend tracker archives the report summary into
|
|
457
|
+
`e2e-history.json` and renders `e2e-trend.md` showing pass-rate,
|
|
458
|
+
duration, and budget trends across recent runs. You can also run it
|
|
459
|
+
manually:
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
python scripts/e2e_trend.py \
|
|
463
|
+
--reports tests/e2e/artifacts/e2e-report.json \
|
|
464
|
+
--history tests/e2e/artifacts/e2e-history.json \
|
|
465
|
+
--markdown tests/e2e/artifacts/e2e-trend.md \
|
|
466
|
+
--max-runs 30
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### CI integration
|
|
470
|
+
|
|
471
|
+
E2E tests can be triggered manually via GitHub Actions:
|
|
472
|
+
|
|
473
|
+
1. Go to **Actions** → **E2E Real-Browser Tests**
|
|
474
|
+
2. Click **Run workflow**
|
|
475
|
+
3. Optionally enable live tests
|
|
476
|
+
4. Reports are uploaded as workflow artifacts (30-day retention)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "superbrowser-sdk"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.1.1"
|
|
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" }
|