superbrowser-sdk 2.6.0__tar.gz → 2.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/CHANGELOG.md +12 -0
  2. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/PKG-INFO +1 -1
  3. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/api-reference.md +30 -0
  4. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/mcp.md +9 -6
  5. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/pyproject.toml +1 -1
  6. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/__init__.py +1 -1
  7. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/facade.py +54 -0
  8. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/mcp_server.py +69 -0
  9. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_diagnostics.py +3 -3
  10. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_navigation.py +167 -11
  11. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_server.py +4 -4
  12. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.env.example +0 -0
  13. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/adversarial-v3.yml +0 -0
  14. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/adversarial.yml +0 -0
  15. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/benchmark.yml +0 -0
  16. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/dco.yml +0 -0
  17. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/e2e.yml +0 -0
  18. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/publish.yml +0 -0
  19. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/smoke.yml +0 -0
  20. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/stress.yml +0 -0
  21. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.github/workflows/test.yml +0 -0
  22. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.gitignore +0 -0
  23. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/.pre-commit-config.yaml +0 -0
  24. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/CONTRIBUTING.md +0 -0
  25. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/Dockerfile +0 -0
  26. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/LICENSE +0 -0
  27. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/README.md +0 -0
  28. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/Super-Browser.png +0 -0
  29. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/behavioral.html +0 -0
  30. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/dom-heavy.html +0 -0
  31. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/form.html +0 -0
  32. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/fixtures/simple.html +0 -0
  33. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
  34. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
  35. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/conftest.py +0 -0
  36. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docker-compose.yml +0 -0
  37. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/agent-reliability.md +0 -0
  38. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
  39. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/anti-detection-ejecta.md +0 -0
  40. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/api-ergonomics-audit.md +0 -0
  41. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/api-stability.md +0 -0
  42. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/architecture.md +0 -0
  43. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/behavioral-synthesis.md +0 -0
  44. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/browser-networking.md +0 -0
  45. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/cloak-integration.md +0 -0
  46. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/consistency-engine.md +0 -0
  47. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/design/inspect_redaction.md +0 -0
  48. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
  49. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/error-catalog.md +0 -0
  50. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/fingerprint-scoring.md +0 -0
  51. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/fingerprint-validation.md +0 -0
  52. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/gap-analysis.md +0 -0
  53. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/human-behavior.md +0 -0
  54. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/memory.md +0 -0
  55. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/migration/v1-to-v2.md +0 -0
  56. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/migration/v1.8-to-v1.9.md +0 -0
  57. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/operating-doctrine.md +0 -0
  58. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/platform-abstraction.md +0 -0
  59. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/plugins.md +0 -0
  60. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/quickstart.md +0 -0
  61. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/recording.md +0 -0
  62. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/README.md +0 -0
  63. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-decomposition.md +0 -0
  64. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
  65. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
  66. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
  67. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
  68. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
  69. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/stealth-coverage.md +0 -0
  70. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/docs/stealth-evidence.md +0 -0
  71. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/backend_selection.py +0 -0
  72. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/basic_usage.py +0 -0
  73. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/budget_tracking.py +0 -0
  74. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/cloak_stealth.py +0 -0
  75. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/error_handling.py +0 -0
  76. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/fingerprint_scan.py +0 -0
  77. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/human_behavior.py +0 -0
  78. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/multi_tab_workflow.py +0 -0
  79. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/session_persistence.py +0 -0
  80. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/examples/stealth_mode.py +0 -0
  81. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/adversarial_run.py +0 -0
  82. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/agent_efficiency_benchmark.py +0 -0
  83. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/browser_benchmark.py +0 -0
  84. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/e2e_trend.py +0 -0
  85. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/run_stealth_gauntlet.sh +0 -0
  86. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/smoke_published.py +0 -0
  87. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/stress_real_world.py +0 -0
  88. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/validate_e2e_report.py +0 -0
  89. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/scripts/verify_release_artifact.py +0 -0
  90. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/__main__.py +0 -0
  91. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/__init__.py +0 -0
  92. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/config.py +0 -0
  93. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/debug.py +0 -0
  94. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/delegator.py +0 -0
  95. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/diagnostics.py +0 -0
  96. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/__init__.py +0 -0
  97. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
  98. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
  99. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
  100. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/factory.py +0 -0
  101. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/openai_client.py +0 -0
  102. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/llm/protocol.py +0 -0
  103. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/loop.py +0 -0
  104. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/loop_detector.py +0 -0
  105. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/plugins.py +0 -0
  106. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/registry.py +0 -0
  107. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/router.py +0 -0
  108. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/structured_logging.py +0 -0
  109. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/agent/types.py +0 -0
  110. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/__init__.py +0 -0
  111. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/bezier.py +0 -0
  112. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/dwell.py +0 -0
  113. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/fitts.py +0 -0
  114. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/gauss.py +0 -0
  115. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/keyboard.py +0 -0
  116. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/mouse.py +0 -0
  117. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/navigation.py +0 -0
  118. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/orchestrator.py +0 -0
  119. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/prng.py +0 -0
  120. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/qwerty.py +0 -0
  121. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/scroll.py +0 -0
  122. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/session_seed.py +0 -0
  123. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/behavioral/types.py +0 -0
  124. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/__init__.py +0 -0
  125. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/__init__.py +0 -0
  126. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
  127. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
  128. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
  129. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
  130. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/cdp.py +0 -0
  131. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/cloak_backend.py +0 -0
  132. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/cloud.py +0 -0
  133. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/config.py +0 -0
  134. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/discovery.py +0 -0
  135. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/engine.py +0 -0
  136. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/fetch.py +0 -0
  137. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/__init__.py +0 -0
  138. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
  139. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
  140. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
  141. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/page.py +0 -0
  142. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/session.py +0 -0
  143. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/shutdown.py +0 -0
  144. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/browser/tabs.py +0 -0
  145. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/__init__.py +0 -0
  146. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/cascade.py +0 -0
  147. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/client.py +0 -0
  148. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/compressor.py +0 -0
  149. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/cost_estimator.py +0 -0
  150. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/credential_pool.py +0 -0
  151. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/governor.py +0 -0
  152. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/budget/types.py +0 -0
  153. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/__init__.py +0 -0
  154. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/commands.py +0 -0
  155. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/interactive.py +0 -0
  156. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/cli/script.py +0 -0
  157. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/config.py +0 -0
  158. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/events/__init__.py +0 -0
  159. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/events/bus.py +0 -0
  160. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/events/types.py +0 -0
  161. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/__init__.py +0 -0
  162. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/cache.py +0 -0
  163. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/controller.py +0 -0
  164. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/decorator.py +0 -0
  165. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/presets.py +0 -0
  166. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/recovery.py +0 -0
  167. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/snapshot.py +0 -0
  168. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/types.py +0 -0
  169. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/interaction/vision.py +0 -0
  170. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/__init__.py +0 -0
  171. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/integration.py +0 -0
  172. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/store.py +0 -0
  173. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/memory/types.py +0 -0
  174. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/plugins/__init__.py +0 -0
  175. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/plugins/decorators.py +0 -0
  176. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/plugins/hooks.py +0 -0
  177. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/py.typed +0 -0
  178. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/__init__.py +0 -0
  179. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/persistence.py +0 -0
  180. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/recorder.py +0 -0
  181. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/replayer.py +0 -0
  182. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/report.py +0 -0
  183. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recording/types.py +0 -0
  184. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/__init__.py +0 -0
  185. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/checkpoint.py +0 -0
  186. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/classifier.py +0 -0
  187. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/coordinator.py +0 -0
  188. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/event_bus.py +0 -0
  189. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/format_validator.py +0 -0
  190. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/reflection.py +0 -0
  191. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/retry_tracker.py +0 -0
  192. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/session_recovery.py +0 -0
  193. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/types.py +0 -0
  194. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/recovery/watchdogs.py +0 -0
  195. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/__init__.py +0 -0
  196. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/output.py +0 -0
  197. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/typed.py +0 -0
  198. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/types.py +0 -0
  199. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/results/validation.py +0 -0
  200. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/__init__.py +0 -0
  201. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/action_redaction.py +0 -0
  202. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/approval.py +0 -0
  203. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/credential_vault.py +0 -0
  204. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/domain_filter.py +0 -0
  205. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/gate.py +0 -0
  206. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/injection.py +0 -0
  207. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/manager.py +0 -0
  208. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/policy.py +0 -0
  209. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/redactor.py +0 -0
  210. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/security/types.py +0 -0
  211. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/session/__init__.py +0 -0
  212. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/session/proxy.py +0 -0
  213. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/__init__.py +0 -0
  214. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/activation.py +0 -0
  215. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/markdown.py +0 -0
  216. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/registry.py +0 -0
  217. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/skills/types.py +0 -0
  218. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/__init__.py +0 -0
  219. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/action_policy.py +0 -0
  220. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/captcha.py +0 -0
  221. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
  222. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/cache.py +0 -0
  223. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/pow.py +0 -0
  224. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
  225. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
  226. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/dag.py +0 -0
  227. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/derive.py +0 -0
  228. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/errors.py +0 -0
  229. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/inject.py +0 -0
  230. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
  231. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
  232. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/prng.py +0 -0
  233. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rule.py +0 -0
  234. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
  235. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
  236. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
  237. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
  238. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
  239. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
  240. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
  241. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
  242. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
  243. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/diagnostics.py +0 -0
  244. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
  245. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
  246. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
  247. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
  248. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/config.py +0 -0
  249. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
  250. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
  251. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/types.py +0 -0
  252. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
  253. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
  254. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
  255. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/headers.py +0 -0
  256. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/human.py +0 -0
  257. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/human_config.py +0 -0
  258. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/ip_reputation.py +0 -0
  259. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/manager.py +0 -0
  260. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
  261. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
  262. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
  263. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
  264. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
  265. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
  266. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/profiles/schema.py +0 -0
  267. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/proxy.py +0 -0
  268. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/proxy_pool.py +0 -0
  269. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/report.py +0 -0
  270. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/scoring.py +0 -0
  271. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/tls_baselines.json +0 -0
  272. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
  273. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/types.py +0 -0
  274. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
  275. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/__init__.py +0 -0
  276. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/checks.py +0 -0
  277. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/harness.py +0 -0
  278. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/report.py +0 -0
  279. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/stealth/validation/suite.py +0 -0
  280. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/testing.py +0 -0
  281. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/__init__.py +0 -0
  282. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/cost_analytics.py +0 -0
  283. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/flow_logger.py +0 -0
  284. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/middleware.py +0 -0
  285. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/session_db.py +0 -0
  286. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/sinks.py +0 -0
  287. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/tracing/types.py +0 -0
  288. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/__init__.py +0 -0
  289. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/ax_diff.py +0 -0
  290. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/hasher.py +0 -0
  291. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/types.py +0 -0
  292. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/verification/verifier.py +0 -0
  293. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/__init__.py +0 -0
  294. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/cache.py +0 -0
  295. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/controller.py +0 -0
  296. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/coords.py +0 -0
  297. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/factory.py +0 -0
  298. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/ocr.py +0 -0
  299. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/providers.py +0 -0
  300. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/src/super_browser/vision/types.py +0 -0
  301. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/stress/__init__.py +0 -0
  302. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/stress/server.py +0 -0
  303. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/__init__.py +0 -0
  304. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/__init__.py +0 -0
  305. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/conftest.py +0 -0
  306. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/controlled_server.py +0 -0
  307. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/report.py +0 -0
  308. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/scoring.py +0 -0
  309. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/targets.py +0 -0
  310. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_controlled_server.py +0 -0
  311. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_targets_unit.py +0 -0
  312. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_tier1_scanners.py +0 -0
  313. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_tier2_vendors.py +0 -0
  314. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial/test_tier3_controlled.py +0 -0
  315. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/README.md +0 -0
  316. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/__init__.py +0 -0
  317. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/backends.py +0 -0
  318. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +0 -0
  319. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/core.py +0 -0
  320. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/engines/__init__.py +0 -0
  321. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/engines/scoring.py +0 -0
  322. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/harness.py +0 -0
  323. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/__init__.py +0 -0
  324. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/history.py +0 -0
  325. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +0 -0
  326. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +0 -0
  327. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/server.py +0 -0
  328. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/__init__.py +0 -0
  329. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/automation.py +0 -0
  330. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/behavioral.py +0 -0
  331. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/controlled.py +0 -0
  332. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/ejector.py +0 -0
  333. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/external.py +0 -0
  334. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +0 -0
  335. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/adversarial3/vectors/network.py +0 -0
  336. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/pytest.ini +0 -0
  337. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/run.py +0 -0
  338. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/__init__.py +0 -0
  339. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/conftest.py +0 -0
  340. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_backends.py +0 -0
  341. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_behavioral_telemetry.py +0 -0
  342. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +0 -0
  343. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_behavioral_vectors.py +0 -0
  344. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_core.py +0 -0
  345. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_external.py +0 -0
  346. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_harness_smoke.py +0 -0
  347. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_header_ordering.py +0 -0
  348. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_reporters.py +0 -0
  349. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_scoring.py +0 -0
  350. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_server.py +0 -0
  351. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_superbrowser_backend.py +0 -0
  352. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/adversarial_v3/tests/test_vectors.py +0 -0
  353. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/conftest.py +0 -0
  354. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/__init__.py +0 -0
  355. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/conftest.py +0 -0
  356. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_01_example_nav.py +0 -0
  357. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_02_google_search.py +0 -0
  358. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_03_github_login.py +0 -0
  359. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
  360. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_05_google_forms.py +0 -0
  361. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_06_google_flights.py +0 -0
  362. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
  363. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
  364. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_09_form_complex.py +0 -0
  365. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
  366. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/__init__.py +0 -0
  367. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/conftest.py +0 -0
  368. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_behavioral_realism.py +0 -0
  369. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_challenge_detection.py +0 -0
  370. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_interaction.py +0 -0
  371. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_live_navigation.py +0 -0
  372. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_multi_tab.py +0 -0
  373. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_navigation.py +0 -0
  374. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_session_persistence.py +0 -0
  375. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e/test_stealth_overhead.py +0 -0
  376. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/e2e_v1_3_journey.py +0 -0
  377. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/__init__.py +0 -0
  378. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/conftest.py +0 -0
  379. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_config_composition.py +0 -0
  380. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_engine_backends.py +0 -0
  381. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_error_paths.py +0 -0
  382. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_facade_smoke.py +0 -0
  383. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_full_lifecycle.py +0 -0
  384. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_multi_backend.py +0 -0
  385. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_performance_smoke.py +0 -0
  386. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_playwright_integration.py +0 -0
  387. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_public_api.py +0 -0
  388. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_session_persistence.py +0 -0
  389. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_stealth_abstraction.py +0 -0
  390. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v1100_features.py +0 -0
  391. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v150_features.py +0 -0
  392. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v160_features.py +0 -0
  393. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v170_features.py +0 -0
  394. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v180_features.py +0 -0
  395. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v190_features.py +0 -0
  396. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v191_features.py +0 -0
  397. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v192_features.py +0 -0
  398. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v193_features.py +0 -0
  399. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v194_features.py +0 -0
  400. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v195_features.py +0 -0
  401. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v1_3_features.py +0 -0
  402. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/integration/test_v1_4_features.py +0 -0
  403. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/pattern_validation.py +0 -0
  404. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/__init__.py +0 -0
  405. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/conftest.py +0 -0
  406. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
  407. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_cli_switches.py +0 -0
  408. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
  409. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_live_sites.py +0 -0
  410. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
  411. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
  412. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/stealth_detection/test_webdriver.py +0 -0
  413. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/__init__.py +0 -0
  414. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_action_timeout.py +0 -0
  415. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_browser_transport.py +0 -0
  416. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_controller_rebinding.py +0 -0
  417. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_debug_mode.py +0 -0
  418. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_default_tooling.py +0 -0
  419. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_delegator.py +0 -0
  420. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_error_screenshots.py +0 -0
  421. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade.py +0 -0
  422. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security.py +0 -0
  423. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_control.py +0 -0
  424. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
  425. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_network.py +0 -0
  426. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_facade_security_session.py +0 -0
  427. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_fail_fast.py +0 -0
  428. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm.py +0 -0
  429. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm_budget.py +0 -0
  430. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm_production.py +0 -0
  431. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_llm_streaming.py +0 -0
  432. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_loop.py +0 -0
  433. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_loop_detector.py +0 -0
  434. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_prompt_isolation.py +0 -0
  435. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_registry.py +0 -0
  436. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_retry_budget.py +0 -0
  437. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_streaming.py +0 -0
  438. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_structured_logging.py +0 -0
  439. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_tab_cap.py +0 -0
  440. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_task_02.py +0 -0
  441. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_agent/test_types.py +0 -0
  442. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/__init__.py +0 -0
  443. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_behavioral.py +0 -0
  444. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_dwell.py +0 -0
  445. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_hardening.py +0 -0
  446. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
  447. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_navigation.py +0 -0
  448. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_orchestrator.py +0 -0
  449. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_behavioral/test_session_seed.py +0 -0
  450. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmark/__init__.py +0 -0
  451. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmark/test_efficiency.py +0 -0
  452. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
  453. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_benchmarks/test_stress_real_world.py +0 -0
  454. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/__init__.py +0 -0
  455. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cdp.py +0 -0
  456. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cdp_backend.py +0 -0
  457. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cloak_backend.py +0 -0
  458. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cloak_docs.py +0 -0
  459. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_cloak_integration.py +0 -0
  460. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_config.py +0 -0
  461. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_discovery.py +0 -0
  462. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_engine_protocol.py +0 -0
  463. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_fetch.py +0 -0
  464. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_injectors.py +0 -0
  465. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_page.py +0 -0
  466. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_patchright_backend.py +0 -0
  467. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_playwright_backend.py +0 -0
  468. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_selenium_backend.py +0 -0
  469. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_session.py +0 -0
  470. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_browser/test_shutdown.py +0 -0
  471. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/__init__.py +0 -0
  472. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_cascade.py +0 -0
  473. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_cascade_governor.py +0 -0
  474. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_circuit_breaker.py +0 -0
  475. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_client.py +0 -0
  476. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_compressor.py +0 -0
  477. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_cost_estimator.py +0 -0
  478. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_credential_pool.py +0 -0
  479. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_governor.py +0 -0
  480. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_budget/test_types.py +0 -0
  481. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_interactive.py +0 -0
  482. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_script.py +0 -0
  483. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_stealth_check.py +0 -0
  484. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_stealth_validate.py +0 -0
  485. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_cli/test_unified_cli.py +0 -0
  486. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_config.py +0 -0
  487. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_diagnostics.py +0 -0
  488. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_e2e/test_report_schema.py +0 -0
  489. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_e2e/test_trend.py +0 -0
  490. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_audio.py +0 -0
  491. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
  492. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
  493. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_browser_apis.py +0 -0
  494. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_canvas.py +0 -0
  495. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_integration.py +0 -0
  496. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_timing.py +0 -0
  497. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_ejecta/test_webrtc.py +0 -0
  498. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_events/test_event_bus.py +0 -0
  499. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
  500. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_governance_docs.py +0 -0
  501. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/__init__.py +0 -0
  502. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_cache.py +0 -0
  503. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_controller.py +0 -0
  504. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_decorator.py +0 -0
  505. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_injection.py +0 -0
  506. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_page_change.py +0 -0
  507. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_presets.py +0 -0
  508. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_recovery.py +0 -0
  509. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_snapshot.py +0 -0
  510. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_types.py +0 -0
  511. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_interaction/test_vision.py +0 -0
  512. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_entrypoint.py +0 -0
  513. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_permissions.py +0 -0
  514. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_redaction.py +0 -0
  515. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_server_smoke.py +0 -0
  516. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_write_tools.py +0 -0
  517. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_mcp_write_tools_wave2.py +0 -0
  518. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/__init__.py +0 -0
  519. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/test_cli_config.py +0 -0
  520. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/test_integration.py +0 -0
  521. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_memory/test_store.py +0 -0
  522. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/__init__.py +0 -0
  523. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/test_persistence.py +0 -0
  524. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/test_recorder.py +0 -0
  525. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recording/test_replayer.py +0 -0
  526. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/__init__.py +0 -0
  527. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_checkpoint.py +0 -0
  528. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_classifier.py +0 -0
  529. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_coordinator.py +0 -0
  530. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_event_bus.py +0 -0
  531. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_format_validator.py +0 -0
  532. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_reflection.py +0 -0
  533. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_retry_tracker.py +0 -0
  534. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_session_recovery.py +0 -0
  535. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_types.py +0 -0
  536. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_recovery/test_watchdogs.py +0 -0
  537. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_release/test_naming_consistency.py +0 -0
  538. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_release/test_smoke_published.py +0 -0
  539. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_release/test_verify_artifact.py +0 -0
  540. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/__init__.py +0 -0
  541. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_batch40_integration.py +0 -0
  542. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_categories.py +0 -0
  543. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_output.py +0 -0
  544. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_typed.py +0 -0
  545. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_types.py +0 -0
  546. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_results/test_validation.py +0 -0
  547. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_runtime_correctness/__init__.py +0 -0
  548. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_runtime_correctness/test_runtime_fixes.py +0 -0
  549. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/__init__.py +0 -0
  550. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_approval.py +0 -0
  551. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_credential_vault.py +0 -0
  552. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_domain_filter.py +0 -0
  553. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_injection.py +0 -0
  554. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_manager.py +0 -0
  555. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_policy.py +0 -0
  556. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_redaction_pipeline.py +0 -0
  557. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_redactor.py +0 -0
  558. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_security/test_types.py +0 -0
  559. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_session/__init__.py +0 -0
  560. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_session/test_locale.py +0 -0
  561. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_session/test_proxy.py +0 -0
  562. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/__init__.py +0 -0
  563. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_activation.py +0 -0
  564. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_integration.py +0 -0
  565. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_markdown.py +0 -0
  566. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_registry.py +0 -0
  567. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_skills/test_types.py +0 -0
  568. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/__init__.py +0 -0
  569. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_action_policy.py +0 -0
  570. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_captcha.py +0 -0
  571. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
  572. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_challenge_cache.py +0 -0
  573. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_challenge_config.py +0 -0
  574. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
  575. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_consistency_inject.py +0 -0
  576. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_diagnostics.py +0 -0
  577. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
  578. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
  579. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
  580. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
  581. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_headers.py +0 -0
  582. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_human.py +0 -0
  583. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
  584. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_ip_reputation.py +0 -0
  585. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_kasada_detection.py +0 -0
  586. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_manager.py +0 -0
  587. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
  588. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_profiles.py +0 -0
  589. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_proxy.py +0 -0
  590. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_proxy_pool.py +0 -0
  591. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
  592. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
  593. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
  594. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_types.py +0 -0
  595. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
  596. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_stealth/test_validation.py +0 -0
  597. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/__init__.py +0 -0
  598. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_cost_analytics.py +0 -0
  599. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_flow_logger.py +0 -0
  600. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_middleware.py +0 -0
  601. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_session_db.py +0 -0
  602. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_sinks.py +0 -0
  603. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_tracing/test_types.py +0 -0
  604. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/__init__.py +0 -0
  605. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_ax_diff.py +0 -0
  606. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_hasher.py +0 -0
  607. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_types.py +0 -0
  608. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_verification/test_verifier.py +0 -0
  609. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/__init__.py +0 -0
  610. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_cache.py +0 -0
  611. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_controller.py +0 -0
  612. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_coords.py +0 -0
  613. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_factory.py +0 -0
  614. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_ocr.py +0 -0
  615. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_providers.py +0 -0
  616. {superbrowser_sdk-2.6.0 → superbrowser_sdk-2.7.0}/tests/test_vision/test_types.py +0 -0
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.7.0] — 2026-06-26
9
+
10
+ ### Added — MCP reload and history navigation tools (P3.0B)
11
+
12
+ - `reload`, `go_back`, `go_forward` are now navigation-tier MCP tools
13
+ (default-allowed, not action-budgeted). Each delegates to a new thin facade
14
+ method that calls the underlying Playwright page method.
15
+ - `go_back` and `go_forward` return a structured error when there is no
16
+ history entry to navigate to.
17
+ - Default advertised tools: 14 → 17; action mode: 20 → 23.
18
+ - Diagnostics remain session-wide after navigation.
19
+
8
20
  ## [2.6.0] — 2026-06-26
9
21
 
10
22
  ### Added — MCP switch_tab navigation tool (P3.0A)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superbrowser-sdk
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade
5
5
  Project-URL: Homepage, https://github.com/Octo-Lex/Super-Browser
6
6
  Project-URL: Documentation, https://github.com/Octo-Lex/Super-Browser#readme
@@ -101,6 +101,36 @@ if result.ok:
101
101
  print(result.data.final_url) # "https://example.com/"
102
102
  ```
103
103
 
104
+ #### `reload(*, wait_until="domcontentloaded") → ActionResult`
105
+
106
+ Reload the current page.
107
+
108
+ | Parameter | Type | Default | Description |
109
+ |---|---|---|---|
110
+ | `wait_until` | `str` | `"domcontentloaded"` | Playwright load event to wait for. |
111
+
112
+ **Returns:** `ActionResult` with `data.url` (the page URL after reload).
113
+
114
+ #### `go_back(*, wait_until="domcontentloaded") → ActionResult`
115
+
116
+ Go back one step in browser history.
117
+
118
+ | Parameter | Type | Default | Description |
119
+ |---|---|---|---|
120
+ | `wait_until` | `str` | `"domcontentloaded"` | Playwright load event to wait for. |
121
+
122
+ **Returns:** `ActionResult` with `data.url`, or `ok=False` if there is no previous history entry.
123
+
124
+ #### `go_forward(*, wait_until="domcontentloaded") → ActionResult`
125
+
126
+ Go forward one step in browser history.
127
+
128
+ | Parameter | Type | Default | Description |
129
+ |---|---|---|---|
130
+ | `wait_until` | `str` | `"domcontentloaded"` | Playwright load event to wait for. |
131
+
132
+ **Returns:** `ActionResult` with `data.url`, or `ok=False` if there is no next history entry.
133
+
104
134
  ### Interaction
105
135
 
106
136
  #### `click(target, *, description=None) → ActionResult`
@@ -5,8 +5,8 @@ Super Browser exposes its browser inspection and control surface over the
5
5
  agents (Claude, Cursor, etc.) can observe and interact with a page without
6
6
  scripting Python.
7
7
 
8
- The stdio server advertises **fourteen tools by default** (six inspect + five
9
- diagnostics + three navigation) — enough to read a URL end-to-end and explain
8
+ The stdio server advertises **seventeen tools by default** (six inspect + five
9
+ diagnostics + six navigation) — enough to read a URL end-to-end and explain
10
10
  why a read failed. When action mode is enabled, it advertises **six additional
11
11
  action tools**; every action call is checked by
12
12
  `MCPSessionPolicy` and `SecurityManager` before it can reach the browser.
@@ -31,12 +31,12 @@ python -m patchright install chromium
31
31
  Either of:
32
32
 
33
33
  ```bash
34
- superbrowser-mcp # default: 14 tools (inspect + diagnostics + navigation)
35
- superbrowser-mcp --allow-actions # 20 tools (adds the action tier)
34
+ superbrowser-mcp # default: 17 tools (inspect + diagnostics + navigation)
35
+ superbrowser-mcp --allow-actions # 23 tools (adds the action tier)
36
36
  python -m super_browser.mcp_server
37
37
  ```
38
38
 
39
- Both start a **stdio** server. The default server advertises 14 tools and
39
+ Both start a **stdio** server. The default server advertises 17 tools and
40
40
  recognizes (but refuses) action-tool calls with a structured policy refusal.
41
41
 
42
42
  Action mode can also be enabled via the environment:
@@ -149,6 +149,9 @@ and do **not** require action mode.
149
149
  | `navigate` | `url` (required), `wait_until` (optional) | Go to a URL. URL is passed to `SecurityManager` for injection detection, secret redaction, and domain allow/block enforcement. |
150
150
  | `wait_for` | exactly one of `selector` / `text` / `url` / `load_state`; `timeout_ms` (optional, 100–60000, default 10000) | Wait for a page condition before the next read. |
151
151
  | `switch_tab` | `tab_id` (required, integer) | Switch the active browser tab by ID (from `list_tabs`). Changes the page the agent reads from. Diagnostics remain session-wide after switching; per-tab diagnostics are not supported yet. |
152
+ | `reload` | `wait_until` (optional) | Reload the current page. Returns the URL after reload. |
153
+ | `go_back` | `wait_until` (optional) | Go back one step in browser history. Returns a structured error if there is no previous entry. |
154
+ | `go_forward` | `wait_until` (optional) | Go forward one step in browser history. Returns a structured error if there is no next entry. |
152
155
 
153
156
  `wait_for` accepts exactly one condition per call (deterministic single
154
157
  results; compound waits can be added later as an explicit AND mode).
@@ -230,7 +233,7 @@ restricts the survivors.
230
233
 
231
234
  The default server behavior partitions the surface by risk:
232
235
 
233
- - **`list_tools()`** advertises only the Inspect + Navigation tiers (14 tools).
236
+ - **`list_tools()`** advertises only the Inspect + Navigation tiers (17 tools).
234
237
  - **`call_tool()`** still recognizes action-tool names and returns a structured
235
238
  policy refusal (`refusal.reason = "actions are disabled"`), not an "Unknown
236
239
  tool" error.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "superbrowser-sdk"
7
- version = "2.6.0"
7
+ version = "2.7.0"
8
8
  description = "Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -6,7 +6,7 @@ from super_browser.agent.types import StreamEvent as StreamEvent # noqa: F401
6
6
  from super_browser.config import Config as Config # noqa: F401
7
7
  from super_browser.results.types import ActionResult as ActionResult # noqa: F401
8
8
 
9
- __version__ = "2.6.0"
9
+ __version__ = "2.7.0"
10
10
 
11
11
  __all__ = [
12
12
  "SuperBrowser",
@@ -240,6 +240,60 @@ class SuperBrowser:
240
240
  method=ActionMethod.SELECTOR,
241
241
  )
242
242
 
243
+ async def reload(self, *, wait_until: str = "domcontentloaded") -> ActionResult:
244
+ """Reload the current page."""
245
+ if not self._page:
246
+ return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Not started"))
247
+ params = {"wait_until": wait_until}
248
+ sec = await self._check_facade_security("reload", params, security_level="sensitive")
249
+ if sec is not None:
250
+ return sec
251
+ wait_until = params["wait_until"]
252
+ start = time.monotonic()
253
+ await self._page.backend_page.reload(wait_until=wait_until)
254
+ return timed_action_result(
255
+ ok=True, start_ns=start, data={"url": self._page.url},
256
+ method=ActionMethod.SELECTOR,
257
+ )
258
+
259
+ async def go_back(self, *, wait_until: str = "domcontentloaded") -> ActionResult:
260
+ """Navigate to the previous page in browser history."""
261
+ if not self._page:
262
+ return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Not started"))
263
+ params = {"wait_until": wait_until}
264
+ sec = await self._check_facade_security("go_back", params, security_level="sensitive")
265
+ if sec is not None:
266
+ return sec
267
+ wait_until = params["wait_until"]
268
+ start = time.monotonic()
269
+ response = await self._page.backend_page.go_back(wait_until=wait_until)
270
+ if response is None:
271
+ return action_result(ok=False, error=ActionError(
272
+ ErrorCategory.PAGE_ERROR, "No history entry to go back to"))
273
+ return timed_action_result(
274
+ ok=True, start_ns=start, data={"url": self._page.url},
275
+ method=ActionMethod.SELECTOR,
276
+ )
277
+
278
+ async def go_forward(self, *, wait_until: str = "domcontentloaded") -> ActionResult:
279
+ """Navigate to the next page in browser history."""
280
+ if not self._page:
281
+ return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Not started"))
282
+ params = {"wait_until": wait_until}
283
+ sec = await self._check_facade_security("go_forward", params, security_level="sensitive")
284
+ if sec is not None:
285
+ return sec
286
+ wait_until = params["wait_until"]
287
+ start = time.monotonic()
288
+ response = await self._page.backend_page.go_forward(wait_until=wait_until)
289
+ if response is None:
290
+ return action_result(ok=False, error=ActionError(
291
+ ErrorCategory.PAGE_ERROR, "No history entry to go forward to"))
292
+ return timed_action_result(
293
+ ok=True, start_ns=start, data={"url": self._page.url},
294
+ method=ActionMethod.SELECTOR,
295
+ )
296
+
243
297
  async def click(self, target: str, *, description: Optional[str] = None) -> ActionResult:
244
298
  if not self._controller:
245
299
  return action_result(ok=False, error=ActionError(ErrorCategory.BROWSER_CRASH, "Browser not started. Call await sb.start() first."))
@@ -141,6 +141,51 @@ NAVIGATION_AUX_TOOLS: list[types.Tool] = [
141
141
  "required": ["tab_id"],
142
142
  },
143
143
  ),
144
+ types.Tool(
145
+ name="reload",
146
+ description="Reload the current page. Navigation-tier tool (default-allowed).",
147
+ inputSchema={
148
+ "type": "object",
149
+ "properties": {
150
+ "wait_until": {
151
+ "type": "string",
152
+ "enum": ["load", "domcontentloaded", "networkidle"],
153
+ "default": "domcontentloaded",
154
+ },
155
+ },
156
+ "required": [],
157
+ },
158
+ ),
159
+ types.Tool(
160
+ name="go_back",
161
+ description="Go back one step in browser history. Navigation-tier tool (default-allowed).",
162
+ inputSchema={
163
+ "type": "object",
164
+ "properties": {
165
+ "wait_until": {
166
+ "type": "string",
167
+ "enum": ["load", "domcontentloaded", "networkidle"],
168
+ "default": "domcontentloaded",
169
+ },
170
+ },
171
+ "required": [],
172
+ },
173
+ ),
174
+ types.Tool(
175
+ name="go_forward",
176
+ description="Go forward one step in browser history. Navigation-tier tool (default-allowed).",
177
+ inputSchema={
178
+ "type": "object",
179
+ "properties": {
180
+ "wait_until": {
181
+ "type": "string",
182
+ "enum": ["load", "domcontentloaded", "networkidle"],
183
+ "default": "domcontentloaded",
184
+ },
185
+ },
186
+ "required": [],
187
+ },
188
+ ),
144
189
  ]
145
190
 
146
191
  _NAVIGATION_AUX_TOOL_NAMES = frozenset(t.name for t in NAVIGATION_AUX_TOOLS)
@@ -924,6 +969,15 @@ class ToolDispatcher:
924
969
  )
925
970
  return None
926
971
 
972
+ if name in ("reload", "go_back", "go_forward"):
973
+ wait_until = arguments.get("wait_until", "domcontentloaded")
974
+ if wait_until not in ("load", "domcontentloaded", "networkidle"):
975
+ return _error_content(
976
+ "'wait_until' must be one of: load, domcontentloaded, networkidle",
977
+ kind="invalid_arguments",
978
+ )
979
+ return None
980
+
927
981
  if name == "wait_for":
928
982
  # timeout_ms: integer, 100 <= x <= 60000. Reject bool (int subtype).
929
983
  timeout_ms = arguments.get("timeout_ms", 10000)
@@ -1048,6 +1102,21 @@ class ToolDispatcher:
1048
1102
  ar = await sb.switch_tab(arguments["tab_id"])
1049
1103
  return _text_content(_serialize_action_result(ar))
1050
1104
 
1105
+ async def _tool_reload(self, arguments: dict[str, Any]) -> list[types.TextContent]:
1106
+ sb = await self.runtime.get_browser()
1107
+ ar = await sb.reload(wait_until=arguments.get("wait_until", "domcontentloaded"))
1108
+ return _text_content(_serialize_action_result(ar))
1109
+
1110
+ async def _tool_go_back(self, arguments: dict[str, Any]) -> list[types.TextContent]:
1111
+ sb = await self.runtime.get_browser()
1112
+ ar = await sb.go_back(wait_until=arguments.get("wait_until", "domcontentloaded"))
1113
+ return _text_content(_serialize_action_result(ar))
1114
+
1115
+ async def _tool_go_forward(self, arguments: dict[str, Any]) -> list[types.TextContent]:
1116
+ sb = await self.runtime.get_browser()
1117
+ ar = await sb.go_forward(wait_until=arguments.get("wait_until", "domcontentloaded"))
1118
+ return _text_content(_serialize_action_result(ar))
1119
+
1051
1120
  async def _tool_wait_for(self, arguments: dict[str, Any]) -> list[types.TextContent]:
1052
1121
  """Wait for exactly one page condition (selector/text/url/load_state).
1053
1122
 
@@ -75,16 +75,16 @@ class TestDiagnosticsAdvertisement:
75
75
  from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
76
76
 
77
77
  names = {t.name for t in _tools_for_policy(MCPSessionPolicy())}
78
- assert len(names) == 14
78
+ assert len(names) == 17
79
79
  for diag in ("get_console_messages", "get_page_errors", "get_network_errors",
80
80
  "list_requests", "get_request"):
81
81
  assert diag in names
82
82
 
83
- def test_action_mode_advertises_20_tools(self):
83
+ def test_action_mode_advertises_23_tools(self):
84
84
  from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
85
85
 
86
86
  names = {t.name for t in _tools_for_policy(MCPSessionPolicy(allow_actions=True))}
87
- assert len(names) == 20
87
+ assert len(names) == 23
88
88
 
89
89
  def test_diagnostics_are_inspect_tier(self):
90
90
  """Diagnostics tools are in INSPECT_TOOL_NAMES (no action gate)."""
@@ -35,10 +35,10 @@ class TestTierConstants:
35
35
  "get_network_errors", "list_requests", "get_request",
36
36
  })
37
37
 
38
- def test_navigation_tool_names_has_two_tools(self):
38
+ def test_navigation_tool_names_has_six_tools(self):
39
39
  from super_browser.mcp_server import NAVIGATION_TOOL_NAMES
40
40
 
41
- assert NAVIGATION_TOOL_NAMES == frozenset({"navigate", "wait_for", "switch_tab"})
41
+ assert NAVIGATION_TOOL_NAMES == frozenset({"navigate", "wait_for", "switch_tab", "reload", "go_back", "go_forward"})
42
42
 
43
43
  def test_action_tool_names_has_six_tools(self):
44
44
  from super_browser.mcp_server import ACTION_TOOL_NAMES
@@ -77,7 +77,7 @@ class TestTierConstants:
77
77
 
78
78
  all_known = {
79
79
  "browser_status", "current_url", "observe", "extract_text",
80
- "screenshot", "list_tabs", "navigate", "wait_for", "switch_tab",
80
+ "screenshot", "list_tabs", "navigate", "wait_for", "switch_tab", "reload", "go_back", "go_forward",
81
81
  "scroll", "press_key", "click", "fill", "open_tab", "close_tab",
82
82
  "get_console_messages", "get_page_errors", "get_network_errors",
83
83
  "list_requests", "get_request",
@@ -658,7 +658,7 @@ class TestToolAdvertisement:
658
658
 
659
659
  advertised = _tools_for_policy(MCPSessionPolicy())
660
660
  names = {t.name for t in advertised}
661
- assert len(advertised) == 14
661
+ assert len(advertised) == 17
662
662
  # All 5 diagnostics tools present.
663
663
  assert {"get_console_messages", "get_page_errors", "get_network_errors",
664
664
  "list_requests", "get_request"} <= names
@@ -676,12 +676,12 @@ class TestToolAdvertisement:
676
676
  assert {t.name for t in advertised} == DEFAULT_TOOL_NAMES
677
677
  assert DEFAULT_TOOL_NAMES == INSPECT_TOOL_NAMES | NAVIGATION_TOOL_NAMES
678
678
 
679
- def test_allow_actions_advertises_20_tools(self):
679
+ def test_allow_actions_advertises_23_tools(self):
680
680
  from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
681
681
 
682
682
  advertised = _tools_for_policy(MCPSessionPolicy(allow_actions=True))
683
683
  names = {t.name for t in advertised}
684
- assert len(advertised) == 20
684
+ assert len(advertised) == 23
685
685
  # All 6 action tools present.
686
686
  assert {"scroll", "press_key", "click", "fill", "open_tab", "close_tab"} <= names
687
687
 
@@ -697,28 +697,28 @@ class TestToolAdvertisement:
697
697
  server = build_server()
698
698
  policy = server._sb_policy # type: ignore[attr-defined]
699
699
  names = {t.name for t in _tools_for_policy(policy)}
700
- assert len(names) == 14
700
+ assert len(names) == 17
701
701
  assert "navigate" in names
702
702
  assert "wait_for" in names
703
703
  assert "get_console_messages" in names
704
704
  assert "click" not in names
705
705
 
706
- def test_build_server_allow_actions_advertises_20(self):
706
+ def test_build_server_allow_actions_advertises_23(self):
707
707
  from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy, build_server
708
708
 
709
709
  server = build_server(policy=MCPSessionPolicy(allow_actions=True))
710
710
  policy = server._sb_policy # type: ignore[attr-defined]
711
711
  names = {t.name for t in _tools_for_policy(policy)}
712
- assert len(names) == 20
712
+ assert len(names) == 23
713
713
 
714
- def test_build_server_legacy_allow_writes_advertises_20(self):
714
+ def test_build_server_legacy_allow_writes_advertises_23(self):
715
715
  """Legacy allow_writes=True must still enable action tools."""
716
716
  from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy, build_server
717
717
 
718
718
  server = build_server(policy=MCPSessionPolicy(allow_writes=True))
719
719
  policy = server._sb_policy # type: ignore[attr-defined]
720
720
  names = {t.name for t in _tools_for_policy(policy)}
721
- assert len(names) == 20
721
+ assert len(names) == 23
722
722
 
723
723
 
724
724
  # ============================================================================
@@ -1163,3 +1163,159 @@ class TestSwitchTabTool:
1163
1163
  result = await dispatcher.dispatch("switch_tab", {"tab_id": 999})
1164
1164
  payload = json.loads(result[0].text)
1165
1165
  assert payload["ok"] is False
1166
+
1167
+
1168
+ # ============================================================================
1169
+ # reload / go_back / go_forward (P3.0B) — navigation-tier MCP tools
1170
+ # ============================================================================
1171
+
1172
+
1173
+ class TestHistoryNavigationTools:
1174
+ """reload, go_back, go_forward are navigation-tier: default-allowed,
1175
+ delegate to the facade, don't consume action budget."""
1176
+
1177
+ def test_all_three_in_navigation_tool_names(self):
1178
+ from super_browser.mcp_server import NAVIGATION_TOOL_NAMES
1179
+
1180
+ for name in ("reload", "go_back", "go_forward"):
1181
+ assert name in NAVIGATION_TOOL_NAMES
1182
+
1183
+ def test_all_three_in_default_advertised_tools(self):
1184
+ from super_browser.mcp_server import MCPSessionPolicy, _tools_for_policy
1185
+
1186
+ names = {t.name for t in _tools_for_policy(MCPSessionPolicy())}
1187
+ for name in ("reload", "go_back", "go_forward"):
1188
+ assert name in names
1189
+
1190
+ @pytest.mark.asyncio
1191
+ async def test_reload_dispatches_to_facade(self):
1192
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1193
+ fake_sb.reload = AsyncMock(return_value=_fake_action_result({"url": "https://example.com"}))
1194
+ result = await dispatcher.dispatch("reload", {})
1195
+ fake_sb.reload.assert_awaited_once()
1196
+ payload = json.loads(result[0].text)
1197
+ assert payload["ok"] is True
1198
+
1199
+ @pytest.mark.asyncio
1200
+ async def test_go_back_dispatches_to_facade(self):
1201
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1202
+ fake_sb.go_back = AsyncMock(return_value=_fake_action_result({"url": "https://prev.com"}))
1203
+ result = await dispatcher.dispatch("go_back", {})
1204
+ fake_sb.go_back.assert_awaited_once()
1205
+ assert json.loads(result[0].text)["ok"] is True
1206
+
1207
+ @pytest.mark.asyncio
1208
+ async def test_go_forward_dispatches_to_facade(self):
1209
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1210
+ fake_sb.go_forward = AsyncMock(return_value=_fake_action_result({"url": "https://next.com"}))
1211
+ result = await dispatcher.dispatch("go_forward", {})
1212
+ fake_sb.go_forward.assert_awaited_once()
1213
+ assert json.loads(result[0].text)["ok"] is True
1214
+
1215
+ @pytest.mark.asyncio
1216
+ async def test_passes_wait_until(self):
1217
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1218
+ fake_sb.reload = AsyncMock(return_value=_fake_action_result({"url": "x"}))
1219
+ await dispatcher.dispatch("reload", {"wait_until": "networkidle"})
1220
+ fake_sb.reload.assert_awaited_once_with(wait_until="networkidle")
1221
+
1222
+ @pytest.mark.asyncio
1223
+ async def test_invalid_wait_until_returns_error(self):
1224
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1225
+ fake_sb.reload = AsyncMock()
1226
+ result = await dispatcher.dispatch("reload", {"wait_until": "bogus"})
1227
+ payload = json.loads(result[0].text)
1228
+ assert payload["ok"] is False
1229
+ assert "invalid_arguments" in payload
1230
+ fake_sb.reload.assert_not_called()
1231
+
1232
+ @pytest.mark.asyncio
1233
+ async def test_do_not_require_allow_actions(self):
1234
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1235
+ for name, mock_name in [("reload", "reload"), ("go_back", "go_back"), ("go_forward", "go_forward")]:
1236
+ setattr(fake_sb, mock_name, AsyncMock(return_value=_fake_action_result({"url": "x"})))
1237
+ result = await dispatcher.dispatch(name, {})
1238
+ assert json.loads(result[0].text)["ok"] is True
1239
+
1240
+ @pytest.mark.asyncio
1241
+ async def test_do_not_increment_actions_used(self):
1242
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1243
+ fake_sb.reload = AsyncMock(return_value=_fake_action_result({"url": "x"}))
1244
+ fake_sb.go_back = AsyncMock(return_value=_fake_action_result({"url": "x"}))
1245
+ fake_sb.go_forward = AsyncMock(return_value=_fake_action_result({"url": "x"}))
1246
+ await dispatcher.dispatch("reload", {})
1247
+ await dispatcher.dispatch("go_back", {})
1248
+ await dispatcher.dispatch("go_forward", {})
1249
+ assert dispatcher.authorizer.policy.actions_used == 0
1250
+
1251
+ @pytest.mark.asyncio
1252
+ async def test_facade_error_returns_structured(self):
1253
+ """When facade returns ok=False (e.g. no history), MCP reflects it."""
1254
+ dispatcher, fake_sb = _make_dispatcher(allow_actions=False)
1255
+ err_result = MagicMock()
1256
+ err_result.ok = False
1257
+ err_result.data = None
1258
+ err_result.error = {"category": "page_error", "message": "No history entry"}
1259
+ err_result.meta = None
1260
+ fake_sb.go_back = AsyncMock(return_value=err_result)
1261
+ result = await dispatcher.dispatch("go_back", {})
1262
+ payload = json.loads(result[0].text)
1263
+ assert payload["ok"] is False
1264
+
1265
+
1266
+ # ============================================================================
1267
+ # Facade security blocking (P3.0B review) — backend page not called when blocked
1268
+ # ============================================================================
1269
+
1270
+
1271
+ class TestFacadeSecurityBlocking:
1272
+ """The new facade methods (reload/go_back/go_forward) must call
1273
+ _check_facade_security before touching the backend page. When security
1274
+ blocks, the backend method must never be awaited."""
1275
+
1276
+ def _blocked_sb(self):
1277
+ """A SuperBrowser whose _check_facade_security always returns a denial."""
1278
+ from super_browser import SuperBrowser
1279
+ from super_browser.results.types import ActionError, ErrorCategory, action_result
1280
+
1281
+ sb = SuperBrowser()
1282
+ # Pre-seed a fake page so the _page check passes.
1283
+ sb._page = MagicMock()
1284
+ sb._page.url = "https://example.com"
1285
+ sb._page.backend_page = MagicMock()
1286
+ sb._page.backend_page.reload = AsyncMock()
1287
+ sb._page.backend_page.go_back = AsyncMock()
1288
+ sb._page.backend_page.go_forward = AsyncMock()
1289
+ # Make _check_facade_security return a denial (not None).
1290
+ sb._check_facade_security = AsyncMock(return_value=action_result(
1291
+ ok=False, error=ActionError(ErrorCategory.SECURITY, "blocked")))
1292
+ return sb
1293
+
1294
+ @pytest.mark.asyncio
1295
+ async def test_reload_blocked_does_not_call_backend(self):
1296
+ sb = self._blocked_sb()
1297
+ result = await sb.reload()
1298
+ assert result.ok is False
1299
+ sb._page.backend_page.reload.assert_not_called()
1300
+
1301
+ @pytest.mark.asyncio
1302
+ async def test_go_back_blocked_does_not_call_backend(self):
1303
+ sb = self._blocked_sb()
1304
+ result = await sb.go_back()
1305
+ assert result.ok is False
1306
+ sb._page.backend_page.go_back.assert_not_called()
1307
+
1308
+ @pytest.mark.asyncio
1309
+ async def test_go_forward_blocked_does_not_call_backend(self):
1310
+ sb = self._blocked_sb()
1311
+ result = await sb.go_forward()
1312
+ assert result.ok is False
1313
+ sb._page.backend_page.go_forward.assert_not_called()
1314
+
1315
+ @pytest.mark.asyncio
1316
+ async def test_check_facade_security_is_called_for_all_three(self):
1317
+ sb = self._blocked_sb()
1318
+ await sb.reload()
1319
+ await sb.go_back()
1320
+ await sb.go_forward()
1321
+ assert sb._check_facade_security.call_count == 3
@@ -40,8 +40,8 @@ INSPECT_TOOL_NAMES = {
40
40
  "list_requests", "get_request",
41
41
  }
42
42
  # Navigation-tier tool set (always advertised).
43
- NAVIGATION_TOOL_NAMES = {"navigate", "wait_for", "switch_tab"}
44
- # Default advertised set: Inspect + Navigation (14 tools).
43
+ NAVIGATION_TOOL_NAMES = {"navigate", "wait_for", "switch_tab", "reload", "go_back", "go_forward"}
44
+ # Default advertised set: Inspect + Navigation (17 tools).
45
45
  DEFAULT_TOOL_NAMES = INSPECT_TOOL_NAMES | NAVIGATION_TOOL_NAMES
46
46
  # Action-tier tool set (advertised only when allow_actions=True).
47
47
  ACTION_TOOL_NAMES = {
@@ -437,7 +437,7 @@ class TestServerWiring:
437
437
  advertised = _tools_for_policy(policy)
438
438
  advertised_names = {t.name for t in advertised}
439
439
  assert advertised_names == DEFAULT_TOOL_NAMES
440
- assert len(advertised) == 14
440
+ assert len(advertised) == 17
441
441
 
442
442
  def test_actions_enabled_server_advertises_exactly_19_tools(self):
443
443
  """build_server(policy=allow_actions=True) advertises all 19 tools,
@@ -449,7 +449,7 @@ class TestServerWiring:
449
449
  advertised = _tools_for_policy(policy)
450
450
  advertised_names = {t.name for t in advertised}
451
451
  assert advertised_names == ALL_TOOL_NAMES
452
- assert len(advertised) == 20
452
+ assert len(advertised) == 23
453
453
 
454
454
  @pytest.mark.asyncio
455
455
  async def test_default_server_dispatch_returns_refusal_not_unknown(self):