superbrowser-sdk 2.0.2__tar.gz → 2.1.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.
Files changed (579) hide show
  1. superbrowser_sdk-2.1.0/.github/workflows/benchmark.yml +49 -0
  2. superbrowser_sdk-2.1.0/.github/workflows/e2e.yml +62 -0
  3. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/.github/workflows/publish.yml +4 -1
  4. superbrowser_sdk-2.1.0/.github/workflows/smoke.yml +74 -0
  5. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/.gitignore +13 -0
  6. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/CHANGELOG.md +61 -0
  7. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/PKG-INFO +1 -1
  8. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/api-reference.md +1 -1
  9. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/architecture.md +1 -1
  10. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/fingerprint-scoring.md +3 -3
  11. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/fingerprint-validation.md +5 -5
  12. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/memory.md +4 -4
  13. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/quickstart.md +74 -0
  14. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/pyproject.toml +1 -1
  15. superbrowser_sdk-2.1.0/scripts/browser_benchmark.py +483 -0
  16. superbrowser_sdk-2.1.0/scripts/e2e_trend.py +307 -0
  17. superbrowser_sdk-2.1.0/scripts/smoke_published.py +262 -0
  18. superbrowser_sdk-2.1.0/scripts/validate_e2e_report.py +263 -0
  19. superbrowser_sdk-2.1.0/scripts/verify_release_artifact.py +306 -0
  20. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/__init__.py +1 -1
  21. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/cli/interactive.py +1 -1
  22. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/testing.py +58 -30
  23. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/conftest.py +83 -6
  24. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v194_features.py +2 -2
  25. superbrowser_sdk-2.1.0/tests/test_benchmarks/test_browser_benchmark.py +447 -0
  26. superbrowser_sdk-2.1.0/tests/test_e2e/test_report_schema.py +359 -0
  27. superbrowser_sdk-2.1.0/tests/test_e2e/test_trend.py +395 -0
  28. superbrowser_sdk-2.1.0/tests/test_release/test_naming_consistency.py +112 -0
  29. superbrowser_sdk-2.1.0/tests/test_release/test_smoke_published.py +267 -0
  30. superbrowser_sdk-2.1.0/tests/test_release/test_verify_artifact.py +133 -0
  31. superbrowser_sdk-2.1.0/tests/test_stealth/test_e2e_lifecycle.py +454 -0
  32. superbrowser_sdk-2.1.0/tests/test_stealth/test_e2e_reporting.py +193 -0
  33. superbrowser_sdk-2.0.2/scripts/browser_benchmark.py +0 -555
  34. superbrowser_sdk-2.0.2/tests/test_stealth/test_e2e_lifecycle.py +0 -220
  35. superbrowser_sdk-2.0.2/tests/test_stealth/test_e2e_reporting.py +0 -110
  36. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/.env.example +0 -0
  37. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/.github/workflows/dco.yml +0 -0
  38. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/.github/workflows/test.yml +0 -0
  39. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/.pre-commit-config.yaml +0 -0
  40. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/CONTRIBUTING.md +0 -0
  41. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/Dockerfile +0 -0
  42. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/LICENSE +0 -0
  43. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/README.md +0 -0
  44. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/Super-Browser.png +0 -0
  45. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/00-SOURCE-INVENTORY.md +0 -0
  46. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/01-TRIAGE-QUEUE.md +0 -0
  47. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/AGENT-BROWSER-ANALYSIS.md +0 -0
  48. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/AGENT-S-ANALYSIS.md +0 -0
  49. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/BROWSER-HARNESS-ANALYSIS.md +0 -0
  50. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/BROWSER-USE-ANALYSIS.md +0 -0
  51. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/CROSS-PROJECT-SYNTHESIS.md +0 -0
  52. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/FIRECRAWL-ANALYSIS.md +0 -0
  53. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/GAP-INVENTORY.md +0 -0
  54. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/HERMES-AGENT-ANALYSIS.md +0 -0
  55. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/HERMES-SELF-EVOLUTION-ANALYSIS.md +0 -0
  56. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/HTTPMORPH-ANALYSIS.md +0 -0
  57. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/IMPLEMENTATION-ROADMAP.md +0 -0
  58. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/LAVAGUE-ANALYSIS.md +0 -0
  59. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/OPENCLAW-ANALYSIS.md +0 -0
  60. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/PATCHRIGHT-ANALYSIS.md +0 -0
  61. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/PROJECT-CONFIG.md +0 -0
  62. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/SESSION-STATE.md +0 -0
  63. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/SKYVERN-ANALYSIS.md +0 -0
  64. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/STAGEHAND-ANALYSIS.md +0 -0
  65. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/UI-TARS-ANALYSIS.md +0 -0
  66. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/UI-TARS-DESKTOP-ANALYSIS.md +0 -0
  67. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/CHROMECLAW-ANALYSIS.md +0 -0
  68. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/CLAW-VARIANTS-ASSESSMENT.md +0 -0
  69. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/E2B-ANALYSIS.md +0 -0
  70. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/EVOSKILL-ANALYSIS.md +0 -0
  71. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/GO-INFRA-ASSESSMENT.md +0 -0
  72. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/GUARDRAILS-ANALYSIS.md +0 -0
  73. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/KHOJ-ANALYSIS.md +0 -0
  74. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/LETTA-ANALYSIS.md +0 -0
  75. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/MCP-AGENT-ANALYSIS.md +0 -0
  76. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/MCP-ZERO-ANALYSIS.md +0 -0
  77. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/MEM0-ANALYSIS.md +0 -0
  78. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/OPENFGA-ANALYSIS.md +0 -0
  79. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/SKYLL-ANALYSIS.md +0 -0
  80. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/TEMPORAL-ANALYSIS.md +0 -0
  81. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/analysis/output/TOOL-BENCHMARK-ASSESSMENT.md +0 -0
  82. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/benchmarks/fixtures/behavioral.html +0 -0
  83. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/benchmarks/fixtures/dom-heavy.html +0 -0
  84. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/benchmarks/fixtures/form.html +0 -0
  85. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/benchmarks/fixtures/simple.html +0 -0
  86. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
  87. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
  88. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/conftest.py +0 -0
  89. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docker-compose.yml +0 -0
  90. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/agent-reliability.md +0 -0
  91. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
  92. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/anti-detection-ejecta.md +0 -0
  93. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/api-stability.md +0 -0
  94. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/behavioral-synthesis.md +0 -0
  95. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/browser-networking.md +0 -0
  96. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/cloak-integration.md +0 -0
  97. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/consistency-engine.md +0 -0
  98. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
  99. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/error-catalog.md +0 -0
  100. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/gap-analysis.md +0 -0
  101. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/human-behavior.md +0 -0
  102. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/migration/v1-to-v2.md +0 -0
  103. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/migration/v1.8-to-v1.9.md +0 -0
  104. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/operating-doctrine.md +0 -0
  105. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/platform-abstraction.md +0 -0
  106. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/plugins.md +0 -0
  107. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/recording.md +0 -0
  108. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/README.md +0 -0
  109. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/v2-decomposition.md +0 -0
  110. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
  111. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
  112. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
  113. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
  114. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
  115. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/docs/stealth-coverage.md +0 -0
  116. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/backend_selection.py +0 -0
  117. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/basic_usage.py +0 -0
  118. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/budget_tracking.py +0 -0
  119. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/cloak_stealth.py +0 -0
  120. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/error_handling.py +0 -0
  121. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/fingerprint_scan.py +0 -0
  122. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/human_behavior.py +0 -0
  123. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/multi_tab_workflow.py +0 -0
  124. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/session_persistence.py +0 -0
  125. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/examples/stealth_mode.py +0 -0
  126. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/labels/config.json +0 -0
  127. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/scripts/agent_efficiency_benchmark.py +0 -0
  128. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/scripts/run_stealth_gauntlet.sh +0 -0
  129. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/__init__.py +0 -0
  130. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/config.py +0 -0
  131. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/debug.py +0 -0
  132. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/delegator.py +0 -0
  133. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/facade.py +0 -0
  134. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/__init__.py +0 -0
  135. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
  136. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
  137. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
  138. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/factory.py +0 -0
  139. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/openai_client.py +0 -0
  140. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/llm/protocol.py +0 -0
  141. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/loop.py +0 -0
  142. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/loop_detector.py +0 -0
  143. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/plugins.py +0 -0
  144. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/registry.py +0 -0
  145. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/router.py +0 -0
  146. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/structured_logging.py +0 -0
  147. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/agent/types.py +0 -0
  148. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/__init__.py +0 -0
  149. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/bezier.py +0 -0
  150. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/dwell.py +0 -0
  151. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/fitts.py +0 -0
  152. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/gauss.py +0 -0
  153. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/keyboard.py +0 -0
  154. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/mouse.py +0 -0
  155. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/navigation.py +0 -0
  156. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/orchestrator.py +0 -0
  157. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/prng.py +0 -0
  158. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/qwerty.py +0 -0
  159. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/scroll.py +0 -0
  160. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/session_seed.py +0 -0
  161. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/behavioral/types.py +0 -0
  162. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/__init__.py +0 -0
  163. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/backends/__init__.py +0 -0
  164. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
  165. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
  166. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
  167. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
  168. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/cdp.py +0 -0
  169. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/cloak_backend.py +0 -0
  170. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/cloud.py +0 -0
  171. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/config.py +0 -0
  172. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/discovery.py +0 -0
  173. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/engine.py +0 -0
  174. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/fetch.py +0 -0
  175. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/injectors/__init__.py +0 -0
  176. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
  177. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
  178. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
  179. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/page.py +0 -0
  180. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/session.py +0 -0
  181. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/shutdown.py +0 -0
  182. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/browser/tabs.py +0 -0
  183. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/__init__.py +0 -0
  184. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/cascade.py +0 -0
  185. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/client.py +0 -0
  186. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/compressor.py +0 -0
  187. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/cost_estimator.py +0 -0
  188. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/credential_pool.py +0 -0
  189. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/governor.py +0 -0
  190. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/budget/types.py +0 -0
  191. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/cli/__init__.py +0 -0
  192. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/cli/commands.py +0 -0
  193. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/cli/script.py +0 -0
  194. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/config.py +0 -0
  195. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/events/__init__.py +0 -0
  196. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/events/bus.py +0 -0
  197. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/events/types.py +0 -0
  198. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/__init__.py +0 -0
  199. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/cache.py +0 -0
  200. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/controller.py +0 -0
  201. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/decorator.py +0 -0
  202. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/presets.py +0 -0
  203. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/recovery.py +0 -0
  204. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/snapshot.py +0 -0
  205. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/types.py +0 -0
  206. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/interaction/vision.py +0 -0
  207. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/memory/__init__.py +0 -0
  208. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/memory/integration.py +0 -0
  209. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/memory/store.py +0 -0
  210. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/memory/types.py +0 -0
  211. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/plugins/__init__.py +0 -0
  212. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/plugins/decorators.py +0 -0
  213. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/plugins/hooks.py +0 -0
  214. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/py.typed +0 -0
  215. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recording/__init__.py +0 -0
  216. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recording/persistence.py +0 -0
  217. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recording/recorder.py +0 -0
  218. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recording/replayer.py +0 -0
  219. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recording/report.py +0 -0
  220. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recording/types.py +0 -0
  221. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/__init__.py +0 -0
  222. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/checkpoint.py +0 -0
  223. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/classifier.py +0 -0
  224. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/coordinator.py +0 -0
  225. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/event_bus.py +0 -0
  226. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/format_validator.py +0 -0
  227. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/reflection.py +0 -0
  228. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/retry_tracker.py +0 -0
  229. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/session_recovery.py +0 -0
  230. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/types.py +0 -0
  231. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/recovery/watchdogs.py +0 -0
  232. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/results/__init__.py +0 -0
  233. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/results/output.py +0 -0
  234. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/results/typed.py +0 -0
  235. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/results/types.py +0 -0
  236. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/results/validation.py +0 -0
  237. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/__init__.py +0 -0
  238. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/action_redaction.py +0 -0
  239. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/approval.py +0 -0
  240. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/credential_vault.py +0 -0
  241. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/domain_filter.py +0 -0
  242. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/gate.py +0 -0
  243. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/injection.py +0 -0
  244. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/manager.py +0 -0
  245. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/policy.py +0 -0
  246. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/redactor.py +0 -0
  247. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/security/types.py +0 -0
  248. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/session/__init__.py +0 -0
  249. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/session/proxy.py +0 -0
  250. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/skills/__init__.py +0 -0
  251. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/skills/activation.py +0 -0
  252. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/skills/markdown.py +0 -0
  253. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/skills/registry.py +0 -0
  254. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/skills/types.py +0 -0
  255. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/__init__.py +0 -0
  256. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/action_policy.py +0 -0
  257. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/captcha.py +0 -0
  258. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
  259. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/challenges/cache.py +0 -0
  260. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/challenges/pow.py +0 -0
  261. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
  262. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
  263. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/dag.py +0 -0
  264. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/derive.py +0 -0
  265. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/errors.py +0 -0
  266. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/inject.py +0 -0
  267. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
  268. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
  269. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/prng.py +0 -0
  270. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rule.py +0 -0
  271. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
  272. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
  273. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
  274. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
  275. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
  276. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
  277. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
  278. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
  279. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
  280. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/diagnostics.py +0 -0
  281. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
  282. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
  283. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
  284. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
  285. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/config.py +0 -0
  286. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
  287. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
  288. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/types.py +0 -0
  289. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
  290. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
  291. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
  292. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/headers.py +0 -0
  293. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/human.py +0 -0
  294. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/human_config.py +0 -0
  295. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/ip_reputation.py +0 -0
  296. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/manager.py +0 -0
  297. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
  298. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
  299. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
  300. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
  301. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
  302. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
  303. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/profiles/schema.py +0 -0
  304. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/proxy.py +0 -0
  305. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/proxy_pool.py +0 -0
  306. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/report.py +0 -0
  307. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/scoring.py +0 -0
  308. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/tls_baselines.json +0 -0
  309. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
  310. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/types.py +0 -0
  311. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
  312. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/validation/__init__.py +0 -0
  313. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/validation/checks.py +0 -0
  314. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/validation/harness.py +0 -0
  315. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/validation/report.py +0 -0
  316. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/stealth/validation/suite.py +0 -0
  317. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/__init__.py +0 -0
  318. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/cost_analytics.py +0 -0
  319. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/flow_logger.py +0 -0
  320. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/middleware.py +0 -0
  321. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/session_db.py +0 -0
  322. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/sinks.py +0 -0
  323. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/tracing/types.py +0 -0
  324. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/verification/__init__.py +0 -0
  325. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/verification/ax_diff.py +0 -0
  326. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/verification/hasher.py +0 -0
  327. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/verification/types.py +0 -0
  328. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/verification/verifier.py +0 -0
  329. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/__init__.py +0 -0
  330. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/cache.py +0 -0
  331. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/controller.py +0 -0
  332. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/coords.py +0 -0
  333. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/factory.py +0 -0
  334. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/ocr.py +0 -0
  335. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/providers.py +0 -0
  336. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/src/super_browser/vision/types.py +0 -0
  337. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/__init__.py +0 -0
  338. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/conftest.py +0 -0
  339. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/__init__.py +0 -0
  340. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/conftest.py +0 -0
  341. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_01_example_nav.py +0 -0
  342. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_02_google_search.py +0 -0
  343. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_03_github_login.py +0 -0
  344. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
  345. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_05_google_forms.py +0 -0
  346. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_06_google_flights.py +0 -0
  347. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
  348. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
  349. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_09_form_complex.py +0 -0
  350. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
  351. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/__init__.py +0 -0
  352. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_behavioral_realism.py +0 -0
  353. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_challenge_detection.py +0 -0
  354. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_interaction.py +0 -0
  355. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_live_navigation.py +0 -0
  356. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_multi_tab.py +0 -0
  357. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_navigation.py +0 -0
  358. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_session_persistence.py +0 -0
  359. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e/test_stealth_overhead.py +0 -0
  360. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/e2e_v1_3_journey.py +0 -0
  361. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/__init__.py +0 -0
  362. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/conftest.py +0 -0
  363. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_config_composition.py +0 -0
  364. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_engine_backends.py +0 -0
  365. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_error_paths.py +0 -0
  366. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_facade_smoke.py +0 -0
  367. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_full_lifecycle.py +0 -0
  368. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_multi_backend.py +0 -0
  369. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_performance_smoke.py +0 -0
  370. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_playwright_integration.py +0 -0
  371. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_public_api.py +0 -0
  372. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_session_persistence.py +0 -0
  373. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_stealth_abstraction.py +0 -0
  374. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v1100_features.py +0 -0
  375. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v150_features.py +0 -0
  376. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v160_features.py +0 -0
  377. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v170_features.py +0 -0
  378. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v180_features.py +0 -0
  379. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v190_features.py +0 -0
  380. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v191_features.py +0 -0
  381. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v192_features.py +0 -0
  382. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v193_features.py +0 -0
  383. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v195_features.py +0 -0
  384. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v1_3_features.py +0 -0
  385. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/integration/test_v1_4_features.py +0 -0
  386. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/pattern_validation.py +0 -0
  387. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/__init__.py +0 -0
  388. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/conftest.py +0 -0
  389. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
  390. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_cli_switches.py +0 -0
  391. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
  392. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_live_sites.py +0 -0
  393. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
  394. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
  395. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/stealth_detection/test_webdriver.py +0 -0
  396. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/__init__.py +0 -0
  397. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_action_timeout.py +0 -0
  398. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_browser_transport.py +0 -0
  399. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_controller_rebinding.py +0 -0
  400. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_debug_mode.py +0 -0
  401. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_default_tooling.py +0 -0
  402. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_delegator.py +0 -0
  403. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_error_screenshots.py +0 -0
  404. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_facade.py +0 -0
  405. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_facade_security.py +0 -0
  406. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_facade_security_control.py +0 -0
  407. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
  408. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_facade_security_network.py +0 -0
  409. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_facade_security_session.py +0 -0
  410. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_fail_fast.py +0 -0
  411. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_llm.py +0 -0
  412. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_llm_budget.py +0 -0
  413. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_llm_production.py +0 -0
  414. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_llm_streaming.py +0 -0
  415. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_loop.py +0 -0
  416. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_loop_detector.py +0 -0
  417. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_prompt_isolation.py +0 -0
  418. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_registry.py +0 -0
  419. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_retry_budget.py +0 -0
  420. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_streaming.py +0 -0
  421. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_structured_logging.py +0 -0
  422. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_tab_cap.py +0 -0
  423. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_task_02.py +0 -0
  424. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_agent/test_types.py +0 -0
  425. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/__init__.py +0 -0
  426. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/test_behavioral.py +0 -0
  427. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/test_dwell.py +0 -0
  428. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
  429. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/test_navigation.py +0 -0
  430. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/test_orchestrator.py +0 -0
  431. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_behavioral/test_session_seed.py +0 -0
  432. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_benchmark/__init__.py +0 -0
  433. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_benchmark/test_efficiency.py +0 -0
  434. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/__init__.py +0 -0
  435. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_cdp.py +0 -0
  436. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_cdp_backend.py +0 -0
  437. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_cloak_backend.py +0 -0
  438. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_cloak_docs.py +0 -0
  439. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_cloak_integration.py +0 -0
  440. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_config.py +0 -0
  441. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_discovery.py +0 -0
  442. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_engine_protocol.py +0 -0
  443. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_fetch.py +0 -0
  444. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_injectors.py +0 -0
  445. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_page.py +0 -0
  446. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_patchright_backend.py +0 -0
  447. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_playwright_backend.py +0 -0
  448. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_selenium_backend.py +0 -0
  449. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_session.py +0 -0
  450. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_browser/test_shutdown.py +0 -0
  451. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/__init__.py +0 -0
  452. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_cascade.py +0 -0
  453. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_cascade_governor.py +0 -0
  454. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_circuit_breaker.py +0 -0
  455. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_client.py +0 -0
  456. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_compressor.py +0 -0
  457. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_cost_estimator.py +0 -0
  458. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_credential_pool.py +0 -0
  459. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_governor.py +0 -0
  460. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_budget/test_types.py +0 -0
  461. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_cli/test_interactive.py +0 -0
  462. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_cli/test_script.py +0 -0
  463. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_cli/test_stealth_check.py +0 -0
  464. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_cli/test_stealth_validate.py +0 -0
  465. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_cli/test_unified_cli.py +0 -0
  466. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_config.py +0 -0
  467. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_audio.py +0 -0
  468. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
  469. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
  470. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_browser_apis.py +0 -0
  471. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_canvas.py +0 -0
  472. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_integration.py +0 -0
  473. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_timing.py +0 -0
  474. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_ejecta/test_webrtc.py +0 -0
  475. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_events/test_event_bus.py +0 -0
  476. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
  477. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_governance_docs.py +0 -0
  478. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/__init__.py +0 -0
  479. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_cache.py +0 -0
  480. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_controller.py +0 -0
  481. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_decorator.py +0 -0
  482. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_injection.py +0 -0
  483. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_page_change.py +0 -0
  484. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_presets.py +0 -0
  485. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_recovery.py +0 -0
  486. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_snapshot.py +0 -0
  487. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_types.py +0 -0
  488. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_interaction/test_vision.py +0 -0
  489. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_memory/__init__.py +0 -0
  490. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_memory/test_cli_config.py +0 -0
  491. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_memory/test_integration.py +0 -0
  492. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_memory/test_store.py +0 -0
  493. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recording/__init__.py +0 -0
  494. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recording/test_persistence.py +0 -0
  495. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recording/test_recorder.py +0 -0
  496. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recording/test_replayer.py +0 -0
  497. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/__init__.py +0 -0
  498. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_checkpoint.py +0 -0
  499. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_classifier.py +0 -0
  500. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_coordinator.py +0 -0
  501. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_event_bus.py +0 -0
  502. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_format_validator.py +0 -0
  503. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_reflection.py +0 -0
  504. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_retry_tracker.py +0 -0
  505. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_session_recovery.py +0 -0
  506. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_types.py +0 -0
  507. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_recovery/test_watchdogs.py +0 -0
  508. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/__init__.py +0 -0
  509. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/test_batch40_integration.py +0 -0
  510. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/test_categories.py +0 -0
  511. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/test_output.py +0 -0
  512. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/test_typed.py +0 -0
  513. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/test_types.py +0 -0
  514. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_results/test_validation.py +0 -0
  515. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/__init__.py +0 -0
  516. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_approval.py +0 -0
  517. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_credential_vault.py +0 -0
  518. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_domain_filter.py +0 -0
  519. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_injection.py +0 -0
  520. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_manager.py +0 -0
  521. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_policy.py +0 -0
  522. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_redaction_pipeline.py +0 -0
  523. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_redactor.py +0 -0
  524. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_security/test_types.py +0 -0
  525. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_session/__init__.py +0 -0
  526. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_session/test_proxy.py +0 -0
  527. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_skills/__init__.py +0 -0
  528. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_skills/test_activation.py +0 -0
  529. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_skills/test_integration.py +0 -0
  530. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_skills/test_markdown.py +0 -0
  531. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_skills/test_registry.py +0 -0
  532. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_skills/test_types.py +0 -0
  533. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/__init__.py +0 -0
  534. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_action_policy.py +0 -0
  535. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_captcha.py +0 -0
  536. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
  537. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_challenge_cache.py +0 -0
  538. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_challenge_config.py +0 -0
  539. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
  540. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_consistency_inject.py +0 -0
  541. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_diagnostics.py +0 -0
  542. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
  543. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
  544. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_headers.py +0 -0
  545. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_human.py +0 -0
  546. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
  547. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_ip_reputation.py +0 -0
  548. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_kasada_detection.py +0 -0
  549. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_manager.py +0 -0
  550. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
  551. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_profiles.py +0 -0
  552. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_proxy.py +0 -0
  553. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_proxy_pool.py +0 -0
  554. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
  555. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
  556. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
  557. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_types.py +0 -0
  558. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
  559. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_stealth/test_validation.py +0 -0
  560. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/__init__.py +0 -0
  561. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/test_cost_analytics.py +0 -0
  562. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/test_flow_logger.py +0 -0
  563. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/test_middleware.py +0 -0
  564. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/test_session_db.py +0 -0
  565. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/test_sinks.py +0 -0
  566. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_tracing/test_types.py +0 -0
  567. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_verification/__init__.py +0 -0
  568. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_verification/test_ax_diff.py +0 -0
  569. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_verification/test_hasher.py +0 -0
  570. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_verification/test_types.py +0 -0
  571. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_verification/test_verifier.py +0 -0
  572. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/__init__.py +0 -0
  573. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/test_cache.py +0 -0
  574. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/test_controller.py +0 -0
  575. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/test_coords.py +0 -0
  576. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/test_factory.py +0 -0
  577. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/test_ocr.py +0 -0
  578. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/tests/test_vision/test_providers.py +0 -0
  579. {superbrowser_sdk-2.0.2 → superbrowser_sdk-2.1.0}/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,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.1.0] — 2026-06-16
11
+
12
+ ### Overview
13
+
14
+ **v2.1.0 — Operational Maturity**
15
+
16
+ v2.1 makes Super Browser easier to operate, validate, benchmark, and
17
+ monitor after release. No new stealth features, no API redesigns —
18
+ this release adds the operational infrastructure needed to trust the
19
+ E2E signal, catch packaging regressions before users do, and track
20
+ performance over time.
21
+
22
+ ### Added — Benchmarking (Track A)
23
+
24
+ - Offline real-browser benchmark harness (`scripts/browser_benchmark.py`)
25
+ measuring 9 metrics: browser launch, new page, navigation (simple/form/
26
+ DOM-heavy), DOM query, click+fill, screenshot, and memory delta.
27
+ - Local fixture-backed pages only — no network dependency.
28
+ - JSON schema v1 output with mean/median/min/max/stdev per metric.
29
+ - Markdown report for human-readable consumption.
30
+ - Configurable iterations, warmup, headless mode, backend selection.
31
+ - `timeout_s` enforcement via `asyncio.wait_for` on all operations.
32
+ - Fixture HTTP server cleanup in `try/finally`.
33
+ - Manual `benchmark.yml` workflow (`workflow_dispatch` only, 90-day artifacts).
34
+
35
+ ### Added — Release Observability (Track B)
36
+
37
+ - Post-release PyPI smoke workflow (`scripts/smoke_published.py`).
38
+ - Fresh-venv install validation: `[all]`, `[patchright]`, `[playwright]`,
39
+ `import super_browser`, `superbrowser version`, `superbrowser info`.
40
+ - Version match check when `--version` specified.
41
+ - JSON + Markdown smoke report output.
42
+ - Daily scheduled run at 08:00 UTC + manual `workflow_dispatch`.
43
+ - Automatic GitHub issue creation on scheduled failures.
44
+ - Report always written, even on early failures (venv creation, install).
45
+ - Explicit `issues: write` permission for auto-issue behavior.
46
+
47
+ ### Added — E2E Reporting (Track C)
48
+
49
+ - **Schema v3**: Formalized E2E report contract with stdlib validator
50
+ (`scripts/validate_e2e_report.py`). Required: `schema_version`,
51
+ `timestamp_utc`, `environment`, `config`, `summary`, `tests`, `artifacts`.
52
+ Per-test entries: `name`, `status`, `duration_s`, `file`, `error`,
53
+ `screenshot`.
54
+ - **Failure metadata**: `error` field populated from `call.excinfo` /
55
+ `report.longrepr`. `screenshot` field populated on failure, attached by
56
+ `nodeid` match. Both nullable for passed/skipped tests.
57
+ - **Historical trend artifacts** (`scripts/e2e_trend.py`): Archives
58
+ validated reports into `e2e-history.json` (max 30 runs, dedup by
59
+ timestamp). Renders `e2e-trend.md` with pass-rate, duration, budget, and
60
+ failure trends.
61
+ - **Lifecycle integration**: Report validation, failure metadata capture,
62
+ and trend generation all wired into `pytest_sessionfinish`.
63
+
64
+ ### Operational Safety
65
+
66
+ - No benchmark performance thresholds (measurement only).
67
+ - No E2E regression gates (observational trends).
68
+ - No live tests enabled by default.
69
+ - Default CI unaffected by any new workflow.
70
+
10
71
  ## [2.0.2] — 2026-06-15
11
72
 
12
73
  ### Fixed — CLI entry point (#148)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superbrowser-sdk
3
- Version: 2.0.2
3
+ Version: 2.1.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
@@ -1,6 +1,6 @@
1
1
  # API Reference
2
2
 
3
- > **Super Browser** v2.0.0a1 — Complete public API documentation.
3
+ > **Super Browser** v2.1.0 — Complete public API documentation.
4
4
 
5
5
  This reference covers every public class, method, and function in Super Browser. Classes are grouped by subsystem.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Architecture
2
2
 
3
- > **Super Browser** v2.0.0a1 — System architecture, data flow, and extension points.
3
+ > **Super Browser** v2.1.0 — System architecture, data flow, and extension points.
4
4
 
5
5
  ---
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
- super-browser stealth-check
175
+ superbrowser stealth-check
176
176
 
177
177
  # With options
178
- super-browser stealth-check --format html --threshold 80
178
+ superbrowser stealth-check --format html --threshold 80
179
179
 
180
180
  # Online check — requires live browser
181
- super-browser stealth-check --online
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
- super-browser stealth-validate --capture-baseline
33
+ superbrowser stealth-validate --capture-baseline
34
34
 
35
35
  # Run validation against baseline
36
- super-browser stealth-validate --profile windows-chrome-stable --seed my-session
36
+ superbrowser stealth-validate --profile windows-chrome-stable --seed my-session
37
37
 
38
38
  # CI mode: exit code 1 on any regression
39
- super-browser stealth-validate --ci
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: `super-browser stealth-validate --capture-baseline` saves baseline JSON
66
- 2. CI run: `super-browser stealth-validate --ci` compares and exits 1 on regression
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
- super-browser memory list
227
+ superbrowser memory list
228
228
 
229
229
  # Show memory for a specific domain
230
- super-browser memory show shop.example.com
230
+ superbrowser memory show shop.example.com
231
231
 
232
232
  # Clear memory for a domain
233
- super-browser memory clear shop.example.com
233
+ superbrowser memory clear shop.example.com
234
234
 
235
235
  # Prune expired entries
236
- super-browser memory prune
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.0.2"
7
+ version = "2.1.0"
8
8
  description = "Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }