superbrowser-sdk 2.2.1__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- superbrowser_sdk-2.3.0/.github/workflows/adversarial-v3.yml +140 -0
- superbrowser_sdk-2.3.0/.github/workflows/adversarial.yml +117 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/test.yml +1 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.gitignore +11 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/CHANGELOG.md +16 -1
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/PKG-INFO +26 -12
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/README.md +22 -10
- superbrowser_sdk-2.3.0/docs/mcp.md +190 -0
- superbrowser_sdk-2.3.0/docs/stealth-evidence.md +182 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/pyproject.toml +19 -3
- superbrowser_sdk-2.3.0/scripts/adversarial_run.py +360 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/verify_release_artifact.py +7 -1
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/__init__.py +1 -1
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/dwell.py +9 -7
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/navigation.py +25 -6
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/orchestrator.py +17 -4
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/session_seed.py +11 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/config.py +1 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/session.py +11 -4
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/cli/__init__.py +4 -1
- superbrowser_sdk-2.3.0/src/super_browser/mcp_server.py +858 -0
- superbrowser_sdk-2.3.0/tests/adversarial/conftest.py +246 -0
- superbrowser_sdk-2.3.0/tests/adversarial/controlled_server.py +524 -0
- superbrowser_sdk-2.3.0/tests/adversarial/report.py +109 -0
- superbrowser_sdk-2.3.0/tests/adversarial/scoring.py +224 -0
- superbrowser_sdk-2.3.0/tests/adversarial/targets.py +247 -0
- superbrowser_sdk-2.3.0/tests/adversarial/test_controlled_server.py +342 -0
- superbrowser_sdk-2.3.0/tests/adversarial/test_targets_unit.py +527 -0
- superbrowser_sdk-2.3.0/tests/adversarial/test_tier1_scanners.py +45 -0
- superbrowser_sdk-2.3.0/tests/adversarial/test_tier2_vendors.py +53 -0
- superbrowser_sdk-2.3.0/tests/adversarial/test_tier3_controlled.py +138 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/README.md +124 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/__init__.py +14 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/backends.py +312 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +268 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/core.py +352 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/engines/__init__.py +1 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/engines/scoring.py +158 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/harness.py +380 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/__init__.py +1 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/history.py +58 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +15 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +94 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/server.py +312 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/__init__.py +25 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/automation.py +280 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/behavioral.py +344 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/controlled.py +92 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/ejector.py +235 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/external.py +233 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +317 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/network.py +175 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/pytest.ini +9 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/run.py +139 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/__init__.py +1 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/conftest.py +95 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_backends.py +101 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_behavioral_telemetry.py +126 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +72 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_behavioral_vectors.py +234 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_core.py +215 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_external.py +155 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_harness_smoke.py +232 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_header_ordering.py +86 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_reporters.py +150 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_scoring.py +300 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_server.py +160 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_superbrowser_backend.py +130 -0
- superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_vectors.py +197 -0
- superbrowser_sdk-2.3.0/tests/test_behavioral/test_hardening.py +435 -0
- superbrowser_sdk-2.3.0/tests/test_mcp_permissions.py +349 -0
- superbrowser_sdk-2.3.0/tests/test_mcp_server.py +487 -0
- superbrowser_sdk-2.3.0/tests/test_mcp_server_smoke.py +153 -0
- superbrowser_sdk-2.3.0/tests/test_mcp_write_tools.py +254 -0
- superbrowser_sdk-2.3.0/tests/test_mcp_write_tools_wave2.py +276 -0
- superbrowser_sdk-2.3.0/tests/test_session/test_locale.py +107 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_ip_reputation.py +85 -0
- superbrowser_sdk-2.3.0/tests/test_vision/__init__.py +0 -0
- superbrowser_sdk-2.2.1/analysis/00-SOURCE-INVENTORY.md +0 -545
- superbrowser_sdk-2.2.1/analysis/01-TRIAGE-QUEUE.md +0 -91
- superbrowser_sdk-2.2.1/analysis/AGENT-BROWSER-ANALYSIS.md +0 -157
- superbrowser_sdk-2.2.1/analysis/AGENT-S-ANALYSIS.md +0 -226
- superbrowser_sdk-2.2.1/analysis/BROWSER-HARNESS-ANALYSIS.md +0 -216
- superbrowser_sdk-2.2.1/analysis/BROWSER-USE-ANALYSIS.md +0 -203
- superbrowser_sdk-2.2.1/analysis/CROSS-PROJECT-SYNTHESIS.md +0 -365
- superbrowser_sdk-2.2.1/analysis/FIRECRAWL-ANALYSIS.md +0 -188
- superbrowser_sdk-2.2.1/analysis/GAP-INVENTORY.md +0 -489
- superbrowser_sdk-2.2.1/analysis/HERMES-AGENT-ANALYSIS.md +0 -213
- superbrowser_sdk-2.2.1/analysis/HERMES-SELF-EVOLUTION-ANALYSIS.md +0 -171
- superbrowser_sdk-2.2.1/analysis/HTTPMORPH-ANALYSIS.md +0 -164
- superbrowser_sdk-2.2.1/analysis/IMPLEMENTATION-ROADMAP.md +0 -252
- superbrowser_sdk-2.2.1/analysis/LAVAGUE-ANALYSIS.md +0 -127
- superbrowser_sdk-2.2.1/analysis/OPENCLAW-ANALYSIS.md +0 -177
- superbrowser_sdk-2.2.1/analysis/PATCHRIGHT-ANALYSIS.md +0 -188
- superbrowser_sdk-2.2.1/analysis/PROJECT-CONFIG.md +0 -156
- superbrowser_sdk-2.2.1/analysis/SESSION-STATE.md +0 -159
- superbrowser_sdk-2.2.1/analysis/SKYVERN-ANALYSIS.md +0 -156
- superbrowser_sdk-2.2.1/analysis/STAGEHAND-ANALYSIS.md +0 -227
- superbrowser_sdk-2.2.1/analysis/UI-TARS-ANALYSIS.md +0 -155
- superbrowser_sdk-2.2.1/analysis/UI-TARS-DESKTOP-ANALYSIS.md +0 -201
- superbrowser_sdk-2.2.1/analysis/output/CHROMECLAW-ANALYSIS.md +0 -550
- superbrowser_sdk-2.2.1/analysis/output/CLAW-VARIANTS-ASSESSMENT.md +0 -131
- superbrowser_sdk-2.2.1/analysis/output/E2B-ANALYSIS.md +0 -433
- superbrowser_sdk-2.2.1/analysis/output/EVOSKILL-ANALYSIS.md +0 -349
- superbrowser_sdk-2.2.1/analysis/output/GO-INFRA-ASSESSMENT.md +0 -74
- superbrowser_sdk-2.2.1/analysis/output/GUARDRAILS-ANALYSIS.md +0 -334
- superbrowser_sdk-2.2.1/analysis/output/KHOJ-ANALYSIS.md +0 -287
- superbrowser_sdk-2.2.1/analysis/output/LETTA-ANALYSIS.md +0 -265
- superbrowser_sdk-2.2.1/analysis/output/MCP-AGENT-ANALYSIS.md +0 -384
- superbrowser_sdk-2.2.1/analysis/output/MCP-ZERO-ANALYSIS.md +0 -78
- superbrowser_sdk-2.2.1/analysis/output/MEM0-ANALYSIS.md +0 -149
- superbrowser_sdk-2.2.1/analysis/output/OPENFGA-ANALYSIS.md +0 -582
- superbrowser_sdk-2.2.1/analysis/output/SKYLL-ANALYSIS.md +0 -176
- superbrowser_sdk-2.2.1/analysis/output/TEMPORAL-ANALYSIS.md +0 -493
- superbrowser_sdk-2.2.1/analysis/output/TOOL-BENCHMARK-ASSESSMENT.md +0 -66
- superbrowser_sdk-2.2.1/labels/config.json +0 -88
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.env.example +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/benchmark.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/dco.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/e2e.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/publish.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/smoke.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.github/workflows/stress.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/.pre-commit-config.yaml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/CONTRIBUTING.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/Dockerfile +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/LICENSE +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/Super-Browser.png +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/behavioral.html +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/dom-heavy.html +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/form.html +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/simple.html +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/conftest.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docker-compose.yml +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/agent-reliability.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/anti-detection-ejecta.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/api-ergonomics-audit.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/api-reference.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/api-stability.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/architecture.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/behavioral-synthesis.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/browser-networking.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/cloak-integration.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/consistency-engine.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/error-catalog.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/fingerprint-scoring.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/fingerprint-validation.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/gap-analysis.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/human-behavior.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/memory.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/migration/v1-to-v2.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/migration/v1.8-to-v1.9.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/operating-doctrine.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/platform-abstraction.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/plugins.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/quickstart.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/recording.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/README.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-decomposition.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/docs/stealth-coverage.md +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/backend_selection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/basic_usage.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/budget_tracking.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/cloak_stealth.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/error_handling.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/fingerprint_scan.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/human_behavior.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/multi_tab_workflow.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/session_persistence.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/examples/stealth_mode.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/agent_efficiency_benchmark.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/browser_benchmark.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/e2e_trend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/run_stealth_gauntlet.sh +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/smoke_published.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/stress_real_world.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/scripts/validate_e2e_report.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/__main__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/debug.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/delegator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/facade.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/factory.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/openai_client.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/protocol.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/loop.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/loop_detector.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/plugins.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/registry.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/router.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/structured_logging.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/agent/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/bezier.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/fitts.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/gauss.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/keyboard.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/mouse.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/prng.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/qwerty.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/scroll.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/cdp.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/cloak_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/cloud.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/discovery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/engine.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/fetch.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/page.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/shutdown.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/browser/tabs.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/cascade.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/client.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/compressor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/cost_estimator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/credential_pool.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/governor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/budget/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/cli/commands.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/cli/interactive.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/cli/script.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/events/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/events/bus.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/events/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/cache.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/controller.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/decorator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/presets.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/recovery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/snapshot.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/vision.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/memory/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/memory/integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/memory/store.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/memory/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/plugins/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/plugins/decorators.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/plugins/hooks.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/py.typed +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recording/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recording/persistence.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recording/recorder.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recording/replayer.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recording/report.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recording/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/checkpoint.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/classifier.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/coordinator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/event_bus.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/format_validator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/reflection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/retry_tracker.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/session_recovery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/watchdogs.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/results/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/results/output.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/results/typed.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/results/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/results/validation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/action_redaction.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/approval.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/credential_vault.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/domain_filter.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/gate.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/injection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/manager.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/policy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/redactor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/security/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/session/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/session/proxy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/skills/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/skills/activation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/skills/markdown.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/skills/registry.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/skills/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/action_policy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/captcha.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/cache.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/pow.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/dag.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/derive.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/errors.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/inject.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/prng.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rule.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/diagnostics.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/headers.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/human.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/human_config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ip_reputation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/manager.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/schema.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/proxy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/proxy_pool.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/report.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/scoring.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/tls_baselines.json +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/checks.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/harness.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/report.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/suite.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/testing.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/cost_analytics.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/flow_logger.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/middleware.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/session_db.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/sinks.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/verification/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/verification/ax_diff.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/verification/hasher.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/verification/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/verification/verifier.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/cache.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/controller.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/coords.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/factory.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/ocr.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/providers.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/src/super_browser/vision/types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/stress/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/stress/server.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/__init__.py +0 -0
- {superbrowser_sdk-2.2.1/tests/integration → superbrowser_sdk-2.3.0/tests/adversarial}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/conftest.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/conftest.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_01_example_nav.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_02_google_search.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_03_github_login.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_05_google_forms.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_06_google_flights.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_09_form_complex.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/conftest.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_behavioral_realism.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_challenge_detection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_interaction.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_live_navigation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_multi_tab.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_navigation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e/test_stealth_overhead.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/e2e_v1_3_journey.py +0 -0
- {superbrowser_sdk-2.2.1/tests/stealth_detection → superbrowser_sdk-2.3.0/tests/integration}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/conftest.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_config_composition.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_engine_backends.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_error_paths.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_facade_smoke.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_full_lifecycle.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_multi_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_performance_smoke.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_playwright_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_public_api.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_session_persistence.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_stealth_abstraction.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v1100_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v150_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v160_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v170_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v180_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v190_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v191_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v192_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v193_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v194_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v195_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v1_3_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/integration/test_v1_4_features.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/pattern_validation.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_agent → superbrowser_sdk-2.3.0/tests/stealth_detection}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/conftest.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_cli_switches.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_live_sites.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_webdriver.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_behavioral → superbrowser_sdk-2.3.0/tests/test_agent}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_action_timeout.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_browser_transport.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_controller_rebinding.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_debug_mode.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_default_tooling.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_delegator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_error_screenshots.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_control.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_network.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_session.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_fail_fast.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm_budget.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm_production.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm_streaming.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_loop.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_loop_detector.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_prompt_isolation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_registry.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_retry_budget.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_streaming.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_structured_logging.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_tab_cap.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_task_02.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_agent/test_types.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_benchmark → superbrowser_sdk-2.3.0/tests/test_behavioral}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_behavioral.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_dwell.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_navigation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_orchestrator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_session_seed.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_browser → superbrowser_sdk-2.3.0/tests/test_benchmark}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_benchmark/test_efficiency.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_benchmarks/test_stress_real_world.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_budget → superbrowser_sdk-2.3.0/tests/test_browser}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cdp.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cdp_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cloak_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cloak_docs.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cloak_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_discovery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_engine_protocol.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_fetch.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_injectors.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_page.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_patchright_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_playwright_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_selenium_backend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_session.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_browser/test_shutdown.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_interaction → superbrowser_sdk-2.3.0/tests/test_budget}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_cascade.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_cascade_governor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_circuit_breaker.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_client.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_compressor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_cost_estimator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_credential_pool.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_governor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_budget/test_types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_cli/test_interactive.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_cli/test_script.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_cli/test_stealth_check.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_cli/test_stealth_validate.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_cli/test_unified_cli.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_e2e/test_report_schema.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_e2e/test_trend.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_audio.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_browser_apis.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_canvas.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_timing.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_webrtc.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_events/test_event_bus.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_governance_docs.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_memory → superbrowser_sdk-2.3.0/tests/test_interaction}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_cache.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_controller.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_decorator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_injection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_page_change.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_presets.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_recovery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_snapshot.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_vision.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_recording → superbrowser_sdk-2.3.0/tests/test_memory}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_memory/test_cli_config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_memory/test_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_memory/test_store.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_recovery → superbrowser_sdk-2.3.0/tests/test_recording}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recording/test_persistence.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recording/test_recorder.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recording/test_replayer.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_results → superbrowser_sdk-2.3.0/tests/test_recovery}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_checkpoint.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_classifier.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_coordinator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_event_bus.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_format_validator.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_reflection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_retry_tracker.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_session_recovery.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_watchdogs.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_release/test_naming_consistency.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_release/test_smoke_published.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_release/test_verify_artifact.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_runtime_correctness → superbrowser_sdk-2.3.0/tests/test_results}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_results/test_batch40_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_results/test_categories.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_results/test_output.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_results/test_typed.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_results/test_types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_results/test_validation.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_security → superbrowser_sdk-2.3.0/tests/test_runtime_correctness}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_runtime_correctness/test_runtime_fixes.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_session → superbrowser_sdk-2.3.0/tests/test_security}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_approval.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_credential_vault.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_domain_filter.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_injection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_manager.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_policy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_redaction_pipeline.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_redactor.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_security/test_types.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_skills → superbrowser_sdk-2.3.0/tests/test_session}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_session/test_proxy.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_stealth → superbrowser_sdk-2.3.0/tests/test_skills}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_skills/test_activation.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_skills/test_integration.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_skills/test_markdown.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_skills/test_registry.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_skills/test_types.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_tracing → superbrowser_sdk-2.3.0/tests/test_stealth}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_action_policy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_captcha.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_challenge_cache.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_challenge_config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_consistency_inject.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_diagnostics.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_headers.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_human.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_kasada_detection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_manager.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_profiles.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_proxy.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_proxy_pool.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_validation.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_verification → superbrowser_sdk-2.3.0/tests/test_tracing}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_cost_analytics.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_flow_logger.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_middleware.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_session_db.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_sinks.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_types.py +0 -0
- {superbrowser_sdk-2.2.1/tests/test_vision → superbrowser_sdk-2.3.0/tests/test_verification}/__init__.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_verification/test_ax_diff.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_verification/test_hasher.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_verification/test_types.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_verification/test_verifier.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_cache.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_controller.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_coords.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_factory.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_ocr.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_providers.py +0 -0
- {superbrowser_sdk-2.2.1 → superbrowser_sdk-2.3.0}/tests/test_vision/test_types.py +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
name: Adversarial v3 Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- 'tests/adversarial_v3/**'
|
|
8
|
+
pull_request:
|
|
9
|
+
paths:
|
|
10
|
+
- 'tests/adversarial_v3/**'
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
inputs:
|
|
13
|
+
backend:
|
|
14
|
+
description: 'Browser backend for real-browser run'
|
|
15
|
+
required: false
|
|
16
|
+
default: 'stub'
|
|
17
|
+
type: choice
|
|
18
|
+
options:
|
|
19
|
+
- stub
|
|
20
|
+
- playwright
|
|
21
|
+
- superbrowser
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
# --- Offline structural tests (always run, merge gate) ---
|
|
25
|
+
offline:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
timeout-minutes: 5
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
- uses: actions/setup-python@v5
|
|
31
|
+
with:
|
|
32
|
+
python-version: '3.11'
|
|
33
|
+
- name: Install test deps
|
|
34
|
+
run: pip install pytest pytest-asyncio
|
|
35
|
+
- name: Run offline adversarial v3 suite
|
|
36
|
+
working-directory: tests/adversarial_v3
|
|
37
|
+
run: |
|
|
38
|
+
PYTHONPATH=. python -m pytest tests/ -v --tb=short
|
|
39
|
+
- name: Verify stub produces no fabricated evidence
|
|
40
|
+
working-directory: tests/adversarial_v3
|
|
41
|
+
run: |
|
|
42
|
+
PYTHONPATH=. python -c "
|
|
43
|
+
import subprocess, json, sys, tempfile, os
|
|
44
|
+
out = tempfile.mkdtemp()
|
|
45
|
+
r = subprocess.run(
|
|
46
|
+
[sys.executable, 'run.py', '--all', '--backend', 'stub', '--output-dir', out],
|
|
47
|
+
capture_output=True, text=True
|
|
48
|
+
)
|
|
49
|
+
# Always surface subprocess output + report contents so any
|
|
50
|
+
# assertion failure is diagnosable. Previously capture_output
|
|
51
|
+
# hid run.py's stdout/stderr, leaving only a bare AssertionError.
|
|
52
|
+
print('=== run.py return code:', r.returncode, flush=True)
|
|
53
|
+
print('=== run.py STDOUT ===', flush=True)
|
|
54
|
+
print(r.stdout, flush=True)
|
|
55
|
+
print('=== run.py STDERR ===', flush=True)
|
|
56
|
+
print(r.stderr, flush=True)
|
|
57
|
+
reports = [f for f in os.listdir(out) if f.endswith('.json')]
|
|
58
|
+
print('=== report files:', reports, flush=True)
|
|
59
|
+
assert r.returncode == 0, f'Stub run should exit 0, got {r.returncode}'
|
|
60
|
+
# The harness writes two JSON files: the run report and
|
|
61
|
+
# adversarial-history.json (the trend log). Select only the
|
|
62
|
+
# per-run report; asserting on all *.json matched the history
|
|
63
|
+
# file too and failed with "Expected 1 report, got 2".
|
|
64
|
+
reports = [f for f in reports if f != 'adversarial-history.json']
|
|
65
|
+
assert len(reports) == 1, f'Expected 1 report, got {len(reports)}: {reports}'
|
|
66
|
+
with open(os.path.join(out, reports[0])) as f:
|
|
67
|
+
data = json.load(f)
|
|
68
|
+
clean = [r for r in data['results'] if r['verdict'] == 'clean']
|
|
69
|
+
flagged = [r for r in data['results'] if r['verdict'] == 'flagged']
|
|
70
|
+
print('=== verdicts:', [(r['vector_id'], r['verdict']) for r in data['results']], flush=True)
|
|
71
|
+
assert len(clean) == 0, f'Stub should not produce CLEAN, got {len(clean)}: {[r[\"vector_id\"] for r in clean]}'
|
|
72
|
+
assert len(flagged) == 0, f'Stub should not produce FLAGGED, got {len(flagged)}: {[r[\"vector_id\"] for r in flagged]}'
|
|
73
|
+
print(f'Stub honesty verified: 0 CLEAN, 0 FLAGGED, exit 0')
|
|
74
|
+
"
|
|
75
|
+
|
|
76
|
+
# --- Real-browser validation (manual dispatch only) ---
|
|
77
|
+
real-browser:
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
timeout-minutes: 10
|
|
80
|
+
if: github.event_name == 'workflow_dispatch'
|
|
81
|
+
steps:
|
|
82
|
+
- uses: actions/checkout@v4
|
|
83
|
+
- uses: actions/setup-python@v5
|
|
84
|
+
with:
|
|
85
|
+
python-version: '3.11'
|
|
86
|
+
- name: Install deps
|
|
87
|
+
run: |
|
|
88
|
+
pip install playwright pytest pytest-asyncio
|
|
89
|
+
python -m playwright install --with-deps chromium
|
|
90
|
+
- name: Install SuperBrowser (for superbrowser backend)
|
|
91
|
+
if: github.event.inputs.backend == 'superbrowser'
|
|
92
|
+
run: |
|
|
93
|
+
# Install the SDK from the checked-out repository, NOT from PyPI.
|
|
94
|
+
# `pip install superbrowser-sdk[all]` would validate the published
|
|
95
|
+
# package while the PR's src/ tree went unimported — a false
|
|
96
|
+
# certification. `.[all]` installs the code under review.
|
|
97
|
+
pip install '.[all]'
|
|
98
|
+
python -m patchright install --with-deps chromium
|
|
99
|
+
- name: Run controlled tier
|
|
100
|
+
# Diagnostic only. run.py exits non-zero on any CRITICAL+FLAGGED
|
|
101
|
+
# verdict — which is the *expected* outcome on a bare CI runner
|
|
102
|
+
# with headless Chromium (the detection tool is doing its job).
|
|
103
|
+
# A flag here means detection worked, not that the harness broke.
|
|
104
|
+
# We capture the report but do not let it fail the job; the
|
|
105
|
+
# smoke-test step below is the actual wiring gate.
|
|
106
|
+
continue-on-error: true
|
|
107
|
+
working-directory: tests/adversarial_v3
|
|
108
|
+
run: |
|
|
109
|
+
PYTHONPATH=. python run.py \
|
|
110
|
+
--tier controlled \
|
|
111
|
+
--backend ${{ github.event.inputs.backend }} \
|
|
112
|
+
--output-dir /tmp/adv3-reports
|
|
113
|
+
- name: Run internal vectors
|
|
114
|
+
# Same rationale as the controlled tier: diagnostic capture.
|
|
115
|
+
continue-on-error: true
|
|
116
|
+
working-directory: tests/adversarial_v3
|
|
117
|
+
run: |
|
|
118
|
+
PYTHONPATH=. python run.py \
|
|
119
|
+
--tier fingerprint --tier automation --tier ejector --tier network --tier controlled \
|
|
120
|
+
--backend ${{ github.event.inputs.backend }} \
|
|
121
|
+
--output-dir /tmp/adv3-reports
|
|
122
|
+
- name: Run SuperBrowser backend smoke tests
|
|
123
|
+
# The real-backend merge gate. SB_AD3_SMOKE=1 un-skips the 8
|
|
124
|
+
# tests in test_superbrowser_backend.py that instantiate
|
|
125
|
+
# SuperBrowserBackend against the checked-out SDK. These catch
|
|
126
|
+
# constructor/lifecycle/evaluate drift. Unlike the diagnostic
|
|
127
|
+
# tiers above, THIS step is allowed to fail the job — it tests
|
|
128
|
+
# backend wiring, not stealth outcome.
|
|
129
|
+
if: github.event.inputs.backend == 'superbrowser'
|
|
130
|
+
working-directory: tests/adversarial_v3
|
|
131
|
+
env:
|
|
132
|
+
SB_AD3_SMOKE: '1'
|
|
133
|
+
run: |
|
|
134
|
+
PYTHONPATH=.:../../src python -m pytest tests/test_superbrowser_backend.py -v --tb=short
|
|
135
|
+
- name: Upload reports
|
|
136
|
+
uses: actions/upload-artifact@v4
|
|
137
|
+
if: always()
|
|
138
|
+
with:
|
|
139
|
+
name: adversarial-v3-reports
|
|
140
|
+
path: /tmp/adv3-reports/
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
name: Adversarial Stealth Validation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
tier:
|
|
7
|
+
description: "Which tier(s) to run"
|
|
8
|
+
required: true
|
|
9
|
+
default: "tier3"
|
|
10
|
+
type: choice
|
|
11
|
+
options:
|
|
12
|
+
- tier3
|
|
13
|
+
- tier1
|
|
14
|
+
- tier2
|
|
15
|
+
- all
|
|
16
|
+
run_id:
|
|
17
|
+
description: "Custom run ID (optional)"
|
|
18
|
+
required: false
|
|
19
|
+
type: string
|
|
20
|
+
|
|
21
|
+
concurrency:
|
|
22
|
+
group: adversarial-${{ github.ref }}
|
|
23
|
+
cancel-in-progress: false
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
adversarial:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
timeout-minutes: 30
|
|
29
|
+
|
|
30
|
+
steps:
|
|
31
|
+
- name: Checkout
|
|
32
|
+
uses: actions/checkout@v4
|
|
33
|
+
|
|
34
|
+
- name: Set up Python
|
|
35
|
+
uses: actions/setup-python@v5
|
|
36
|
+
with:
|
|
37
|
+
python-version: "3.11"
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: |
|
|
41
|
+
python -m pip install --upgrade pip
|
|
42
|
+
pip install -e .[all] || pip install -e .
|
|
43
|
+
pip install pytest pytest-asyncio
|
|
44
|
+
|
|
45
|
+
- name: Install browser engine
|
|
46
|
+
run: |
|
|
47
|
+
python -m patchright install --with-deps chromium || \
|
|
48
|
+
python -m playwright install --with-deps chromium || true
|
|
49
|
+
|
|
50
|
+
- name: Compute tier env vars
|
|
51
|
+
id: tiers
|
|
52
|
+
run: |
|
|
53
|
+
TIER="${{ inputs.tier }}"
|
|
54
|
+
if [ "$TIER" = "tier1" ] || [ "$TIER" = "all" ]; then
|
|
55
|
+
echo "adv=1" >> "$GITHUB_OUTPUT"
|
|
56
|
+
else
|
|
57
|
+
echo "adv=0" >> "$GITHUB_OUTPUT"
|
|
58
|
+
fi
|
|
59
|
+
if [ "$TIER" = "tier2" ] || [ "$TIER" = "all" ]; then
|
|
60
|
+
echo "vendors=1" >> "$GITHUB_OUTPUT"
|
|
61
|
+
echo "vendors_ack=1" >> "$GITHUB_OUTPUT"
|
|
62
|
+
else
|
|
63
|
+
echo "vendors=0" >> "$GITHUB_OUTPUT"
|
|
64
|
+
echo "vendors_ack=0" >> "$GITHUB_OUTPUT"
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
- name: Run adversarial harness
|
|
68
|
+
env:
|
|
69
|
+
SB_ADV: ${{ steps.tiers.outputs.adv }}
|
|
70
|
+
SB_ADV_VENDORS: ${{ steps.tiers.outputs.vendors }}
|
|
71
|
+
SB_ADV_VENDORS_ACK: ${{ steps.tiers.outputs.vendors_ack }}
|
|
72
|
+
run: |
|
|
73
|
+
RUN_ID_ARG=""
|
|
74
|
+
if [ -n "${{ inputs.run_id }}" ]; then
|
|
75
|
+
RUN_ID_ARG="--run-id ${{ inputs.run_id }}"
|
|
76
|
+
fi
|
|
77
|
+
python scripts/adversarial_run.py \
|
|
78
|
+
--tier ${{ inputs.tier }} \
|
|
79
|
+
--output adversarial-results/report.json \
|
|
80
|
+
--markdown adversarial-results/report.md \
|
|
81
|
+
--history adversarial-results/adversarial-history.json \
|
|
82
|
+
$RUN_ID_ARG
|
|
83
|
+
|
|
84
|
+
- name: Upload artifacts
|
|
85
|
+
uses: actions/upload-artifact@v4
|
|
86
|
+
with:
|
|
87
|
+
name: adversarial-report-${{ github.run_id }}
|
|
88
|
+
path: adversarial-results/
|
|
89
|
+
|
|
90
|
+
- name: Comment on PR (if triggered from a PR branch)
|
|
91
|
+
if: github.event_name == 'workflow_dispatch' && github.event.inputs.tier != 'tier3'
|
|
92
|
+
uses: actions/github-script@v7
|
|
93
|
+
with:
|
|
94
|
+
script: |
|
|
95
|
+
const fs = require('fs');
|
|
96
|
+
// workflow_dispatch from a branch does not populate
|
|
97
|
+
// context.issue.number. Find the PR for this branch instead.
|
|
98
|
+
const branch = context.ref.replace('refs/heads/', '');
|
|
99
|
+
const prs = await github.rest.pulls.list({
|
|
100
|
+
owner: context.repo.owner,
|
|
101
|
+
repo: context.repo.repo,
|
|
102
|
+
head: `${context.repo.owner}:${branch}`,
|
|
103
|
+
state: 'open',
|
|
104
|
+
});
|
|
105
|
+
if (prs.data.length === 0) {
|
|
106
|
+
core.info(`No open PR found for branch ${branch}, skipping comment.`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const prNumber = prs.data[0].number;
|
|
110
|
+
const md = fs.readFileSync('adversarial-results/report.md', 'utf8');
|
|
111
|
+
await github.rest.issues.createComment({
|
|
112
|
+
issue_number: prNumber,
|
|
113
|
+
owner: context.repo.owner,
|
|
114
|
+
repo: context.repo.repo,
|
|
115
|
+
body: `## 🤖 Adversarial Stealth Validation Report\n\n${md}`
|
|
116
|
+
});
|
|
117
|
+
core.info(`Commented on PR #${prNumber}`);
|
|
@@ -75,3 +75,14 @@ stress-results/
|
|
|
75
75
|
# E2E trend artifacts
|
|
76
76
|
tests/e2e/artifacts/e2e-history.json
|
|
77
77
|
tests/e2e/artifacts/e2e-trend.md
|
|
78
|
+
adversarial-results/
|
|
79
|
+
|
|
80
|
+
# Adversarial v3 artifacts
|
|
81
|
+
tests/adversarial_v3/adversarial-results/
|
|
82
|
+
tests/adversarial_v3/.pytest_cache/
|
|
83
|
+
|
|
84
|
+
# Research / competitive-analysis snapshots (one-time, not living docs)
|
|
85
|
+
analysis/
|
|
86
|
+
|
|
87
|
+
# Agent UI-state config (workspace-local, not SDK artifacts)
|
|
88
|
+
labels/
|
|
@@ -5,7 +5,22 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [2.3.0] — 2026-06-22
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
- `BrowserSession.start()` now passes `locale` to `new_context()`, fixing the missing `Accept-Language` header regression (T5-002, #198). Added `locale` field to `SessionConfig` (default `"en-US"`); `locale=None` omits the key for engine defaults.
|
|
13
|
+
|
|
14
|
+
### MCP Server — Phase 2
|
|
15
|
+
|
|
16
|
+
- Restored tested MCP server (`superbrowser-mcp`, `python -m super_browser.mcp_server`) over stdio (#179).
|
|
17
|
+
- Permission substrate: `MCPSessionPolicy`, `MCPAuthorizer`, `MCPAuditEntry` — central 5-step authorization path (write-enabled → action-count → timeout → `SecurityManager` → audit) (#183).
|
|
18
|
+
- Write tools: `navigate`, `scroll`, `press_key`, `click`, `fill`, `open_tab`, `close_tab` — all gated by `MCPSessionPolicy.allow_writes` (default `False`) and routed through `SecurityManager` before reaching the facade (#184, #185).
|
|
19
|
+
- `build_server()` now accepts `policy` and `security_manager` kwargs; `list_tools()` advertises write tools only when `allow_writes=True`.
|
|
20
|
+
- Default server behavior is asymmetric: `list_tools()` advertises 6 read-only tools; `call_tool()` recognizes write-tool names and returns a structured policy refusal (not "unknown tool").
|
|
21
|
+
- `fill` sends only the literal caller-supplied value — does not retrieve, infer, store, or auto-fill credentials.
|
|
22
|
+
- Structured refusals, domain allow/block enforcement, audit logging for all write attempts (allowed and denied).
|
|
23
|
+
- Still excluded: `download`, `upload`, `act`, arbitrary JS execution.
|
|
9
24
|
|
|
10
25
|
## [2.2.1] — 2026-06-17
|
|
11
26
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: superbrowser-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.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
|
|
@@ -19,7 +19,6 @@ Classifier: Operating System :: OS Independent
|
|
|
19
19
|
Classifier: Programming Language :: Python :: 3
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
23
22
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
24
23
|
Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
|
|
25
24
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
@@ -31,6 +30,7 @@ Requires-Dist: aiohttp>=3.9; extra == 'all'
|
|
|
31
30
|
Requires-Dist: anthropic>=0.40; extra == 'all'
|
|
32
31
|
Requires-Dist: cryptography>=42.0; extra == 'all'
|
|
33
32
|
Requires-Dist: httpx>=0.27; extra == 'all'
|
|
33
|
+
Requires-Dist: mcp>=1.0; extra == 'all'
|
|
34
34
|
Requires-Dist: openai>=1.0; extra == 'all'
|
|
35
35
|
Requires-Dist: patchright>=1.0; extra == 'all'
|
|
36
36
|
Requires-Dist: pillow>=10.0; extra == 'all'
|
|
@@ -57,6 +57,8 @@ Requires-Dist: pytest-cov>=7.0; extra == 'dev'
|
|
|
57
57
|
Requires-Dist: pytest>=9.0; extra == 'dev'
|
|
58
58
|
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
59
59
|
Requires-Dist: twine>=5.0; extra == 'dev'
|
|
60
|
+
Provides-Extra: mcp
|
|
61
|
+
Requires-Dist: mcp>=1.0; extra == 'mcp'
|
|
60
62
|
Provides-Extra: openai
|
|
61
63
|
Requires-Dist: openai>=1.0; extra == 'openai'
|
|
62
64
|
Provides-Extra: patchright
|
|
@@ -78,7 +80,9 @@ Description-Content-Type: text/markdown
|
|
|
78
80
|
[](https://pypi.org/project/superbrowser-sdk/)
|
|
79
81
|
[](https://github.com/Octo-Lex/Super-Browser/blob/main/LICENSE)
|
|
80
82
|
|
|
81
|
-
**Super Browser** is an anti-detection
|
|
83
|
+
**Super Browser** is an agent-first, security-gated, anti-detection browser SDK built on top of existing automation engines. It wraps Patchright, Playwright, Selenium, or raw CDP behind one async facade with stealth defaults, multi-backend support, structured errors, budget governance, an MCP server with permissioned write tools, and an adversarial detection test suite that measures stealth honestly.
|
|
84
|
+
|
|
85
|
+
> **Stealth evidence:** The adversarial suite shows Super-Browser at **16/25 clean** vs raw Playwright's **14/25** on controlled server + scanner targets, with `navigator.webdriver` and Sannysoft resolved and **0 regressions**. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md) for the full comparison table and known limitations.
|
|
82
86
|
|
|
83
87
|
## Installation
|
|
84
88
|
|
|
@@ -105,6 +109,14 @@ pip install superbrowser-sdk[selenium] # Enterprise CI
|
|
|
105
109
|
pip install superbrowser-sdk[all]
|
|
106
110
|
```
|
|
107
111
|
|
|
112
|
+
For the MCP server (stdio, for Claude Desktop / Cursor integration):
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
pip install superbrowser-sdk[mcp,patchright]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
See [`docs/mcp.md`](docs/mcp.md) for the 13-tool surface and client configuration.
|
|
119
|
+
|
|
108
120
|
For specific LLM providers:
|
|
109
121
|
|
|
110
122
|
```bash
|
|
@@ -129,7 +141,7 @@ async def main():
|
|
|
129
141
|
})
|
|
130
142
|
|
|
131
143
|
# 3. Create the facade and run
|
|
132
|
-
async with SuperBrowser(llm_client=llm) as sb:
|
|
144
|
+
async with SuperBrowser(config=cfg, llm_client=llm) as sb:
|
|
133
145
|
page = await sb.navigate("https://example.com")
|
|
134
146
|
heading = await sb.extract("the page heading", selector="h1")
|
|
135
147
|
print(f"Heading: {heading.data.extracted}")
|
|
@@ -250,27 +262,29 @@ Additional subsystems:
|
|
|
250
262
|
|-----------|---------|
|
|
251
263
|
| **Self-Healing Selectors** | Automatically recovers from broken CSS/XPath selectors using fuzzy matching |
|
|
252
264
|
| **Stealth Mode** | Anti-detection patches (navigator properties, WebDriver flags, viewport fingerprint) |
|
|
253
|
-
| **
|
|
254
|
-
| **
|
|
265
|
+
| **Adversarial Detection Suite** | 25-vector test harness that measures stealth honestly against controlled server + real scanners. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md). |
|
|
266
|
+
| **Output Budget** | Caps token usage per action to prevent runaway LLM costs (daily, per-action, per-turn scopes) |
|
|
267
|
+
| **Security Guardrails** | URL allow/deny lists, domain validation, sensitive-input redaction, structured refusals before side effects |
|
|
268
|
+
| **MCP Server** | 13-tool stdio server (6 read-only + 7 write tools behind `MCPSessionPolicy` + `SecurityManager`). See [`docs/mcp.md`](docs/mcp.md). |
|
|
255
269
|
| **Structured Results** | Every action returns a typed `ActionResult` with timing, method used, and error category |
|
|
270
|
+
| **Behavioral Synthesis** | Bézier mouse paths, seeded human-like keystroke timing, inertial scroll from a deterministic seed |
|
|
256
271
|
| **Vision** | Screenshot-based fallback for pages that resist DOM inspection |
|
|
257
272
|
|
|
258
273
|
Full API documentation lives in [`docs/`](docs/).
|
|
259
274
|
|
|
260
275
|
## What's New (Unreleased)
|
|
261
276
|
|
|
262
|
-
###
|
|
263
|
-
|
|
264
|
-
Nine waves of production-control improvements merged to `main`:
|
|
277
|
+
### MCP Server, Adversarial Suite, Stealth Evidence
|
|
265
278
|
|
|
279
|
+
- **MCP Server** — Permissioned stdio server with 13 tools (6 read-only + 7 write). Write tools route through `MCPSessionPolicy` → `SecurityManager` → audit before reaching the browser. Default is read-only advertisement; writes opt-in via `build_server(policy=MCPSessionPolicy(allow_writes=True))`. See [`docs/mcp.md`](docs/mcp.md).
|
|
280
|
+
- **Adversarial Detection Suite** — 25-vector assessment harness across 6 tiers (fingerprint, automation, ejecta, behavioral, network, controlled) plus external scanners. Honest stub semantics (`JSUnsupportedError` → INCONCLUSIVE, never fabricated). See [`tests/adversarial_v3/`](tests/adversarial_v3/).
|
|
281
|
+
- **Stealth Evidence** — Published comparison: Super-Browser **16/25 clean** vs raw Playwright **14/25** on controlled server + scanner targets. `navigator.webdriver` and Sannysoft resolved; 0 regressions. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md).
|
|
282
|
+
- **Behavioral Telemetry** — Mouse/keystroke/scroll analysis vectors replace permanent SKIPPED with real telemetry-driven verdicts when `--record-behavior` is enabled.
|
|
266
283
|
- **Streaming API** — `act_stream()` yields `StreamEvent` for real-time agent progress. Provider token streaming for OpenAI and Anthropic.
|
|
267
284
|
- **Default Tooling** — 10 built-in tools auto-registered on startup (7 controller + 3 facade). Agents work out-of-box.
|
|
268
|
-
- **Prompt Isolation** — Tool API removed from `<untrusted-screen-content>` wrappers.
|
|
269
285
|
- **Security Perimeter** — All 12 side-effecting facade methods enforce `SecurityManager` before reaching the browser.
|
|
270
286
|
- **Controller Rebinding** — Tools late-bind to current controller after tab switches.
|
|
271
287
|
|
|
272
|
-
See the [Security Guardrails](#security-guardrails), [Streaming](#streaming), and [Default Agent Tooling](#default-agent-tooling) sections above.
|
|
273
|
-
|
|
274
288
|
## What's New in v1.9
|
|
275
289
|
|
|
276
290
|
### Platform Abstraction + Distribution — One API, Any Browser
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
[](https://pypi.org/project/superbrowser-sdk/)
|
|
5
5
|
[](https://github.com/Octo-Lex/Super-Browser/blob/main/LICENSE)
|
|
6
6
|
|
|
7
|
-
**Super Browser** is an anti-detection
|
|
7
|
+
**Super Browser** is an agent-first, security-gated, anti-detection browser SDK built on top of existing automation engines. It wraps Patchright, Playwright, Selenium, or raw CDP behind one async facade with stealth defaults, multi-backend support, structured errors, budget governance, an MCP server with permissioned write tools, and an adversarial detection test suite that measures stealth honestly.
|
|
8
|
+
|
|
9
|
+
> **Stealth evidence:** The adversarial suite shows Super-Browser at **16/25 clean** vs raw Playwright's **14/25** on controlled server + scanner targets, with `navigator.webdriver` and Sannysoft resolved and **0 regressions**. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md) for the full comparison table and known limitations.
|
|
8
10
|
|
|
9
11
|
## Installation
|
|
10
12
|
|
|
@@ -31,6 +33,14 @@ pip install superbrowser-sdk[selenium] # Enterprise CI
|
|
|
31
33
|
pip install superbrowser-sdk[all]
|
|
32
34
|
```
|
|
33
35
|
|
|
36
|
+
For the MCP server (stdio, for Claude Desktop / Cursor integration):
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install superbrowser-sdk[mcp,patchright]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
See [`docs/mcp.md`](docs/mcp.md) for the 13-tool surface and client configuration.
|
|
43
|
+
|
|
34
44
|
For specific LLM providers:
|
|
35
45
|
|
|
36
46
|
```bash
|
|
@@ -55,7 +65,7 @@ async def main():
|
|
|
55
65
|
})
|
|
56
66
|
|
|
57
67
|
# 3. Create the facade and run
|
|
58
|
-
async with SuperBrowser(llm_client=llm) as sb:
|
|
68
|
+
async with SuperBrowser(config=cfg, llm_client=llm) as sb:
|
|
59
69
|
page = await sb.navigate("https://example.com")
|
|
60
70
|
heading = await sb.extract("the page heading", selector="h1")
|
|
61
71
|
print(f"Heading: {heading.data.extracted}")
|
|
@@ -176,27 +186,29 @@ Additional subsystems:
|
|
|
176
186
|
|-----------|---------|
|
|
177
187
|
| **Self-Healing Selectors** | Automatically recovers from broken CSS/XPath selectors using fuzzy matching |
|
|
178
188
|
| **Stealth Mode** | Anti-detection patches (navigator properties, WebDriver flags, viewport fingerprint) |
|
|
179
|
-
| **
|
|
180
|
-
| **
|
|
189
|
+
| **Adversarial Detection Suite** | 25-vector test harness that measures stealth honestly against controlled server + real scanners. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md). |
|
|
190
|
+
| **Output Budget** | Caps token usage per action to prevent runaway LLM costs (daily, per-action, per-turn scopes) |
|
|
191
|
+
| **Security Guardrails** | URL allow/deny lists, domain validation, sensitive-input redaction, structured refusals before side effects |
|
|
192
|
+
| **MCP Server** | 13-tool stdio server (6 read-only + 7 write tools behind `MCPSessionPolicy` + `SecurityManager`). See [`docs/mcp.md`](docs/mcp.md). |
|
|
181
193
|
| **Structured Results** | Every action returns a typed `ActionResult` with timing, method used, and error category |
|
|
194
|
+
| **Behavioral Synthesis** | Bézier mouse paths, seeded human-like keystroke timing, inertial scroll from a deterministic seed |
|
|
182
195
|
| **Vision** | Screenshot-based fallback for pages that resist DOM inspection |
|
|
183
196
|
|
|
184
197
|
Full API documentation lives in [`docs/`](docs/).
|
|
185
198
|
|
|
186
199
|
## What's New (Unreleased)
|
|
187
200
|
|
|
188
|
-
###
|
|
189
|
-
|
|
190
|
-
Nine waves of production-control improvements merged to `main`:
|
|
201
|
+
### MCP Server, Adversarial Suite, Stealth Evidence
|
|
191
202
|
|
|
203
|
+
- **MCP Server** — Permissioned stdio server with 13 tools (6 read-only + 7 write). Write tools route through `MCPSessionPolicy` → `SecurityManager` → audit before reaching the browser. Default is read-only advertisement; writes opt-in via `build_server(policy=MCPSessionPolicy(allow_writes=True))`. See [`docs/mcp.md`](docs/mcp.md).
|
|
204
|
+
- **Adversarial Detection Suite** — 25-vector assessment harness across 6 tiers (fingerprint, automation, ejecta, behavioral, network, controlled) plus external scanners. Honest stub semantics (`JSUnsupportedError` → INCONCLUSIVE, never fabricated). See [`tests/adversarial_v3/`](tests/adversarial_v3/).
|
|
205
|
+
- **Stealth Evidence** — Published comparison: Super-Browser **16/25 clean** vs raw Playwright **14/25** on controlled server + scanner targets. `navigator.webdriver` and Sannysoft resolved; 0 regressions. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md).
|
|
206
|
+
- **Behavioral Telemetry** — Mouse/keystroke/scroll analysis vectors replace permanent SKIPPED with real telemetry-driven verdicts when `--record-behavior` is enabled.
|
|
192
207
|
- **Streaming API** — `act_stream()` yields `StreamEvent` for real-time agent progress. Provider token streaming for OpenAI and Anthropic.
|
|
193
208
|
- **Default Tooling** — 10 built-in tools auto-registered on startup (7 controller + 3 facade). Agents work out-of-box.
|
|
194
|
-
- **Prompt Isolation** — Tool API removed from `<untrusted-screen-content>` wrappers.
|
|
195
209
|
- **Security Perimeter** — All 12 side-effecting facade methods enforce `SecurityManager` before reaching the browser.
|
|
196
210
|
- **Controller Rebinding** — Tools late-bind to current controller after tab switches.
|
|
197
211
|
|
|
198
|
-
See the [Security Guardrails](#security-guardrails), [Streaming](#streaming), and [Default Agent Tooling](#default-agent-tooling) sections above.
|
|
199
|
-
|
|
200
212
|
## What's New in v1.9
|
|
201
213
|
|
|
202
214
|
### Platform Abstraction + Distribution — One API, Any Browser
|