superbrowser-sdk 2.4.0__tar.gz → 2.6.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 (617) hide show
  1. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/CHANGELOG.md +100 -0
  2. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/PKG-INFO +1 -1
  3. superbrowser_sdk-2.6.0/docs/design/inspect_redaction.md +277 -0
  4. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/mcp.md +48 -11
  5. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/pyproject.toml +1 -1
  6. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/verify_release_artifact.py +144 -64
  7. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/__init__.py +1 -1
  8. superbrowser_sdk-2.6.0/src/super_browser/agent/diagnostics.py +287 -0
  9. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/facade.py +28 -0
  10. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/mcp_server.py +298 -6
  11. superbrowser_sdk-2.6.0/tests/test_diagnostics.py +760 -0
  12. superbrowser_sdk-2.6.0/tests/test_mcp_diagnostics.py +271 -0
  13. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_navigation.py +111 -18
  14. superbrowser_sdk-2.6.0/tests/test_mcp_redaction.py +544 -0
  15. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_server.py +19 -12
  16. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_server_smoke.py +57 -0
  17. superbrowser_sdk-2.6.0/tests/test_release/test_verify_artifact.py +246 -0
  18. superbrowser_sdk-2.4.0/tests/test_release/test_verify_artifact.py +0 -133
  19. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.env.example +0 -0
  20. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/adversarial-v3.yml +0 -0
  21. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/adversarial.yml +0 -0
  22. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/benchmark.yml +0 -0
  23. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/dco.yml +0 -0
  24. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/e2e.yml +0 -0
  25. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/publish.yml +0 -0
  26. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/smoke.yml +0 -0
  27. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/stress.yml +0 -0
  28. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.github/workflows/test.yml +0 -0
  29. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.gitignore +0 -0
  30. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/.pre-commit-config.yaml +0 -0
  31. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/CONTRIBUTING.md +0 -0
  32. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/Dockerfile +0 -0
  33. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/LICENSE +0 -0
  34. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/README.md +0 -0
  35. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/Super-Browser.png +0 -0
  36. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/benchmarks/fixtures/behavioral.html +0 -0
  37. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/benchmarks/fixtures/dom-heavy.html +0 -0
  38. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/benchmarks/fixtures/form.html +0 -0
  39. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/benchmarks/fixtures/simple.html +0 -0
  40. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
  41. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
  42. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/conftest.py +0 -0
  43. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docker-compose.yml +0 -0
  44. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/agent-reliability.md +0 -0
  45. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
  46. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/anti-detection-ejecta.md +0 -0
  47. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/api-ergonomics-audit.md +0 -0
  48. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/api-reference.md +0 -0
  49. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/api-stability.md +0 -0
  50. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/architecture.md +0 -0
  51. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/behavioral-synthesis.md +0 -0
  52. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/browser-networking.md +0 -0
  53. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/cloak-integration.md +0 -0
  54. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/consistency-engine.md +0 -0
  55. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
  56. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/error-catalog.md +0 -0
  57. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/fingerprint-scoring.md +0 -0
  58. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/fingerprint-validation.md +0 -0
  59. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/gap-analysis.md +0 -0
  60. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/human-behavior.md +0 -0
  61. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/memory.md +0 -0
  62. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/migration/v1-to-v2.md +0 -0
  63. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/migration/v1.8-to-v1.9.md +0 -0
  64. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/operating-doctrine.md +0 -0
  65. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/platform-abstraction.md +0 -0
  66. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/plugins.md +0 -0
  67. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/quickstart.md +0 -0
  68. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/recording.md +0 -0
  69. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/README.md +0 -0
  70. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/v2-decomposition.md +0 -0
  71. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
  72. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
  73. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
  74. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
  75. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
  76. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/stealth-coverage.md +0 -0
  77. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/docs/stealth-evidence.md +0 -0
  78. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/backend_selection.py +0 -0
  79. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/basic_usage.py +0 -0
  80. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/budget_tracking.py +0 -0
  81. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/cloak_stealth.py +0 -0
  82. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/error_handling.py +0 -0
  83. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/fingerprint_scan.py +0 -0
  84. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/human_behavior.py +0 -0
  85. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/multi_tab_workflow.py +0 -0
  86. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/session_persistence.py +0 -0
  87. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/examples/stealth_mode.py +0 -0
  88. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/adversarial_run.py +0 -0
  89. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/agent_efficiency_benchmark.py +0 -0
  90. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/browser_benchmark.py +0 -0
  91. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/e2e_trend.py +0 -0
  92. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/run_stealth_gauntlet.sh +0 -0
  93. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/smoke_published.py +0 -0
  94. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/stress_real_world.py +0 -0
  95. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/scripts/validate_e2e_report.py +0 -0
  96. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/__main__.py +0 -0
  97. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/__init__.py +0 -0
  98. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/config.py +0 -0
  99. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/debug.py +0 -0
  100. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/delegator.py +0 -0
  101. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/__init__.py +0 -0
  102. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
  103. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
  104. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
  105. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/factory.py +0 -0
  106. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/openai_client.py +0 -0
  107. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/llm/protocol.py +0 -0
  108. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/loop.py +0 -0
  109. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/loop_detector.py +0 -0
  110. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/plugins.py +0 -0
  111. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/registry.py +0 -0
  112. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/router.py +0 -0
  113. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/structured_logging.py +0 -0
  114. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/agent/types.py +0 -0
  115. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/__init__.py +0 -0
  116. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/bezier.py +0 -0
  117. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/dwell.py +0 -0
  118. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/fitts.py +0 -0
  119. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/gauss.py +0 -0
  120. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/keyboard.py +0 -0
  121. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/mouse.py +0 -0
  122. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/navigation.py +0 -0
  123. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/orchestrator.py +0 -0
  124. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/prng.py +0 -0
  125. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/qwerty.py +0 -0
  126. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/scroll.py +0 -0
  127. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/session_seed.py +0 -0
  128. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/behavioral/types.py +0 -0
  129. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/__init__.py +0 -0
  130. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/backends/__init__.py +0 -0
  131. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
  132. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
  133. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
  134. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
  135. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/cdp.py +0 -0
  136. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/cloak_backend.py +0 -0
  137. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/cloud.py +0 -0
  138. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/config.py +0 -0
  139. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/discovery.py +0 -0
  140. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/engine.py +0 -0
  141. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/fetch.py +0 -0
  142. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/injectors/__init__.py +0 -0
  143. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
  144. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
  145. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
  146. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/page.py +0 -0
  147. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/session.py +0 -0
  148. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/shutdown.py +0 -0
  149. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/browser/tabs.py +0 -0
  150. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/__init__.py +0 -0
  151. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/cascade.py +0 -0
  152. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/client.py +0 -0
  153. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/compressor.py +0 -0
  154. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/cost_estimator.py +0 -0
  155. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/credential_pool.py +0 -0
  156. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/governor.py +0 -0
  157. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/budget/types.py +0 -0
  158. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/cli/__init__.py +0 -0
  159. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/cli/commands.py +0 -0
  160. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/cli/interactive.py +0 -0
  161. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/cli/script.py +0 -0
  162. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/config.py +0 -0
  163. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/events/__init__.py +0 -0
  164. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/events/bus.py +0 -0
  165. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/events/types.py +0 -0
  166. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/__init__.py +0 -0
  167. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/cache.py +0 -0
  168. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/controller.py +0 -0
  169. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/decorator.py +0 -0
  170. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/presets.py +0 -0
  171. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/recovery.py +0 -0
  172. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/snapshot.py +0 -0
  173. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/types.py +0 -0
  174. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/interaction/vision.py +0 -0
  175. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/memory/__init__.py +0 -0
  176. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/memory/integration.py +0 -0
  177. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/memory/store.py +0 -0
  178. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/memory/types.py +0 -0
  179. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/plugins/__init__.py +0 -0
  180. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/plugins/decorators.py +0 -0
  181. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/plugins/hooks.py +0 -0
  182. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/py.typed +0 -0
  183. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recording/__init__.py +0 -0
  184. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recording/persistence.py +0 -0
  185. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recording/recorder.py +0 -0
  186. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recording/replayer.py +0 -0
  187. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recording/report.py +0 -0
  188. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recording/types.py +0 -0
  189. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/__init__.py +0 -0
  190. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/checkpoint.py +0 -0
  191. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/classifier.py +0 -0
  192. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/coordinator.py +0 -0
  193. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/event_bus.py +0 -0
  194. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/format_validator.py +0 -0
  195. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/reflection.py +0 -0
  196. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/retry_tracker.py +0 -0
  197. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/session_recovery.py +0 -0
  198. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/types.py +0 -0
  199. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/recovery/watchdogs.py +0 -0
  200. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/results/__init__.py +0 -0
  201. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/results/output.py +0 -0
  202. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/results/typed.py +0 -0
  203. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/results/types.py +0 -0
  204. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/results/validation.py +0 -0
  205. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/__init__.py +0 -0
  206. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/action_redaction.py +0 -0
  207. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/approval.py +0 -0
  208. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/credential_vault.py +0 -0
  209. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/domain_filter.py +0 -0
  210. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/gate.py +0 -0
  211. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/injection.py +0 -0
  212. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/manager.py +0 -0
  213. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/policy.py +0 -0
  214. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/redactor.py +0 -0
  215. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/security/types.py +0 -0
  216. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/session/__init__.py +0 -0
  217. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/session/proxy.py +0 -0
  218. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/skills/__init__.py +0 -0
  219. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/skills/activation.py +0 -0
  220. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/skills/markdown.py +0 -0
  221. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/skills/registry.py +0 -0
  222. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/skills/types.py +0 -0
  223. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/__init__.py +0 -0
  224. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/action_policy.py +0 -0
  225. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/captcha.py +0 -0
  226. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
  227. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/challenges/cache.py +0 -0
  228. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/challenges/pow.py +0 -0
  229. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
  230. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
  231. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/dag.py +0 -0
  232. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/derive.py +0 -0
  233. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/errors.py +0 -0
  234. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/inject.py +0 -0
  235. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
  236. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
  237. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/prng.py +0 -0
  238. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rule.py +0 -0
  239. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
  240. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
  241. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
  242. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
  243. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
  244. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
  245. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
  246. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
  247. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
  248. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/diagnostics.py +0 -0
  249. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
  250. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
  251. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
  252. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
  253. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/config.py +0 -0
  254. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
  255. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
  256. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/types.py +0 -0
  257. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
  258. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
  259. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
  260. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/headers.py +0 -0
  261. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/human.py +0 -0
  262. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/human_config.py +0 -0
  263. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/ip_reputation.py +0 -0
  264. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/manager.py +0 -0
  265. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
  266. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
  267. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
  268. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
  269. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
  270. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
  271. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/profiles/schema.py +0 -0
  272. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/proxy.py +0 -0
  273. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/proxy_pool.py +0 -0
  274. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/report.py +0 -0
  275. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/scoring.py +0 -0
  276. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/tls_baselines.json +0 -0
  277. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
  278. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/types.py +0 -0
  279. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
  280. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/validation/__init__.py +0 -0
  281. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/validation/checks.py +0 -0
  282. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/validation/harness.py +0 -0
  283. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/validation/report.py +0 -0
  284. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/stealth/validation/suite.py +0 -0
  285. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/testing.py +0 -0
  286. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/__init__.py +0 -0
  287. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/cost_analytics.py +0 -0
  288. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/flow_logger.py +0 -0
  289. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/middleware.py +0 -0
  290. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/session_db.py +0 -0
  291. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/sinks.py +0 -0
  292. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/tracing/types.py +0 -0
  293. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/verification/__init__.py +0 -0
  294. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/verification/ax_diff.py +0 -0
  295. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/verification/hasher.py +0 -0
  296. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/verification/types.py +0 -0
  297. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/verification/verifier.py +0 -0
  298. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/__init__.py +0 -0
  299. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/cache.py +0 -0
  300. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/controller.py +0 -0
  301. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/coords.py +0 -0
  302. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/factory.py +0 -0
  303. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/ocr.py +0 -0
  304. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/providers.py +0 -0
  305. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/src/super_browser/vision/types.py +0 -0
  306. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/stress/__init__.py +0 -0
  307. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/stress/server.py +0 -0
  308. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/__init__.py +0 -0
  309. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/__init__.py +0 -0
  310. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/conftest.py +0 -0
  311. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/controlled_server.py +0 -0
  312. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/report.py +0 -0
  313. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/scoring.py +0 -0
  314. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/targets.py +0 -0
  315. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/test_controlled_server.py +0 -0
  316. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/test_targets_unit.py +0 -0
  317. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/test_tier1_scanners.py +0 -0
  318. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/test_tier2_vendors.py +0 -0
  319. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial/test_tier3_controlled.py +0 -0
  320. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/README.md +0 -0
  321. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/__init__.py +0 -0
  322. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/backends.py +0 -0
  323. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +0 -0
  324. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/core.py +0 -0
  325. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/engines/__init__.py +0 -0
  326. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/engines/scoring.py +0 -0
  327. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/harness.py +0 -0
  328. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/reporters/__init__.py +0 -0
  329. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/reporters/history.py +0 -0
  330. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +0 -0
  331. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +0 -0
  332. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/server.py +0 -0
  333. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/__init__.py +0 -0
  334. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/automation.py +0 -0
  335. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/behavioral.py +0 -0
  336. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/controlled.py +0 -0
  337. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/ejector.py +0 -0
  338. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/external.py +0 -0
  339. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +0 -0
  340. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/adversarial3/vectors/network.py +0 -0
  341. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/pytest.ini +0 -0
  342. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/run.py +0 -0
  343. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/__init__.py +0 -0
  344. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/conftest.py +0 -0
  345. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_backends.py +0 -0
  346. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_behavioral_telemetry.py +0 -0
  347. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +0 -0
  348. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_behavioral_vectors.py +0 -0
  349. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_core.py +0 -0
  350. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_external.py +0 -0
  351. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_harness_smoke.py +0 -0
  352. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_header_ordering.py +0 -0
  353. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_reporters.py +0 -0
  354. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_scoring.py +0 -0
  355. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_server.py +0 -0
  356. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_superbrowser_backend.py +0 -0
  357. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/adversarial_v3/tests/test_vectors.py +0 -0
  358. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/conftest.py +0 -0
  359. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/__init__.py +0 -0
  360. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/conftest.py +0 -0
  361. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_01_example_nav.py +0 -0
  362. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_02_google_search.py +0 -0
  363. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_03_github_login.py +0 -0
  364. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
  365. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_05_google_forms.py +0 -0
  366. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_06_google_flights.py +0 -0
  367. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
  368. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
  369. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_09_form_complex.py +0 -0
  370. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
  371. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/__init__.py +0 -0
  372. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/conftest.py +0 -0
  373. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_behavioral_realism.py +0 -0
  374. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_challenge_detection.py +0 -0
  375. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_interaction.py +0 -0
  376. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_live_navigation.py +0 -0
  377. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_multi_tab.py +0 -0
  378. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_navigation.py +0 -0
  379. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_session_persistence.py +0 -0
  380. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e/test_stealth_overhead.py +0 -0
  381. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/e2e_v1_3_journey.py +0 -0
  382. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/__init__.py +0 -0
  383. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/conftest.py +0 -0
  384. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_config_composition.py +0 -0
  385. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_engine_backends.py +0 -0
  386. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_error_paths.py +0 -0
  387. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_facade_smoke.py +0 -0
  388. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_full_lifecycle.py +0 -0
  389. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_multi_backend.py +0 -0
  390. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_performance_smoke.py +0 -0
  391. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_playwright_integration.py +0 -0
  392. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_public_api.py +0 -0
  393. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_session_persistence.py +0 -0
  394. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_stealth_abstraction.py +0 -0
  395. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v1100_features.py +0 -0
  396. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v150_features.py +0 -0
  397. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v160_features.py +0 -0
  398. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v170_features.py +0 -0
  399. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v180_features.py +0 -0
  400. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v190_features.py +0 -0
  401. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v191_features.py +0 -0
  402. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v192_features.py +0 -0
  403. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v193_features.py +0 -0
  404. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v194_features.py +0 -0
  405. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v195_features.py +0 -0
  406. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v1_3_features.py +0 -0
  407. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/integration/test_v1_4_features.py +0 -0
  408. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/pattern_validation.py +0 -0
  409. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/__init__.py +0 -0
  410. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/conftest.py +0 -0
  411. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
  412. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_cli_switches.py +0 -0
  413. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
  414. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_live_sites.py +0 -0
  415. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
  416. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
  417. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/stealth_detection/test_webdriver.py +0 -0
  418. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/__init__.py +0 -0
  419. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_action_timeout.py +0 -0
  420. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_browser_transport.py +0 -0
  421. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_controller_rebinding.py +0 -0
  422. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_debug_mode.py +0 -0
  423. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_default_tooling.py +0 -0
  424. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_delegator.py +0 -0
  425. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_error_screenshots.py +0 -0
  426. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_facade.py +0 -0
  427. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_facade_security.py +0 -0
  428. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_facade_security_control.py +0 -0
  429. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
  430. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_facade_security_network.py +0 -0
  431. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_facade_security_session.py +0 -0
  432. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_fail_fast.py +0 -0
  433. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_llm.py +0 -0
  434. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_llm_budget.py +0 -0
  435. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_llm_production.py +0 -0
  436. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_llm_streaming.py +0 -0
  437. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_loop.py +0 -0
  438. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_loop_detector.py +0 -0
  439. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_prompt_isolation.py +0 -0
  440. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_registry.py +0 -0
  441. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_retry_budget.py +0 -0
  442. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_streaming.py +0 -0
  443. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_structured_logging.py +0 -0
  444. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_tab_cap.py +0 -0
  445. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_task_02.py +0 -0
  446. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_agent/test_types.py +0 -0
  447. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/__init__.py +0 -0
  448. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_behavioral.py +0 -0
  449. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_dwell.py +0 -0
  450. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_hardening.py +0 -0
  451. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
  452. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_navigation.py +0 -0
  453. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_orchestrator.py +0 -0
  454. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_behavioral/test_session_seed.py +0 -0
  455. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_benchmark/__init__.py +0 -0
  456. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_benchmark/test_efficiency.py +0 -0
  457. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
  458. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_benchmarks/test_stress_real_world.py +0 -0
  459. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/__init__.py +0 -0
  460. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_cdp.py +0 -0
  461. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_cdp_backend.py +0 -0
  462. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_cloak_backend.py +0 -0
  463. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_cloak_docs.py +0 -0
  464. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_cloak_integration.py +0 -0
  465. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_config.py +0 -0
  466. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_discovery.py +0 -0
  467. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_engine_protocol.py +0 -0
  468. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_fetch.py +0 -0
  469. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_injectors.py +0 -0
  470. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_page.py +0 -0
  471. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_patchright_backend.py +0 -0
  472. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_playwright_backend.py +0 -0
  473. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_selenium_backend.py +0 -0
  474. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_session.py +0 -0
  475. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_browser/test_shutdown.py +0 -0
  476. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/__init__.py +0 -0
  477. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_cascade.py +0 -0
  478. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_cascade_governor.py +0 -0
  479. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_circuit_breaker.py +0 -0
  480. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_client.py +0 -0
  481. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_compressor.py +0 -0
  482. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_cost_estimator.py +0 -0
  483. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_credential_pool.py +0 -0
  484. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_governor.py +0 -0
  485. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_budget/test_types.py +0 -0
  486. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_cli/test_interactive.py +0 -0
  487. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_cli/test_script.py +0 -0
  488. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_cli/test_stealth_check.py +0 -0
  489. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_cli/test_stealth_validate.py +0 -0
  490. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_cli/test_unified_cli.py +0 -0
  491. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_config.py +0 -0
  492. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_e2e/test_report_schema.py +0 -0
  493. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_e2e/test_trend.py +0 -0
  494. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_audio.py +0 -0
  495. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
  496. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
  497. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_browser_apis.py +0 -0
  498. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_canvas.py +0 -0
  499. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_integration.py +0 -0
  500. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_timing.py +0 -0
  501. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_ejecta/test_webrtc.py +0 -0
  502. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_events/test_event_bus.py +0 -0
  503. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
  504. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_governance_docs.py +0 -0
  505. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/__init__.py +0 -0
  506. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_cache.py +0 -0
  507. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_controller.py +0 -0
  508. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_decorator.py +0 -0
  509. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_injection.py +0 -0
  510. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_page_change.py +0 -0
  511. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_presets.py +0 -0
  512. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_recovery.py +0 -0
  513. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_snapshot.py +0 -0
  514. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_types.py +0 -0
  515. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_interaction/test_vision.py +0 -0
  516. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_entrypoint.py +0 -0
  517. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_permissions.py +0 -0
  518. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_write_tools.py +0 -0
  519. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_mcp_write_tools_wave2.py +0 -0
  520. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_memory/__init__.py +0 -0
  521. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_memory/test_cli_config.py +0 -0
  522. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_memory/test_integration.py +0 -0
  523. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_memory/test_store.py +0 -0
  524. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recording/__init__.py +0 -0
  525. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recording/test_persistence.py +0 -0
  526. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recording/test_recorder.py +0 -0
  527. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recording/test_replayer.py +0 -0
  528. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/__init__.py +0 -0
  529. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_checkpoint.py +0 -0
  530. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_classifier.py +0 -0
  531. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_coordinator.py +0 -0
  532. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_event_bus.py +0 -0
  533. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_format_validator.py +0 -0
  534. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_reflection.py +0 -0
  535. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_retry_tracker.py +0 -0
  536. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_session_recovery.py +0 -0
  537. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_types.py +0 -0
  538. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_recovery/test_watchdogs.py +0 -0
  539. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_release/test_naming_consistency.py +0 -0
  540. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_release/test_smoke_published.py +0 -0
  541. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/__init__.py +0 -0
  542. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/test_batch40_integration.py +0 -0
  543. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/test_categories.py +0 -0
  544. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/test_output.py +0 -0
  545. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/test_typed.py +0 -0
  546. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/test_types.py +0 -0
  547. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_results/test_validation.py +0 -0
  548. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_runtime_correctness/__init__.py +0 -0
  549. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_runtime_correctness/test_runtime_fixes.py +0 -0
  550. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/__init__.py +0 -0
  551. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_approval.py +0 -0
  552. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_credential_vault.py +0 -0
  553. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_domain_filter.py +0 -0
  554. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_injection.py +0 -0
  555. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_manager.py +0 -0
  556. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_policy.py +0 -0
  557. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_redaction_pipeline.py +0 -0
  558. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_redactor.py +0 -0
  559. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_security/test_types.py +0 -0
  560. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_session/__init__.py +0 -0
  561. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_session/test_locale.py +0 -0
  562. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_session/test_proxy.py +0 -0
  563. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_skills/__init__.py +0 -0
  564. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_skills/test_activation.py +0 -0
  565. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_skills/test_integration.py +0 -0
  566. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_skills/test_markdown.py +0 -0
  567. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_skills/test_registry.py +0 -0
  568. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_skills/test_types.py +0 -0
  569. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/__init__.py +0 -0
  570. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_action_policy.py +0 -0
  571. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_captcha.py +0 -0
  572. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
  573. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_challenge_cache.py +0 -0
  574. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_challenge_config.py +0 -0
  575. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
  576. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_consistency_inject.py +0 -0
  577. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_diagnostics.py +0 -0
  578. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
  579. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
  580. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
  581. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
  582. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_headers.py +0 -0
  583. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_human.py +0 -0
  584. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
  585. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_ip_reputation.py +0 -0
  586. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_kasada_detection.py +0 -0
  587. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_manager.py +0 -0
  588. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
  589. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_profiles.py +0 -0
  590. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_proxy.py +0 -0
  591. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_proxy_pool.py +0 -0
  592. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
  593. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
  594. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
  595. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_types.py +0 -0
  596. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
  597. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_stealth/test_validation.py +0 -0
  598. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/__init__.py +0 -0
  599. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/test_cost_analytics.py +0 -0
  600. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/test_flow_logger.py +0 -0
  601. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/test_middleware.py +0 -0
  602. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/test_session_db.py +0 -0
  603. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/test_sinks.py +0 -0
  604. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_tracing/test_types.py +0 -0
  605. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_verification/__init__.py +0 -0
  606. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_verification/test_ax_diff.py +0 -0
  607. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_verification/test_hasher.py +0 -0
  608. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_verification/test_types.py +0 -0
  609. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_verification/test_verifier.py +0 -0
  610. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/__init__.py +0 -0
  611. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_cache.py +0 -0
  612. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_controller.py +0 -0
  613. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_coords.py +0 -0
  614. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_factory.py +0 -0
  615. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_ocr.py +0 -0
  616. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_providers.py +0 -0
  617. {superbrowser_sdk-2.4.0 → superbrowser_sdk-2.6.0}/tests/test_vision/test_types.py +0 -0
@@ -5,6 +5,106 @@ 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.6.0] — 2026-06-26
9
+
10
+ ### Added — MCP switch_tab navigation tool (P3.0A)
11
+
12
+ - `switch_tab` is now a navigation-tier MCP tool (default-allowed, not
13
+ action-budgeted). Delegates to the existing `SuperBrowser.switch_tab(tab_id)`
14
+ facade method. Use `list_tabs` to discover tab IDs.
15
+ - Default advertised tools: 13 → 14; action mode: 19 → 20.
16
+ - Diagnostics remain session-wide after switching tabs; per-tab diagnostics
17
+ are not supported yet.
18
+
19
+ ### Added — MCP inspect-output redaction (P2.3)
20
+
21
+ Inspect-tier MCP tools now redact detected secrets at the MCP serialization
22
+ boundary before returning content to the agent. Redaction is **on by default**
23
+ (matching `SecurityConfig.redaction_enabled=True`) and can be disabled via
24
+ `SB_MCP_REDACTION=0` (env) or `SecurityConfig(redaction_enabled=False)`
25
+ (programmatic).
26
+
27
+ **Tools redacted (9):** `extract_text`, `observe`, `current_url`, `list_tabs`,
28
+ `get_console_messages`, `get_page_errors`, `get_network_errors`, `list_requests`,
29
+ `get_request`.
30
+
31
+ **What gets redacted:**
32
+ - Text fields (text, message, stack, title, failure_text) — secret patterns
33
+ detected by `SecretRedactor` (API keys, JWTs, passwords, PEM keys, etc.) are
34
+ replaced with `[REDACTED:{type}:{hash6}]` markers.
35
+ - URL fields — two-pass: `redact_context()` redacts sensitive query-parameter
36
+ values (`[REDACTED:query_param]`), then `SecretRedactor` pattern-scans for
37
+ secrets in non-sensitive keys/fragments.
38
+
39
+ **What does NOT change:**
40
+ - Output shape (same keys/structure; only string values may contain markers).
41
+ - Python SDK consumers (`sb.extract()`, `sb.observe()`, `sb.diagnostics`) —
42
+ redaction applies only at the MCP boundary, not the SDK path.
43
+ - `screenshot` (visual content), `browser_status` (no sensitive content).
44
+ - DiagnosticsBuffer capture behavior, facade outputs.
45
+
46
+ ### Compatibility notes
47
+
48
+ - This is a **behavior change** for MCP consumers: inspect-tier output that
49
+ previously contained raw secrets will now contain redaction markers. Set
50
+ `SB_MCP_REDACTION=0` to restore raw output.
51
+
52
+ ### Fixed — Release tooling
53
+
54
+ - `scripts/verify_release_artifact.py` now supports sdist (`.tar.gz`) artifacts
55
+ via `tarfile`, in addition to wheels (`.whl`) via `zipfile`. Previously the
56
+ verifier was wheel-only and threw `BadZipFile` on any sdist (hit during both
57
+ the v2.4.0 and v2.5.0 releases). Shared checks (distribution name, version,
58
+ extras, isolated install, import, CLI, README/docs scan) run for both archive
59
+ types; wheel-only checks (entry points, module shadowing guard) are skipped
60
+ for sdists with a clear "skipped" message. Unsupported archive types now fail
61
+ with a clear error instead of an opaque `BadZipFile`.
62
+
63
+ ## [2.5.0] — 2026-06-25
64
+
65
+ ### Added — MCP Server P2: Diagnostics Pack
66
+
67
+ An explainability layer for failed reads/rendering. Five new inspect-tier
68
+ tools let an agent inspect browser/page/network evidence when
69
+ `navigate → wait_for → extract_text` returns unexpected content — without
70
+ expanding the action surface. No `--allow-actions`, no action budget, no audit
71
+ entry, no side effects.
72
+
73
+ - `get_console_messages` — buffered browser console messages, filterable by
74
+ level.
75
+ - `get_page_errors` — buffered uncaught page errors with stack traces.
76
+ - `get_network_errors` — requests that failed (status ≥ 400, no response, or
77
+ net error).
78
+ - `list_requests` — all buffered request summaries; returns `request_id` for
79
+ `get_request` follow-up.
80
+ - `get_request` — one request's metadata by `request_id`.
81
+
82
+ New `DiagnosticsBuffer` (`super_browser.agent.diagnostics`): session-wide ring
83
+ buffers for console / page-error / network events, wired into the facade
84
+ lifecycle (`start()` + `_attach_page()`). Survives tab switches. Exposed as
85
+ `SuperBrowser.diagnostics`. Reads are snapshots (non-destructive); bounded
86
+ deques (default 500, via `config.event_buffer_size`).
87
+
88
+ ### Design constraints (P2)
89
+
90
+ - Diagnostics entries carry a monotonic `seq`, `timestamp_ms`, and `page_url`.
91
+ - Request records use a stable `request_id` (assigned by the buffer). A URL can
92
+ have multiple requests (redirects, retries), so retrieval is always by
93
+ `request_id`, never by URL.
94
+ - **No response bodies** and **no raw header values** are returned. `get_request`
95
+ exposes `header_names` (keys) only. Console text, page errors, and URLs are
96
+ returned as-is, matching the existing inspect-tool posture.
97
+ - `get_request` returns a structured `{ok: false, reason: "not_found"}` when the
98
+ request was never buffered or evicted; it never raises.
99
+
100
+ ### Compatibility notes
101
+
102
+ - The default stdio server now advertises **13 tools** (was 8): the 5
103
+ diagnostics tools are inspect-tier and always advertised. Clients asserting
104
+ on the advertised count should update. This is additive — no tools were
105
+ removed and no refusal strings changed.
106
+ - Action mode advertises **19 tools** (was 14).
107
+
8
108
  ## [2.4.0] — 2026-06-23
9
109
 
10
110
  ### Added — MCP Server P1: Navigation Workflows
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superbrowser-sdk
3
- Version: 2.4.0
3
+ Version: 2.6.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,277 @@
1
+ # Design Note: Shared Inspect-Output Redaction
2
+
3
+ > **Status:** Design proposal for review. No implementation yet.
4
+ > **Scope:** P2.3 — define the redaction boundary before more default-readable MCP surfaces are added.
5
+ > **Date:** 2026-06-25
6
+
7
+ ## Problem
8
+
9
+ The inspect-tier MCP tools return raw page/browser content to the agent with no
10
+ redaction:
11
+
12
+ - `extract_text` — returns page text as-is
13
+ - `observe` — returns URL, title, element counts (text in serialized form)
14
+ - `get_console_messages` — returns console output as-is
15
+ - `get_page_errors` — returns error messages + stack traces as-is
16
+ - `list_requests` / `get_request` — returns header **names** only (by P2 design),
17
+ but URLs, failure text, and console/error content are unredacted
18
+ - `get_network_errors` — returns failed request URLs + failure text as-is
19
+
20
+ This is consistent today (all inspect tools have the same "no redaction"
21
+ posture), and it was the deliberate P2 decision: ship diagnostics unredacted for
22
+ parity with `extract_text`, then unify redaction across all inspect tools as a
23
+ follow-up. **This document is that follow-up.**
24
+
25
+ The risk: console messages, page errors, and URLs routinely contain secrets
26
+ (API keys in console logs, tokens in redirect URLs, credentials in error
27
+ messages). An agent that reads these via MCP and passes them to an LLM leaks
28
+ secrets into the model context.
29
+
30
+ ## Existing machinery (reuse, don't rebuild)
31
+
32
+ The codebase already has a complete redaction layer:
33
+
34
+ | Component | Location | What it does |
35
+ |---|---|---|
36
+ | `SecretRedactor` | `security/redactor.py:61` | Pattern-based redaction of secrets in text (API keys, tokens, passwords, JWTs, etc.) |
37
+ | `redact_args()` | `security/action_redaction.py:55` | Key-name + value-pattern redaction on dicts |
38
+ | `redact_result_dict()` | `security/action_redaction.py:108` | Redacts `ActionResult.to_dict()` output (`data` + `error` fields) |
39
+ | `redact_context()` | `security/action_redaction.py:81` | Scrubs sensitive query params from URLs |
40
+ | `_SENSITIVE_KEYS` | `security/action_redaction.py:12` | Frozenset of sensitive key names (password, token, secret, cookie, auth, etc.) |
41
+ | `configure_redaction()` | `security/action_redaction.py:45` | Sets the default redactor from a `SecurityConfig` |
42
+ | `SecurityManager.check_action()` | `security/manager.py:111` | Runs redaction on action params when `redaction_enabled=True` (default) |
43
+
44
+ **Critical gap:** `redact_result_dict()` is wired into `ActionResult.to_dict()`
45
+ (`results/types.py:235`) — the **Python SDK serialization path**. But the MCP
46
+ server's `_serialize_action_result()` (`mcp_server.py:432`) manually builds a
47
+ payload from `ok`/`data`/`error`/`meta` and does **not** call
48
+ `ActionResult.to_dict()` or `redact_result_dict()`. So the same `ActionResult`
49
+ is redacted when serialized via the Python SDK but **not** when returned via
50
+ MCP. Additionally, the diagnostics handlers (`_tool_get_console_messages`, etc.)
51
+ and `_tool_current_url` build response dicts directly, bypassing
52
+ `ActionResult` and `_serialize_action_result()` entirely.
53
+
54
+ ## Design principles
55
+
56
+ 1. **Do not destroy utility by default.** Redaction should mask known secret
57
+ patterns, not collapse all text. A redacted console message should still
58
+ show the message structure with secrets replaced by the existing markers
59
+ (`[REDACTED:{secret_type}:{hash6}]` or `[REDACTED:query_param]`).
60
+
61
+ 2. **Policy-driven, not always-on.** Redaction should be controlled by the
62
+ `SecurityConfig` (which is already `redaction_enabled=True` by default). The
63
+ MCP server constructs a `SecurityManager` in `run_server()`; the same config
64
+ should govern inspect-output redaction. An operator who wants raw output
65
+ (e.g. for debugging) can set `redaction_enabled=False`.
66
+
67
+ 3. **Redact at the MCP serialization boundary, not inside the browser.** The
68
+ browser captures raw content; redaction happens when the MCP server
69
+ serializes the response for the agent. This keeps the SDK fast path
70
+ unredacted (Python SDK consumers get raw data) while the agent-facing MCP
71
+ boundary applies the policy.
72
+
73
+ 4. **Masking format is documented and stable.** The existing redaction
74
+ machinery emits two marker formats, both preserved as-is:
75
+ - `SecretRedactor`: `[REDACTED:{secret_type}:{hash6}]` — e.g.
76
+ `[REDACTED:openai_key:abc123]` (includes the secret type and a 6-char
77
+ SHA-256 prefix for deduplication).
78
+ - `redact_context()`: `[REDACTED:query_param]` — for sensitive query
79
+ parameter values.
80
+ Agents can detect that redaction occurred without seeing the secret.
81
+
82
+ 5. **No output-shape change.** Redaction replaces string values in place; it
83
+ does not add, remove, or rename keys. A redacted `get_console_messages`
84
+ response has the same `{ok, messages, count}` shape — only `messages[i].text`
85
+ values may be masked.
86
+
87
+ ## Scope: which tools, what content
88
+
89
+ ### In scope (redaction applied)
90
+
91
+ | Tool | Content to redact | Mechanism |
92
+ |---|---|---|
93
+ | `extract_text` | extracted text body | `SecretRedactor.redact()` on the text string |
94
+ | `observe` | title, URL | URL redaction (see below); `SecretRedactor.redact()` on title |
95
+ | `current_url` | page URL | URL redaction (see below) |
96
+ | `list_tabs` | tab URLs, tab titles | URL redaction on each tab URL; `SecretRedactor.redact()` on titles |
97
+ | `get_console_messages` | `text` field per entry | `SecretRedactor.redact()` on each `text` |
98
+ | `get_page_errors` | `message`, `stack` fields | `SecretRedactor.redact()` on each |
99
+ | `get_network_errors` | `url`, `failure_text` | URL redaction on URL; `SecretRedactor.redact()` on failure_text |
100
+ | `list_requests` | `url` per entry | URL redaction on each URL |
101
+ | `get_request` | `url`, `failure_text` | URL redaction on URL; `SecretRedactor.redact()` on failure_text |
102
+
103
+ **URL redaction** (two-pass, applied to all URL fields):
104
+ 1. `redact_context(url)` — redacts query parameters whose key names match
105
+ `_SENSITIVE_KEYS` (token, access_token, api_key, cookie, etc.).
106
+ 2. `SecretRedactor.redact(result_url)` — pattern-scans the remaining URL for
107
+ secret substrings in non-sensitive query keys, fragments, or URL-like
108
+ strings (e.g. `?code=sk-...`, `?next=https://...token...`).
109
+ 3. Preserve scheme, host, and path where possible; redact only secret
110
+ substrings and sensitive query values.
111
+
112
+ This two-pass approach is necessary because `redact_context()` alone only
113
+ catches secrets in *named* sensitive parameters. Secrets in innocuously-named
114
+ query values (`?code=sk-...`) or embedded in redirect URLs would leak through
115
+ without the `SecretRedactor` pattern scan.
116
+
117
+ ### Already redacted (no change)
118
+
119
+ | Content | Current state |
120
+ |---|---|
121
+ | Request/response header values | Not exposed (P2: `header_names` keys only) |
122
+ | Response bodies | Not exposed (P2: excluded) |
123
+ | Navigate URL/params | Redacted by `SecurityManager.check_action()` (navigation-tier) |
124
+ | Action tool arguments | Redacted by `SecurityManager.check_action()` (action-tier) |
125
+
126
+ ### Out of scope
127
+
128
+ - **`browser_status`** — returns runtime status (running, backend name). No
129
+ sensitive page content expected.
130
+ - **`screenshot`** — visual content; secret-detection in image data is a
131
+ different problem (OCR + pattern matching). Deferred.
132
+ - **Redaction of element HTML/attributes in `observe`.** `observe` returns
133
+ counts and metadata, not raw HTML. If a future tool exposes HTML, it joins
134
+ this scope.
135
+ - **Per-tool redaction policy overrides.** All inspect tools share one policy
136
+ (the `SecurityConfig`). Per-tool granular control is deferred.
137
+
138
+ ## Architecture
139
+
140
+ ### Option A (recommended): shared MCP redaction helper
141
+
142
+ Add a single helper in `mcp_server.py` that applies redaction to any
143
+ inspect-tier response dict before serialization:
144
+
145
+ ```python
146
+ def _redact_inspect_output(payload: dict[str, Any]) -> dict[str, Any]:
147
+ """Apply redaction policy to inspect-tier tool output.
148
+
149
+ Redacts string values in known-sensitive fields (text, message, url, etc.)
150
+ using the server's SecurityConfig. No-op if redaction is disabled or no
151
+ SecurityManager is configured.
152
+ """
153
+ ```
154
+
155
+ Each inspect handler calls `_redact_inspect_output(payload)` before returning.
156
+ The helper uses the existing `SecretRedactor` + `redact_context()` machinery —
157
+ no new redaction logic.
158
+
159
+ **Why this over alternatives:** it's the narrowest change (one helper, called
160
+ from each handler), it reuses all existing machinery, and it keeps redaction at
161
+ the MCP boundary (principle #3).
162
+
163
+ ### Option B (not recommended): wire `redact_result_dict` into `_serialize_action_result`
164
+
165
+ This would redact any `ActionResult` returned via MCP. But most inspect tools
166
+ don't return an `ActionResult` (they build dicts directly), so it wouldn't cover
167
+ `get_console_messages`, `list_requests`, etc. Incomplete.
168
+
169
+ ### Option C (not recommended): redact inside `DiagnosticsBuffer` / the facade
170
+
171
+ This would redact at capture time, contaminating the buffer with masked values.
172
+ An SDK consumer using `sb.diagnostics` directly would get redacted data even if
173
+ they want raw. Violates principle #3.
174
+
175
+ ## Sensitive classes (what gets redacted)
176
+
177
+ Reuse the existing `SecretRedactor` pattern set (`security/redactor.py`), which
178
+ covers:
179
+
180
+ - API keys (Anthropic, OpenAI, OpenRouter, GitHub, AWS, Google, Slack, Stripe)
181
+ - JWTs
182
+ - Passwords
183
+ - PEM/private keys
184
+ - Database URLs
185
+ - Generic tokens
186
+
187
+ Plus `_SENSITIVE_KEYS` for key-name matching (cookie, auth, session_id, etc.).
188
+
189
+ ### Not redacted (by default)
190
+
191
+ - **Emails and phone numbers.** Not secrets in the same risk class as API keys.
192
+ Can be added as a configurable pattern layer if needed, but deferred to avoid
193
+ false positives that break utility.
194
+ - **IP addresses.** Same reasoning — operational data, not credentials.
195
+ - **Payment card numbers (PAN).** The `SecretRedactor` does not currently detect
196
+ these. Could be added as a custom pattern via `SecurityConfig.custom_secret_patterns`.
197
+
198
+ ## Compatibility
199
+
200
+ - **Default behavior changes:** with `redaction_enabled=True` (the default),
201
+ inspect output now has secrets masked. This is a **behavior change** for
202
+ existing MCP consumers who relied on raw output. Documented in CHANGELOG.
203
+ - **Output shape unchanged:** same keys, same structure. Only string values may
204
+ contain redaction markers (`[REDACTED:{secret_type}:{hash6}]` from
205
+ `SecretRedactor`, or `[REDACTED:query_param]` from `redact_context()`).
206
+ - **Disabling:**
207
+ - **Current programmatic path:** pass
208
+ `SecurityManager(SecurityConfig(redaction_enabled=False))` into
209
+ `run_server(..., security_manager=...)`. Note that `run_server()` accepts a
210
+ `SecurityManager`, not a `SecurityConfig`; `_build_default_security_manager()`
211
+ constructs a default `SecurityConfig` internally using only domain
212
+ allow/block lists from env.
213
+ - **Proposed operator/CLI path:** add `SB_MCP_REDACTION=0|false|off` env
214
+ toggle in the implementation PR, parsed by `_build_default_security_manager()`
215
+ alongside the existing domain-list env vars. This gives operators a simple
216
+ opt-out without constructing a custom `SecurityManager`.
217
+ - **Backward-compat for SDK consumers:** Python SDK users calling
218
+ `sb.extract()` / `sb.observe()` directly are unaffected — redaction applies
219
+ only at the MCP serialization boundary.
220
+
221
+ ## Test plan
222
+
223
+ ### Unit tests (shared helper)
224
+
225
+ - `_redact_inspect_output` masks a known API key in a text field
226
+ - `_redact_inspect_output` masks a token in a URL query param
227
+ - `_redact_inspect_output` is a no-op when redaction is disabled
228
+ - `_redact_inspect_output` is a no-op when no secret patterns are present
229
+ - Output shape preserved (same keys, same structure)
230
+
231
+ ### Tool-specific fixture tests
232
+
233
+ - `extract_text`: fixture with an API key in the text → redacted in response
234
+ - `observe`: fixture with a secret in title → redacted; URL query param redacted
235
+ - `current_url`: fixture/current page URL with a token query param → URL redacted
236
+ - `list_tabs`: fixture/tab list with secret-bearing URL/title → URL/title redacted
237
+ - `get_console_messages`: fixture with a token in console text → redacted
238
+ - `get_page_errors`: fixture with a secret in error message → redacted
239
+ - `get_network_errors`: fixture with failed request URL + failure_text secret → both redacted
240
+ - `list_requests`: fixture with a secret in URL query param → URL redacted
241
+ - `get_request`: fixture with a secret in failure_text → redacted
242
+
243
+ ### Negative tests
244
+
245
+ - Non-secret text passes through unchanged (no false positives on normal prose)
246
+ - Redaction disabled → raw output (existing behavior)
247
+
248
+ ## Implementation order (after design approval)
249
+
250
+ ```text
251
+ 1. Add _redact_inspect_output() helper in mcp_server.py
252
+ 2. Wire into the 9 inspect-tier handlers (extract_text, observe, current_url,
253
+ list_tabs, 5 diagnostics)
254
+ 3. Add SB_MCP_REDACTION env toggle (proposed in this design)
255
+ 4. Unit tests for the helper
256
+ 5. Fixture tests per tool
257
+ 6. CHANGELOG [Unreleased] — behavior change note
258
+ 7. Verify: real-browser e2e with a test page that logs a fake API key
259
+ ```
260
+
261
+ ## Resolved questions (from design review)
262
+
263
+ 1. **Should `observe`'s URL be redacted?** **Yes.** Apply the two-pass URL
264
+ redaction (query-param names + secret pattern scan) while preserving scheme,
265
+ host, and path. The same policy applies to `current_url`, `list_tabs`,
266
+ diagnostics request URLs, and any future inspect-tier URL fields.
267
+
268
+ 2. **Should redaction be on by default in the MCP server?** **Yes.** Default-on
269
+ matches the existing `SecurityConfig(redaction_enabled=True)` default and is
270
+ the safer boundary for agent-facing MCP output. A documented opt-out is
271
+ required (both programmatic and env-based), because this is a behavior
272
+ change for MCP consumers.
273
+
274
+ 3. **Should console stack traces be truncated?** **No.** Use pattern-only
275
+ redaction by default. Preserve paths, line numbers, and stack structure;
276
+ redact detected secret substrings only. Truncation would hurt diagnostic
277
+ utility and should be a separate optional limit, not the default.
@@ -5,9 +5,10 @@ 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 **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
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
10
+ why a read failed. When action mode is enabled, it advertises **six additional
11
+ action tools**; every action call is checked by
11
12
  `MCPSessionPolicy` and `SecurityManager` before it can reach the browser.
12
13
 
13
14
  See [RFC #178](https://github.com/Octo-Lex/Super-Browser/issues/178) for the
@@ -30,12 +31,12 @@ python -m patchright install chromium
30
31
  Either of:
31
32
 
32
33
  ```bash
33
- superbrowser-mcp # default: 8 tools (inspect + navigation)
34
- superbrowser-mcp --allow-actions # 14 tools (adds the action tier)
34
+ superbrowser-mcp # default: 14 tools (inspect + diagnostics + navigation)
35
+ superbrowser-mcp --allow-actions # 20 tools (adds the action tier)
35
36
  python -m super_browser.mcp_server
36
37
  ```
37
38
 
38
- Both start a **stdio** server. The default server advertises 8 tools and
39
+ Both start a **stdio** server. The default server advertises 14 tools and
39
40
  recognizes (but refuses) action-tool calls with a structured policy refusal.
40
41
 
41
42
  Action mode can also be enabled via the environment:
@@ -118,18 +119,36 @@ advertised; the third requires action mode; the fourth is not implemented.
118
119
  | `extract_text` | `query` (required), `selector` (optional) | Text content, optionally scoped to a CSS selector. | Yes |
119
120
  | `screenshot` | `full_page` (optional, default `false`) | Base64 PNG of the viewport or full page. | Yes |
120
121
  | `list_tabs` | none | Snapshot of open tabs. | Yes |
122
+ | `get_console_messages` | `level` (optional), `limit` (optional, default 100) | Buffered browser console messages (snapshot, non-destructive). | Yes |
123
+ | `get_page_errors` | `limit` (optional, default 100) | Buffered uncaught page errors with stack traces. | Yes |
124
+ | `get_network_errors` | `url_filter` (optional), `limit` (optional, default 100) | Requests that failed (status ≥ 400, no response, or net error). | Yes |
125
+ | `list_requests` | `url_filter` (optional), `resource_type` (optional), `limit` (optional, default 100) | All buffered request summaries; returns `request_id` for `get_request`. | Yes |
126
+ | `get_request` | `request_id` (required) | One request's metadata (method, url, status, `header_names` — keys only, no values, no body). | Yes |
127
+
128
+ The five diagnostics tools read from a session-wide ring buffer that captures
129
+ console messages, page errors, and network requests via page-event listeners.
130
+ Reads are **snapshots** (non-destructive): the buffer is not cleared on read.
131
+ Diagnostics entries carry a monotonic `seq`, a `timestamp_ms`, and the
132
+ `page_url` at the time of the event. Request records use a stable `request_id`
133
+ (assigned by the buffer); a URL can have multiple requests, so always retrieve
134
+ via `request_id` from `list_requests`, not by URL. **No response bodies and no
135
+ raw header values** are returned — `get_request` exposes `header_names` (keys)
136
+ only.
121
137
 
122
138
  ### Navigation tier (always advertised)
123
139
 
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.
140
+ Navigation mutates browser state (page/context acquisition) but is
141
+ default-allowed because reading requires page/context acquisition. `navigate`
142
+ is checked and audited at the MCP boundary when a SecurityManager is
143
+ configured. `switch_tab` delegates to the facade, which applies its configured
144
+ facade security policy. Navigation tools do **not** consume the action budget
145
+ and do **not** require action mode.
128
146
 
129
147
  | Tool | Args | Behavior |
130
148
  |---|---|---|
131
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. |
132
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
+ | `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. |
133
152
 
134
153
  `wait_for` accepts exactly one condition per call (deterministic single
135
154
  results; compound waits can be added later as an explicit AND mode).
@@ -142,6 +161,24 @@ navigate → wait_for → observe / extract_text / screenshot
142
161
 
143
162
  This is the default-mode loop an agent uses to read a page.
144
163
 
164
+ #### Debugging workflow
165
+
166
+ When a read returns unexpected or empty content, the diagnostics tools explain
167
+ why — without expanding the action surface:
168
+
169
+ ```text
170
+ navigate → wait_for → extract_text / observe
171
+ ↓ (unexpected / empty / errored)
172
+ get_console_messages → get_page_errors → get_network_errors
173
+ ↓ (inspect the evidence)
174
+ list_requests → get_request(request_id=...) (drill into one request)
175
+ ↓
176
+ adjust selector / report failure / retry
177
+ ```
178
+
179
+ Diagnostics are inspect-tier: no `--allow-actions`, no action budget, no audit
180
+ entry, no side effects.
181
+
145
182
  ### Action tier (advertised when action mode is enabled)
146
183
 
147
184
  | Tool | Args | Security level |
@@ -193,7 +230,7 @@ restricts the survivors.
193
230
 
194
231
  The default server behavior partitions the surface by risk:
195
232
 
196
- - **`list_tools()`** advertises only the Inspect + Navigation tiers (8 tools).
233
+ - **`list_tools()`** advertises only the Inspect + Navigation tiers (14 tools).
197
234
  - **`call_tool()`** still recognizes action-tool names and returns a structured
198
235
  policy refusal (`refusal.reason = "actions are disabled"`), not an "Unknown
199
236
  tool" error.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "superbrowser-sdk"
7
- version = "2.4.0"
7
+ version = "2.6.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" }