superbrowser-sdk 2.3.0__tar.gz → 2.4.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 (612) hide show
  1. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/CHANGELOG.md +84 -0
  2. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/PKG-INFO +1 -1
  3. superbrowser_sdk-2.4.0/docs/mcp.md +291 -0
  4. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/pyproject.toml +1 -1
  5. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/__init__.py +1 -1
  6. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/mcp_server.py +504 -98
  7. superbrowser_sdk-2.4.0/tests/test_mcp_entrypoint.py +45 -0
  8. superbrowser_sdk-2.4.0/tests/test_mcp_navigation.py +1072 -0
  9. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_permissions.py +11 -6
  10. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_server.py +30 -21
  11. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_server_smoke.py +41 -22
  12. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_write_tools.py +6 -4
  13. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_mcp_write_tools_wave2.py +2 -1
  14. superbrowser_sdk-2.3.0/docs/mcp.md +0 -190
  15. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.env.example +0 -0
  16. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/adversarial-v3.yml +0 -0
  17. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/adversarial.yml +0 -0
  18. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/benchmark.yml +0 -0
  19. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/dco.yml +0 -0
  20. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/e2e.yml +0 -0
  21. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/publish.yml +0 -0
  22. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/smoke.yml +0 -0
  23. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/stress.yml +0 -0
  24. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.github/workflows/test.yml +0 -0
  25. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.gitignore +0 -0
  26. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/.pre-commit-config.yaml +0 -0
  27. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/CONTRIBUTING.md +0 -0
  28. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/Dockerfile +0 -0
  29. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/LICENSE +0 -0
  30. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/README.md +0 -0
  31. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/Super-Browser.png +0 -0
  32. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/behavioral.html +0 -0
  33. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/dom-heavy.html +0 -0
  34. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/form.html +0 -0
  35. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/fixtures/simple.html +0 -0
  36. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
  37. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
  38. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/conftest.py +0 -0
  39. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docker-compose.yml +0 -0
  40. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/agent-reliability.md +0 -0
  41. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
  42. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/anti-detection-ejecta.md +0 -0
  43. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/api-ergonomics-audit.md +0 -0
  44. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/api-reference.md +0 -0
  45. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/api-stability.md +0 -0
  46. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/architecture.md +0 -0
  47. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/behavioral-synthesis.md +0 -0
  48. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/browser-networking.md +0 -0
  49. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/cloak-integration.md +0 -0
  50. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/consistency-engine.md +0 -0
  51. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
  52. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/error-catalog.md +0 -0
  53. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/fingerprint-scoring.md +0 -0
  54. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/fingerprint-validation.md +0 -0
  55. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/gap-analysis.md +0 -0
  56. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/human-behavior.md +0 -0
  57. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/memory.md +0 -0
  58. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/migration/v1-to-v2.md +0 -0
  59. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/migration/v1.8-to-v1.9.md +0 -0
  60. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/operating-doctrine.md +0 -0
  61. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/platform-abstraction.md +0 -0
  62. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/plugins.md +0 -0
  63. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/quickstart.md +0 -0
  64. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/recording.md +0 -0
  65. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/README.md +0 -0
  66. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-decomposition.md +0 -0
  67. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
  68. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
  69. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
  70. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
  71. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
  72. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/stealth-coverage.md +0 -0
  73. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/docs/stealth-evidence.md +0 -0
  74. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/backend_selection.py +0 -0
  75. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/basic_usage.py +0 -0
  76. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/budget_tracking.py +0 -0
  77. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/cloak_stealth.py +0 -0
  78. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/error_handling.py +0 -0
  79. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/fingerprint_scan.py +0 -0
  80. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/human_behavior.py +0 -0
  81. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/multi_tab_workflow.py +0 -0
  82. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/session_persistence.py +0 -0
  83. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/examples/stealth_mode.py +0 -0
  84. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/adversarial_run.py +0 -0
  85. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/agent_efficiency_benchmark.py +0 -0
  86. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/browser_benchmark.py +0 -0
  87. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/e2e_trend.py +0 -0
  88. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/run_stealth_gauntlet.sh +0 -0
  89. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/smoke_published.py +0 -0
  90. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/stress_real_world.py +0 -0
  91. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/validate_e2e_report.py +0 -0
  92. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/scripts/verify_release_artifact.py +0 -0
  93. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/__main__.py +0 -0
  94. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/__init__.py +0 -0
  95. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/config.py +0 -0
  96. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/debug.py +0 -0
  97. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/delegator.py +0 -0
  98. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/facade.py +0 -0
  99. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/__init__.py +0 -0
  100. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
  101. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
  102. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
  103. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/factory.py +0 -0
  104. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/openai_client.py +0 -0
  105. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/llm/protocol.py +0 -0
  106. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/loop.py +0 -0
  107. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/loop_detector.py +0 -0
  108. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/plugins.py +0 -0
  109. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/registry.py +0 -0
  110. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/router.py +0 -0
  111. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/structured_logging.py +0 -0
  112. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/agent/types.py +0 -0
  113. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/__init__.py +0 -0
  114. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/bezier.py +0 -0
  115. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/dwell.py +0 -0
  116. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/fitts.py +0 -0
  117. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/gauss.py +0 -0
  118. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/keyboard.py +0 -0
  119. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/mouse.py +0 -0
  120. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/navigation.py +0 -0
  121. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/orchestrator.py +0 -0
  122. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/prng.py +0 -0
  123. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/qwerty.py +0 -0
  124. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/scroll.py +0 -0
  125. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/session_seed.py +0 -0
  126. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/behavioral/types.py +0 -0
  127. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/__init__.py +0 -0
  128. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/__init__.py +0 -0
  129. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
  130. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
  131. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
  132. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
  133. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/cdp.py +0 -0
  134. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/cloak_backend.py +0 -0
  135. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/cloud.py +0 -0
  136. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/config.py +0 -0
  137. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/discovery.py +0 -0
  138. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/engine.py +0 -0
  139. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/fetch.py +0 -0
  140. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/__init__.py +0 -0
  141. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
  142. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
  143. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
  144. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/page.py +0 -0
  145. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/session.py +0 -0
  146. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/shutdown.py +0 -0
  147. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/browser/tabs.py +0 -0
  148. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/__init__.py +0 -0
  149. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/cascade.py +0 -0
  150. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/client.py +0 -0
  151. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/compressor.py +0 -0
  152. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/cost_estimator.py +0 -0
  153. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/credential_pool.py +0 -0
  154. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/governor.py +0 -0
  155. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/budget/types.py +0 -0
  156. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/__init__.py +0 -0
  157. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/commands.py +0 -0
  158. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/interactive.py +0 -0
  159. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/cli/script.py +0 -0
  160. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/config.py +0 -0
  161. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/events/__init__.py +0 -0
  162. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/events/bus.py +0 -0
  163. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/events/types.py +0 -0
  164. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/__init__.py +0 -0
  165. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/cache.py +0 -0
  166. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/controller.py +0 -0
  167. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/decorator.py +0 -0
  168. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/presets.py +0 -0
  169. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/recovery.py +0 -0
  170. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/snapshot.py +0 -0
  171. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/types.py +0 -0
  172. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/interaction/vision.py +0 -0
  173. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/__init__.py +0 -0
  174. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/integration.py +0 -0
  175. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/store.py +0 -0
  176. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/memory/types.py +0 -0
  177. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/plugins/__init__.py +0 -0
  178. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/plugins/decorators.py +0 -0
  179. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/plugins/hooks.py +0 -0
  180. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/py.typed +0 -0
  181. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/__init__.py +0 -0
  182. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/persistence.py +0 -0
  183. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/recorder.py +0 -0
  184. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/replayer.py +0 -0
  185. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/report.py +0 -0
  186. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recording/types.py +0 -0
  187. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/__init__.py +0 -0
  188. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/checkpoint.py +0 -0
  189. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/classifier.py +0 -0
  190. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/coordinator.py +0 -0
  191. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/event_bus.py +0 -0
  192. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/format_validator.py +0 -0
  193. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/reflection.py +0 -0
  194. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/retry_tracker.py +0 -0
  195. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/session_recovery.py +0 -0
  196. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/types.py +0 -0
  197. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/recovery/watchdogs.py +0 -0
  198. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/__init__.py +0 -0
  199. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/output.py +0 -0
  200. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/typed.py +0 -0
  201. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/types.py +0 -0
  202. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/results/validation.py +0 -0
  203. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/__init__.py +0 -0
  204. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/action_redaction.py +0 -0
  205. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/approval.py +0 -0
  206. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/credential_vault.py +0 -0
  207. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/domain_filter.py +0 -0
  208. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/gate.py +0 -0
  209. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/injection.py +0 -0
  210. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/manager.py +0 -0
  211. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/policy.py +0 -0
  212. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/redactor.py +0 -0
  213. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/security/types.py +0 -0
  214. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/session/__init__.py +0 -0
  215. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/session/proxy.py +0 -0
  216. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/__init__.py +0 -0
  217. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/activation.py +0 -0
  218. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/markdown.py +0 -0
  219. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/registry.py +0 -0
  220. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/skills/types.py +0 -0
  221. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/__init__.py +0 -0
  222. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/action_policy.py +0 -0
  223. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/captcha.py +0 -0
  224. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
  225. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/cache.py +0 -0
  226. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/pow.py +0 -0
  227. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
  228. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
  229. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/dag.py +0 -0
  230. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/derive.py +0 -0
  231. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/errors.py +0 -0
  232. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/inject.py +0 -0
  233. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
  234. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
  235. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/prng.py +0 -0
  236. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rule.py +0 -0
  237. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
  238. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
  239. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
  240. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
  241. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
  242. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
  243. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
  244. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
  245. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
  246. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/diagnostics.py +0 -0
  247. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
  248. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
  249. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
  250. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
  251. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/config.py +0 -0
  252. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
  253. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
  254. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/types.py +0 -0
  255. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
  256. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
  257. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
  258. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/headers.py +0 -0
  259. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/human.py +0 -0
  260. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/human_config.py +0 -0
  261. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/ip_reputation.py +0 -0
  262. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/manager.py +0 -0
  263. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
  264. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
  265. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
  266. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
  267. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
  268. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
  269. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/profiles/schema.py +0 -0
  270. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/proxy.py +0 -0
  271. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/proxy_pool.py +0 -0
  272. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/report.py +0 -0
  273. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/scoring.py +0 -0
  274. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/tls_baselines.json +0 -0
  275. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
  276. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/types.py +0 -0
  277. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
  278. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/__init__.py +0 -0
  279. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/checks.py +0 -0
  280. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/harness.py +0 -0
  281. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/report.py +0 -0
  282. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/stealth/validation/suite.py +0 -0
  283. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/testing.py +0 -0
  284. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/__init__.py +0 -0
  285. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/cost_analytics.py +0 -0
  286. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/flow_logger.py +0 -0
  287. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/middleware.py +0 -0
  288. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/session_db.py +0 -0
  289. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/sinks.py +0 -0
  290. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/tracing/types.py +0 -0
  291. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/__init__.py +0 -0
  292. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/ax_diff.py +0 -0
  293. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/hasher.py +0 -0
  294. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/types.py +0 -0
  295. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/verification/verifier.py +0 -0
  296. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/__init__.py +0 -0
  297. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/cache.py +0 -0
  298. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/controller.py +0 -0
  299. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/coords.py +0 -0
  300. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/factory.py +0 -0
  301. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/ocr.py +0 -0
  302. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/providers.py +0 -0
  303. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/src/super_browser/vision/types.py +0 -0
  304. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/stress/__init__.py +0 -0
  305. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/stress/server.py +0 -0
  306. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/__init__.py +0 -0
  307. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/__init__.py +0 -0
  308. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/conftest.py +0 -0
  309. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/controlled_server.py +0 -0
  310. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/report.py +0 -0
  311. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/scoring.py +0 -0
  312. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/targets.py +0 -0
  313. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_controlled_server.py +0 -0
  314. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_targets_unit.py +0 -0
  315. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_tier1_scanners.py +0 -0
  316. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_tier2_vendors.py +0 -0
  317. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial/test_tier3_controlled.py +0 -0
  318. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/README.md +0 -0
  319. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/__init__.py +0 -0
  320. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/backends.py +0 -0
  321. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +0 -0
  322. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/core.py +0 -0
  323. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/engines/__init__.py +0 -0
  324. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/engines/scoring.py +0 -0
  325. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/harness.py +0 -0
  326. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/__init__.py +0 -0
  327. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/history.py +0 -0
  328. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +0 -0
  329. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +0 -0
  330. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/server.py +0 -0
  331. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/__init__.py +0 -0
  332. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/automation.py +0 -0
  333. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/behavioral.py +0 -0
  334. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/controlled.py +0 -0
  335. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/ejector.py +0 -0
  336. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/external.py +0 -0
  337. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +0 -0
  338. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/adversarial3/vectors/network.py +0 -0
  339. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/pytest.ini +0 -0
  340. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/run.py +0 -0
  341. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/__init__.py +0 -0
  342. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/conftest.py +0 -0
  343. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_backends.py +0 -0
  344. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_behavioral_telemetry.py +0 -0
  345. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +0 -0
  346. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_behavioral_vectors.py +0 -0
  347. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_core.py +0 -0
  348. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_external.py +0 -0
  349. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_harness_smoke.py +0 -0
  350. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_header_ordering.py +0 -0
  351. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_reporters.py +0 -0
  352. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_scoring.py +0 -0
  353. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_server.py +0 -0
  354. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_superbrowser_backend.py +0 -0
  355. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/adversarial_v3/tests/test_vectors.py +0 -0
  356. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/conftest.py +0 -0
  357. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/__init__.py +0 -0
  358. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/conftest.py +0 -0
  359. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_01_example_nav.py +0 -0
  360. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_02_google_search.py +0 -0
  361. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_03_github_login.py +0 -0
  362. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
  363. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_05_google_forms.py +0 -0
  364. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_06_google_flights.py +0 -0
  365. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
  366. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
  367. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_09_form_complex.py +0 -0
  368. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
  369. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/__init__.py +0 -0
  370. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/conftest.py +0 -0
  371. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_behavioral_realism.py +0 -0
  372. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_challenge_detection.py +0 -0
  373. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_interaction.py +0 -0
  374. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_live_navigation.py +0 -0
  375. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_multi_tab.py +0 -0
  376. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_navigation.py +0 -0
  377. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_session_persistence.py +0 -0
  378. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e/test_stealth_overhead.py +0 -0
  379. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/e2e_v1_3_journey.py +0 -0
  380. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/__init__.py +0 -0
  381. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/conftest.py +0 -0
  382. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_config_composition.py +0 -0
  383. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_engine_backends.py +0 -0
  384. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_error_paths.py +0 -0
  385. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_facade_smoke.py +0 -0
  386. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_full_lifecycle.py +0 -0
  387. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_multi_backend.py +0 -0
  388. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_performance_smoke.py +0 -0
  389. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_playwright_integration.py +0 -0
  390. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_public_api.py +0 -0
  391. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_session_persistence.py +0 -0
  392. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_stealth_abstraction.py +0 -0
  393. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v1100_features.py +0 -0
  394. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v150_features.py +0 -0
  395. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v160_features.py +0 -0
  396. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v170_features.py +0 -0
  397. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v180_features.py +0 -0
  398. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v190_features.py +0 -0
  399. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v191_features.py +0 -0
  400. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v192_features.py +0 -0
  401. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v193_features.py +0 -0
  402. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v194_features.py +0 -0
  403. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v195_features.py +0 -0
  404. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v1_3_features.py +0 -0
  405. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/integration/test_v1_4_features.py +0 -0
  406. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/pattern_validation.py +0 -0
  407. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/__init__.py +0 -0
  408. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/conftest.py +0 -0
  409. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
  410. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_cli_switches.py +0 -0
  411. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
  412. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_live_sites.py +0 -0
  413. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
  414. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
  415. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/stealth_detection/test_webdriver.py +0 -0
  416. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/__init__.py +0 -0
  417. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_action_timeout.py +0 -0
  418. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_browser_transport.py +0 -0
  419. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_controller_rebinding.py +0 -0
  420. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_debug_mode.py +0 -0
  421. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_default_tooling.py +0 -0
  422. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_delegator.py +0 -0
  423. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_error_screenshots.py +0 -0
  424. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade.py +0 -0
  425. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security.py +0 -0
  426. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_control.py +0 -0
  427. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
  428. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_network.py +0 -0
  429. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_facade_security_session.py +0 -0
  430. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_fail_fast.py +0 -0
  431. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm.py +0 -0
  432. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm_budget.py +0 -0
  433. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm_production.py +0 -0
  434. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_llm_streaming.py +0 -0
  435. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_loop.py +0 -0
  436. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_loop_detector.py +0 -0
  437. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_prompt_isolation.py +0 -0
  438. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_registry.py +0 -0
  439. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_retry_budget.py +0 -0
  440. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_streaming.py +0 -0
  441. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_structured_logging.py +0 -0
  442. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_tab_cap.py +0 -0
  443. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_task_02.py +0 -0
  444. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_agent/test_types.py +0 -0
  445. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/__init__.py +0 -0
  446. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_behavioral.py +0 -0
  447. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_dwell.py +0 -0
  448. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_hardening.py +0 -0
  449. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
  450. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_navigation.py +0 -0
  451. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_orchestrator.py +0 -0
  452. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_behavioral/test_session_seed.py +0 -0
  453. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmark/__init__.py +0 -0
  454. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmark/test_efficiency.py +0 -0
  455. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
  456. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_benchmarks/test_stress_real_world.py +0 -0
  457. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/__init__.py +0 -0
  458. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cdp.py +0 -0
  459. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cdp_backend.py +0 -0
  460. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cloak_backend.py +0 -0
  461. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cloak_docs.py +0 -0
  462. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_cloak_integration.py +0 -0
  463. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_config.py +0 -0
  464. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_discovery.py +0 -0
  465. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_engine_protocol.py +0 -0
  466. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_fetch.py +0 -0
  467. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_injectors.py +0 -0
  468. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_page.py +0 -0
  469. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_patchright_backend.py +0 -0
  470. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_playwright_backend.py +0 -0
  471. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_selenium_backend.py +0 -0
  472. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_session.py +0 -0
  473. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_browser/test_shutdown.py +0 -0
  474. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/__init__.py +0 -0
  475. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_cascade.py +0 -0
  476. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_cascade_governor.py +0 -0
  477. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_circuit_breaker.py +0 -0
  478. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_client.py +0 -0
  479. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_compressor.py +0 -0
  480. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_cost_estimator.py +0 -0
  481. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_credential_pool.py +0 -0
  482. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_governor.py +0 -0
  483. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_budget/test_types.py +0 -0
  484. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_interactive.py +0 -0
  485. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_script.py +0 -0
  486. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_stealth_check.py +0 -0
  487. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_stealth_validate.py +0 -0
  488. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_cli/test_unified_cli.py +0 -0
  489. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_config.py +0 -0
  490. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_e2e/test_report_schema.py +0 -0
  491. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_e2e/test_trend.py +0 -0
  492. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_audio.py +0 -0
  493. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
  494. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
  495. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_browser_apis.py +0 -0
  496. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_canvas.py +0 -0
  497. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_integration.py +0 -0
  498. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_timing.py +0 -0
  499. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_ejecta/test_webrtc.py +0 -0
  500. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_events/test_event_bus.py +0 -0
  501. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
  502. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_governance_docs.py +0 -0
  503. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/__init__.py +0 -0
  504. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_cache.py +0 -0
  505. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_controller.py +0 -0
  506. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_decorator.py +0 -0
  507. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_injection.py +0 -0
  508. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_page_change.py +0 -0
  509. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_presets.py +0 -0
  510. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_recovery.py +0 -0
  511. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_snapshot.py +0 -0
  512. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_types.py +0 -0
  513. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_interaction/test_vision.py +0 -0
  514. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/__init__.py +0 -0
  515. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/test_cli_config.py +0 -0
  516. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/test_integration.py +0 -0
  517. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_memory/test_store.py +0 -0
  518. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/__init__.py +0 -0
  519. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/test_persistence.py +0 -0
  520. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/test_recorder.py +0 -0
  521. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recording/test_replayer.py +0 -0
  522. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/__init__.py +0 -0
  523. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_checkpoint.py +0 -0
  524. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_classifier.py +0 -0
  525. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_coordinator.py +0 -0
  526. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_event_bus.py +0 -0
  527. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_format_validator.py +0 -0
  528. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_reflection.py +0 -0
  529. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_retry_tracker.py +0 -0
  530. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_session_recovery.py +0 -0
  531. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_types.py +0 -0
  532. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_recovery/test_watchdogs.py +0 -0
  533. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_release/test_naming_consistency.py +0 -0
  534. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_release/test_smoke_published.py +0 -0
  535. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_release/test_verify_artifact.py +0 -0
  536. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/__init__.py +0 -0
  537. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_batch40_integration.py +0 -0
  538. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_categories.py +0 -0
  539. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_output.py +0 -0
  540. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_typed.py +0 -0
  541. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_types.py +0 -0
  542. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_results/test_validation.py +0 -0
  543. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_runtime_correctness/__init__.py +0 -0
  544. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_runtime_correctness/test_runtime_fixes.py +0 -0
  545. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/__init__.py +0 -0
  546. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_approval.py +0 -0
  547. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_credential_vault.py +0 -0
  548. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_domain_filter.py +0 -0
  549. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_injection.py +0 -0
  550. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_manager.py +0 -0
  551. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_policy.py +0 -0
  552. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_redaction_pipeline.py +0 -0
  553. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_redactor.py +0 -0
  554. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_security/test_types.py +0 -0
  555. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_session/__init__.py +0 -0
  556. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_session/test_locale.py +0 -0
  557. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_session/test_proxy.py +0 -0
  558. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/__init__.py +0 -0
  559. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_activation.py +0 -0
  560. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_integration.py +0 -0
  561. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_markdown.py +0 -0
  562. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_registry.py +0 -0
  563. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_skills/test_types.py +0 -0
  564. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/__init__.py +0 -0
  565. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_action_policy.py +0 -0
  566. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_captcha.py +0 -0
  567. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
  568. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_challenge_cache.py +0 -0
  569. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_challenge_config.py +0 -0
  570. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
  571. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_consistency_inject.py +0 -0
  572. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_diagnostics.py +0 -0
  573. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
  574. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
  575. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
  576. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
  577. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_headers.py +0 -0
  578. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_human.py +0 -0
  579. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
  580. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_ip_reputation.py +0 -0
  581. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_kasada_detection.py +0 -0
  582. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_manager.py +0 -0
  583. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
  584. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_profiles.py +0 -0
  585. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_proxy.py +0 -0
  586. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_proxy_pool.py +0 -0
  587. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
  588. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
  589. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
  590. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_types.py +0 -0
  591. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
  592. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_stealth/test_validation.py +0 -0
  593. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/__init__.py +0 -0
  594. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_cost_analytics.py +0 -0
  595. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_flow_logger.py +0 -0
  596. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_middleware.py +0 -0
  597. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_session_db.py +0 -0
  598. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_sinks.py +0 -0
  599. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_tracing/test_types.py +0 -0
  600. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/__init__.py +0 -0
  601. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_ax_diff.py +0 -0
  602. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_hasher.py +0 -0
  603. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_types.py +0 -0
  604. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_verification/test_verifier.py +0 -0
  605. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/__init__.py +0 -0
  606. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_cache.py +0 -0
  607. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_controller.py +0 -0
  608. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_coords.py +0 -0
  609. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_factory.py +0 -0
  610. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_ocr.py +0 -0
  611. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_providers.py +0 -0
  612. {superbrowser_sdk-2.3.0 → superbrowser_sdk-2.4.0}/tests/test_vision/test_types.py +0 -0
@@ -5,6 +5,90 @@ 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.4.0] — 2026-06-23
9
+
10
+ ### Added — MCP Server P1: Navigation Workflows
11
+
12
+ The default MCP server can now read a URL end-to-end (`navigate → wait_for →
13
+ observe/extract_text/screenshot`) without action mode. The tool surface was
14
+ re-partitioned into a **four-tier model**:
15
+
16
+ - **Inspect tier** (always advertised): `browser_status`, `current_url`,
17
+ `observe`, `extract_text`, `screenshot`, `list_tabs`.
18
+ - **Navigation tier** (always advertised): `navigate`, `wait_for` (new).
19
+ Navigation mutates browser state (page acquisition) but is default-allowed
20
+ because reading requires a page to read. It is `SecurityManager`-checked and
21
+ audited (both approvals and denials) in the default stdio / `build_server()`
22
+ path, but it does **not** consume the action budget. Bare
23
+ `ToolDispatcher(runtime)` integrations may navigate without an attached
24
+ authorizer; in that case no audit/security check is performed.
25
+ - **Action tier** (requires `--allow-actions` / `SB_MCP_ALLOW_ACTIONS=1`):
26
+ `scroll`, `press_key`, `click`, `fill`, `open_tab`, `close_tab`.
27
+ - **High-risk tier** (not implemented): `download`, `upload`, `act`, arbitrary JS.
28
+
29
+ New APIs:
30
+
31
+ - `wait_for` tool: wait for exactly one page condition (`selector` / `text` /
32
+ `url` / `load_state`) with `timeout_ms` (100–60000, default 10000).
33
+ - `MCPSessionPolicy.allow_actions` (primary) with `allow_writes` retained as a
34
+ backward-compatibility alias.
35
+ - `MCPAuthorizer.record_audit()` — public audit helper for navigation-tier
36
+ entries; returns the `MCPAuthorizationResult` it constructed.
37
+ - `--allow-actions` CLI flag and `SB_MCP_ALLOW_ACTIONS` env var
38
+ (truthy sentinels: `1`, `true`, `yes`, `on`).
39
+ - `SB_MCP_DOMAIN_ALLOWLIST` / `SB_MCP_DOMAIN_BLOCKLIST` env vars for opt-in
40
+ domain filtering on the default stdio server (comma- or whitespace-separated;
41
+ glob patterns supported).
42
+ - `run_server()` now constructs a default `SecurityManager` so navigation is
43
+ security-checked in the default stdio path; callers may pass
44
+ `security_manager=` to override (or `None` to disable).
45
+
46
+ ### Changed
47
+
48
+ - **Default advertised tool count: 6 → 8** (adds `navigate` and `wait_for`).
49
+ - `navigate` moved from the action-gated write tier to the default-allowed
50
+ navigation tier.
51
+ - Action-gate refusal message changed from `"writes are disabled"` to
52
+ `"actions are disabled"` (the gate protects the Action tier).
53
+ - `_tools_for_policy()` now advertises `DEFAULT_TOOLS` (inspect + navigation)
54
+ by default and adds `ACTION_TOOLS` when `allow_actions` is set.
55
+ - `main()` now uses `argparse` (previously raw `sys.argv` substring matching).
56
+
57
+ ### Compatibility notes
58
+
59
+ - The action-gate refusal `reason` changed from `"writes are disabled"` to
60
+ `"actions are disabled"`. Clients/docs pattern-matching the old string should
61
+ update. (`MCPSessionPolicy(allow_writes=True)` callers are otherwise
62
+ unaffected — the flag still enables action tools via the compat alias.)
63
+ - The default stdio server now advertises 8 tools, not 6. Clients asserting on
64
+ the advertised count should update.
65
+
66
+ ### Fixed
67
+
68
+ - Fixed default navigation dispatch so bare `ToolDispatcher(runtime)`
69
+ integrations can use `navigate` without requiring an authorizer; security
70
+ checks and audit still run when an authorizer/security manager is attached,
71
+ including the default stdio server path.
72
+
73
+ ### Internal
74
+
75
+ - Tier constants: `INSPECT_TOOLS` / `NAVIGATION_TOOLS` / `ACTION_TOOLS` /
76
+ `DEFAULT_TOOLS` and their `_NAME` frozensets. (`PHASE1_TOOLS`,
77
+ `PHASE2B_TOOLS`, `PHASE2B_WAVE2_TOOLS`, and `WRITE_TOOL_NAMES` retained as
78
+ aliases for backward-compat imports.)
79
+ - `_validate_write_args` split into `_validate_navigation_args` and
80
+ `_validate_action_args`; the old name remains as a routing alias.
81
+ - `wait_for` reaches the raw Patchright/Playwright page via
82
+ `sb._page.backend_page` (one hop); the deprecated `.raw_page` accessor is
83
+ not used.
84
+
85
+ ## [2.3.1] — 2026-06-22
86
+
87
+ ### Fixed
88
+
89
+ - Fixed `superbrowser-mcp` / `python -m super_browser.mcp_server` startup crash caused by `logging.Stderr` (which does not exist in Python's stdlib); the MCP server entry point now configures logging with `sys.stderr`.
90
+ - Added entry-point bootstrap coverage so the MCP console-script path is exercised directly.
91
+
8
92
  ## [2.3.0] — 2026-06-22
9
93
 
10
94
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superbrowser-sdk
3
- Version: 2.3.0
3
+ Version: 2.4.0
4
4
  Summary: Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade
5
5
  Project-URL: Homepage, https://github.com/Octo-Lex/Super-Browser
6
6
  Project-URL: Documentation, https://github.com/Octo-Lex/Super-Browser#readme
@@ -0,0 +1,291 @@
1
+ # Super Browser MCP Server
2
+
3
+ Super Browser exposes its browser inspection and control surface over the
4
+ [Model Context Protocol](https://modelcontextprotocol.io) so that AI coding
5
+ agents (Claude, Cursor, etc.) can observe and interact with a page without
6
+ scripting Python.
7
+
8
+ The stdio server advertises **eight tools by default** (six inspect + two
9
+ navigation) — enough to read a URL end-to-end. When action mode is enabled,
10
+ it advertises **six additional action tools**; every action call is checked by
11
+ `MCPSessionPolicy` and `SecurityManager` before it can reach the browser.
12
+
13
+ See [RFC #178](https://github.com/Octo-Lex/Super-Browser/issues/178) for the
14
+ design history.
15
+
16
+ > `screenshot` captures the rendered page contents as the browser sees them. There is no automatic redaction; callers decide when to invoke it.
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ pip install 'superbrowser-sdk[mcp,patchright]'
22
+ python -m patchright install chromium
23
+ ```
24
+
25
+ `[mcp]` pulls the lightweight `mcp` SDK (no browser deps of its own).
26
+ `[patchright]` provides the browser backend the server drives.
27
+
28
+ ## Run
29
+
30
+ Either of:
31
+
32
+ ```bash
33
+ superbrowser-mcp # default: 8 tools (inspect + navigation)
34
+ superbrowser-mcp --allow-actions # 14 tools (adds the action tier)
35
+ python -m super_browser.mcp_server
36
+ ```
37
+
38
+ Both start a **stdio** server. The default server advertises 8 tools and
39
+ recognizes (but refuses) action-tool calls with a structured policy refusal.
40
+
41
+ Action mode can also be enabled via the environment:
42
+
43
+ ```bash
44
+ SB_MCP_ALLOW_ACTIONS=1 superstl-browser-mcp
45
+ ```
46
+
47
+ Accepted truthy values: `1`, `true`, `yes`, `on` (case-insensitive).
48
+
49
+ ## Client configuration
50
+
51
+ ### Claude Desktop / Claude Code
52
+
53
+ Add to your MCP config (`claude_desktop_config.json` or the equivalent):
54
+
55
+ ```json
56
+ {
57
+ "mcpServers": {
58
+ "super-browser": {
59
+ "command": "superbrowser-mcp"
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ Or, if you prefer the module form:
66
+
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "super-browser": {
71
+ "command": "python",
72
+ "args": ["-m", "super_browser.mcp_server"]
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ To enable action tools:
79
+
80
+ ```json
81
+ {
82
+ "mcpServers": {
83
+ "super-browser": {
84
+ "command": "superbrowser-mcp",
85
+ "args": ["--allow-actions"]
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### Cursor
92
+
93
+ ```json
94
+ {
95
+ "mcpServers": {
96
+ "super-browser": {
97
+ "command": "superbrowser-mcp"
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ ## Tools
104
+
105
+ All tools return structured JSON (`{"ok": bool, ...}`) as `TextContent`. The
106
+ screenshot tool additionally returns an `ImageContent` block.
107
+
108
+ The tool surface is partitioned into four tiers. The first two are always
109
+ advertised; the third requires action mode; the fourth is not implemented.
110
+
111
+ ### Inspect tier (always advertised)
112
+
113
+ | Tool | Args | Behavior | Lazy-starts browser? |
114
+ |---|---|---|---|
115
+ | `browser_status` | none | Runtime status (running, backend). | No |
116
+ | `current_url` | none | Current URL, or a structured "not started" state. | No |
117
+ | `observe` | none | Page state: URL, title, interactive/total element counts. | Yes |
118
+ | `extract_text` | `query` (required), `selector` (optional) | Text content, optionally scoped to a CSS selector. | Yes |
119
+ | `screenshot` | `full_page` (optional, default `false`) | Base64 PNG of the viewport or full page. | Yes |
120
+ | `list_tabs` | none | Snapshot of open tabs. | Yes |
121
+
122
+ ### Navigation tier (always advertised)
123
+
124
+ Navigation mutates browser state (page acquisition) but is default-allowed
125
+ because reading requires a page to read. It is always checked by the
126
+ `SecurityManager` and is audited, but it does **not** consume the action
127
+ budget and does **not** require action mode.
128
+
129
+ | Tool | Args | Behavior |
130
+ |---|---|---|
131
+ | `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. |
132
+ | `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. |
133
+
134
+ `wait_for` accepts exactly one condition per call (deterministic single
135
+ results; compound waits can be added later as an explicit AND mode).
136
+
137
+ #### Read workflow
138
+
139
+ ```text
140
+ navigate → wait_for → observe / extract_text / screenshot
141
+ ```
142
+
143
+ This is the default-mode loop an agent uses to read a page.
144
+
145
+ ### Action tier (advertised when action mode is enabled)
146
+
147
+ | Tool | Args | Security level |
148
+ |---|---|---|
149
+ | `scroll` | `direction` (optional), `amount` (optional) | SENSITIVE |
150
+ | `press_key` | `key` (required) | SENSITIVE |
151
+ | `click` | `target` (required), `description` (optional) | SENSITIVE |
152
+ | `fill` | `target` (required), `value` (required), `clear_first` (optional), `description` (optional) | SENSITIVE |
153
+ | `open_tab` | `url` (optional) | SENSITIVE — URL passed to `SecurityManager` when provided |
154
+ | `close_tab` | `tab_id` (required) | SENSITIVE |
155
+
156
+ `fill` sends only the literal value supplied by the caller. It does not
157
+ retrieve, infer, store, or auto-fill credentials.
158
+
159
+ #### Action workflow
160
+
161
+ ```bash
162
+ superbrowser-mcp --allow-actions
163
+ ```
164
+
165
+ Action calls pass through the full authorization path (action gate →
166
+ action-count budget → timeout budget → `SecurityManager` → audit) before
167
+ reaching the browser.
168
+
169
+ ### High-risk tier (not implemented)
170
+
171
+ `download`, `upload`, `act` (the LLM agent loop), and arbitrary JS execution
172
+ are not implemented. They will return a structured "Unknown tool" error and
173
+ will require a separate design pass before implementation.
174
+
175
+ ## Domain filtering
176
+
177
+ Navigation is always security-checked, but domain allow/block enforcement is
178
+ **opt-in** via environment variables. With neither set, the domain filter is
179
+ allow-all (injection detection and secret redaction still run).
180
+
181
+ ```bash
182
+ # Block specific hosts (comma- or whitespace-separated; glob patterns allowed)
183
+ SB_MCP_DOMAIN_BLOCKLIST="evil.com, *.test" superstl-browser-mcp
184
+
185
+ # Restrict to an allowlist (anything not matching is denied)
186
+ SB_MCP_DOMAIN_ALLOWLIST="example.com, docs.example.com" superstl-browser-mcp
187
+ ```
188
+
189
+ When both are set, the blocklist is evaluated first; the allowlist then
190
+ restricts the survivors.
191
+
192
+ ## Four-tier tool model
193
+
194
+ The default server behavior partitions the surface by risk:
195
+
196
+ - **`list_tools()`** advertises only the Inspect + Navigation tiers (8 tools).
197
+ - **`call_tool()`** still recognizes action-tool names and returns a structured
198
+ policy refusal (`refusal.reason = "actions are disabled"`), not an "Unknown
199
+ tool" error.
200
+
201
+ This means clients don't see action tools by default, but manual or
202
+ unadvertised action calls are handled cleanly rather than misclassified.
203
+
204
+ ### Permission model (action tools)
205
+
206
+ Every action-tier call passes through a central authorization path before
207
+ reaching the browser:
208
+
209
+ 1. **Action-enabled check** — `MCPSessionPolicy.allow_actions` must be `True`
210
+ 2. **Action-count check** — `actions_used` must not exceed `max_actions`
211
+ 3. **Timeout-budget check** — session elapsed time must not exceed `timeout_seconds`
212
+ 4. **`SecurityManager.check_action()`** — domain allow/block lists, action policy, injection detection, redaction
213
+ 5. **Audit log** — every action attempt (allowed or denied) is recorded
214
+
215
+ Navigation-tier calls use a lighter path: argument validation →
216
+ `SecurityManager.check_action()` (navigate only) → audit (both approvals and
217
+ denials) → handler. They bypass the action gate, action-count budget, and
218
+ timeout budget.
219
+
220
+ All denials return structured JSON as normal MCP content, never raised:
221
+
222
+ ```json
223
+ {
224
+ "ok": false,
225
+ "refusal": {
226
+ "tool": "navigate",
227
+ "blocked_by": "security_manager",
228
+ "reason": "domain_filter",
229
+ "security_level": "sensitive"
230
+ }
231
+ }
232
+ ```
233
+
234
+ ### Lifecycle
235
+
236
+ - One browser per server process.
237
+ - The browser lazy-starts on the first browser-dependent tool call
238
+ (`navigate`, `wait_for`, `observe`, `extract_text`, `screenshot`,
239
+ `list_tabs`, or any action tool that reaches the facade after authorization).
240
+ - `browser_status` and `current_url` are safe to call before startup and do
241
+ **not** force a launch.
242
+ - On server close, the runtime calls `SuperBrowser.stop()` to tear down.
243
+
244
+ ## Errors
245
+
246
+ Errors are returned as structured JSON, never raised across the MCP boundary:
247
+
248
+ ```json
249
+ {"ok": false, "error": "Unknown tool: '__missing__'. Available: [...]" }
250
+ ```
251
+
252
+ Argument-validation errors use the `invalid_arguments` key:
253
+
254
+ ```json
255
+ {"ok": false, "invalid_arguments": "'query' is required and must be a non-empty string"}
256
+ ```
257
+
258
+ `wait_for` timeouts return a structured timeout result:
259
+
260
+ ```json
261
+ {"ok": false, "timeout": true, "reason": "Timeout 10000ms exceeded"}
262
+ ```
263
+
264
+ ## Behavior changes
265
+
266
+ ### `superbrowser-sdk` 2.4 — navigation tier
267
+
268
+ Prior to 2.4, the default MCP server advertised 6 read-only tools and gated
269
+ **all** side-effecting tools (including `navigate`) behind `allow_writes=True`.
270
+
271
+ In 2.4 the tool surface was re-partitioned into four tiers:
272
+
273
+ - `navigate` moved into a default-allowed **Navigation tier** (reading requires
274
+ page acquisition). It is still `SecurityManager`-checked and audited.
275
+ - `wait_for` was added (navigation tier).
276
+ - The former "write tools" became the **Action tier**, gated by
277
+ `allow_actions` (`--allow-actions` / `SB_MCP_ALLOW_ACTIONS`).
278
+ - The action-gate refusal message changed from `"writes are disabled"` to
279
+ `"actions are disabled"`. Clients pattern-matching the old string must update.
280
+
281
+ `allow_writes` remains as a backward-compatibility alias for `allow_actions`
282
+ in `MCPSessionPolicy`; existing callers using `MCPSessionPolicy(allow_writes=True)`
283
+ continue to work.
284
+
285
+ ## Reference
286
+
287
+ - Design: [RFC #178](https://github.com/Octo-Lex/Super-Browser/issues/178)
288
+ - The deleted prior server (`a370cf9`) is recoverable from git history for
289
+ reference — it shipped 10 tools including 6 side-effecting ones with no
290
+ permission model and no tests. The current server is the deliberate
291
+ correction: tested, permissioned, tiered, with structured refusals and audit logging.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "superbrowser-sdk"
7
- version = "2.3.0"
7
+ version = "2.4.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.3.0"
9
+ __version__ = "2.4.0"
10
10
 
11
11
  __all__ = [
12
12
  "SuperBrowser",