superbrowser-sdk 2.2.0__tar.gz → 2.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. superbrowser_sdk-2.3.0/.github/workflows/adversarial-v3.yml +140 -0
  2. superbrowser_sdk-2.3.0/.github/workflows/adversarial.yml +117 -0
  3. superbrowser_sdk-2.3.0/.github/workflows/stress.yml +64 -0
  4. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.github/workflows/test.yml +1 -0
  5. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.gitignore +12 -0
  6. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/CHANGELOG.md +51 -1
  7. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/PKG-INFO +26 -12
  8. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/README.md +22 -10
  9. superbrowser_sdk-2.3.0/docs/mcp.md +190 -0
  10. superbrowser_sdk-2.3.0/docs/stealth-evidence.md +182 -0
  11. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/pyproject.toml +19 -3
  12. superbrowser_sdk-2.3.0/scripts/adversarial_run.py +360 -0
  13. superbrowser_sdk-2.3.0/scripts/stress_real_world.py +1149 -0
  14. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/verify_release_artifact.py +7 -1
  15. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/__init__.py +1 -1
  16. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/facade.py +7 -0
  17. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/loop.py +1 -1
  18. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/dwell.py +9 -7
  19. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/navigation.py +25 -6
  20. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/orchestrator.py +17 -4
  21. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/session_seed.py +11 -0
  22. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/config.py +1 -0
  23. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/session.py +11 -4
  24. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/cli/__init__.py +4 -1
  25. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/controller.py +88 -7
  26. superbrowser_sdk-2.3.0/src/super_browser/mcp_server.py +858 -0
  27. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ip_reputation.py +2 -2
  28. superbrowser_sdk-2.3.0/stress/__init__.py +7 -0
  29. superbrowser_sdk-2.3.0/stress/server.py +363 -0
  30. superbrowser_sdk-2.3.0/tests/adversarial/conftest.py +246 -0
  31. superbrowser_sdk-2.3.0/tests/adversarial/controlled_server.py +524 -0
  32. superbrowser_sdk-2.3.0/tests/adversarial/report.py +109 -0
  33. superbrowser_sdk-2.3.0/tests/adversarial/scoring.py +224 -0
  34. superbrowser_sdk-2.3.0/tests/adversarial/targets.py +247 -0
  35. superbrowser_sdk-2.3.0/tests/adversarial/test_controlled_server.py +342 -0
  36. superbrowser_sdk-2.3.0/tests/adversarial/test_targets_unit.py +527 -0
  37. superbrowser_sdk-2.3.0/tests/adversarial/test_tier1_scanners.py +45 -0
  38. superbrowser_sdk-2.3.0/tests/adversarial/test_tier2_vendors.py +53 -0
  39. superbrowser_sdk-2.3.0/tests/adversarial/test_tier3_controlled.py +138 -0
  40. superbrowser_sdk-2.3.0/tests/adversarial_v3/README.md +124 -0
  41. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/__init__.py +14 -0
  42. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/backends.py +312 -0
  43. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/behavioral_telemetry.py +268 -0
  44. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/core.py +352 -0
  45. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/engines/__init__.py +1 -0
  46. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/engines/scoring.py +158 -0
  47. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/harness.py +380 -0
  48. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/__init__.py +1 -0
  49. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/history.py +58 -0
  50. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/json_reporter.py +15 -0
  51. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/reporters/markdown_reporter.py +94 -0
  52. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/server.py +312 -0
  53. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/__init__.py +25 -0
  54. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/automation.py +280 -0
  55. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/behavioral.py +344 -0
  56. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/controlled.py +92 -0
  57. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/ejector.py +235 -0
  58. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/external.py +233 -0
  59. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/fingerprint.py +317 -0
  60. superbrowser_sdk-2.3.0/tests/adversarial_v3/adversarial3/vectors/network.py +175 -0
  61. superbrowser_sdk-2.3.0/tests/adversarial_v3/pytest.ini +9 -0
  62. superbrowser_sdk-2.3.0/tests/adversarial_v3/run.py +139 -0
  63. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/__init__.py +1 -0
  64. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/conftest.py +95 -0
  65. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_backends.py +101 -0
  66. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_behavioral_telemetry.py +126 -0
  67. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_behavioral_telemetry_smoke.py +72 -0
  68. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_behavioral_vectors.py +234 -0
  69. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_core.py +215 -0
  70. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_external.py +155 -0
  71. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_harness_smoke.py +232 -0
  72. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_header_ordering.py +86 -0
  73. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_reporters.py +150 -0
  74. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_scoring.py +300 -0
  75. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_server.py +160 -0
  76. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_superbrowser_backend.py +130 -0
  77. superbrowser_sdk-2.3.0/tests/adversarial_v3/tests/test_vectors.py +197 -0
  78. superbrowser_sdk-2.3.0/tests/test_behavioral/test_hardening.py +435 -0
  79. superbrowser_sdk-2.3.0/tests/test_benchmarks/test_stress_real_world.py +720 -0
  80. superbrowser_sdk-2.3.0/tests/test_mcp_permissions.py +349 -0
  81. superbrowser_sdk-2.3.0/tests/test_mcp_server.py +487 -0
  82. superbrowser_sdk-2.3.0/tests/test_mcp_server_smoke.py +153 -0
  83. superbrowser_sdk-2.3.0/tests/test_mcp_write_tools.py +254 -0
  84. superbrowser_sdk-2.3.0/tests/test_mcp_write_tools_wave2.py +276 -0
  85. superbrowser_sdk-2.3.0/tests/test_runtime_correctness/test_runtime_fixes.py +407 -0
  86. superbrowser_sdk-2.3.0/tests/test_session/test_locale.py +107 -0
  87. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_ip_reputation.py +85 -0
  88. superbrowser_sdk-2.3.0/tests/test_verification/__init__.py +0 -0
  89. superbrowser_sdk-2.3.0/tests/test_vision/__init__.py +0 -0
  90. superbrowser_sdk-2.2.0/analysis/00-SOURCE-INVENTORY.md +0 -545
  91. superbrowser_sdk-2.2.0/analysis/01-TRIAGE-QUEUE.md +0 -91
  92. superbrowser_sdk-2.2.0/analysis/AGENT-BROWSER-ANALYSIS.md +0 -157
  93. superbrowser_sdk-2.2.0/analysis/AGENT-S-ANALYSIS.md +0 -226
  94. superbrowser_sdk-2.2.0/analysis/BROWSER-HARNESS-ANALYSIS.md +0 -216
  95. superbrowser_sdk-2.2.0/analysis/BROWSER-USE-ANALYSIS.md +0 -203
  96. superbrowser_sdk-2.2.0/analysis/CROSS-PROJECT-SYNTHESIS.md +0 -365
  97. superbrowser_sdk-2.2.0/analysis/FIRECRAWL-ANALYSIS.md +0 -188
  98. superbrowser_sdk-2.2.0/analysis/GAP-INVENTORY.md +0 -489
  99. superbrowser_sdk-2.2.0/analysis/HERMES-AGENT-ANALYSIS.md +0 -213
  100. superbrowser_sdk-2.2.0/analysis/HERMES-SELF-EVOLUTION-ANALYSIS.md +0 -171
  101. superbrowser_sdk-2.2.0/analysis/HTTPMORPH-ANALYSIS.md +0 -164
  102. superbrowser_sdk-2.2.0/analysis/IMPLEMENTATION-ROADMAP.md +0 -252
  103. superbrowser_sdk-2.2.0/analysis/LAVAGUE-ANALYSIS.md +0 -127
  104. superbrowser_sdk-2.2.0/analysis/OPENCLAW-ANALYSIS.md +0 -177
  105. superbrowser_sdk-2.2.0/analysis/PATCHRIGHT-ANALYSIS.md +0 -188
  106. superbrowser_sdk-2.2.0/analysis/PROJECT-CONFIG.md +0 -156
  107. superbrowser_sdk-2.2.0/analysis/SESSION-STATE.md +0 -159
  108. superbrowser_sdk-2.2.0/analysis/SKYVERN-ANALYSIS.md +0 -156
  109. superbrowser_sdk-2.2.0/analysis/STAGEHAND-ANALYSIS.md +0 -227
  110. superbrowser_sdk-2.2.0/analysis/UI-TARS-ANALYSIS.md +0 -155
  111. superbrowser_sdk-2.2.0/analysis/UI-TARS-DESKTOP-ANALYSIS.md +0 -201
  112. superbrowser_sdk-2.2.0/analysis/output/CHROMECLAW-ANALYSIS.md +0 -550
  113. superbrowser_sdk-2.2.0/analysis/output/CLAW-VARIANTS-ASSESSMENT.md +0 -131
  114. superbrowser_sdk-2.2.0/analysis/output/E2B-ANALYSIS.md +0 -433
  115. superbrowser_sdk-2.2.0/analysis/output/EVOSKILL-ANALYSIS.md +0 -349
  116. superbrowser_sdk-2.2.0/analysis/output/GO-INFRA-ASSESSMENT.md +0 -74
  117. superbrowser_sdk-2.2.0/analysis/output/GUARDRAILS-ANALYSIS.md +0 -334
  118. superbrowser_sdk-2.2.0/analysis/output/KHOJ-ANALYSIS.md +0 -287
  119. superbrowser_sdk-2.2.0/analysis/output/LETTA-ANALYSIS.md +0 -265
  120. superbrowser_sdk-2.2.0/analysis/output/MCP-AGENT-ANALYSIS.md +0 -384
  121. superbrowser_sdk-2.2.0/analysis/output/MCP-ZERO-ANALYSIS.md +0 -78
  122. superbrowser_sdk-2.2.0/analysis/output/MEM0-ANALYSIS.md +0 -149
  123. superbrowser_sdk-2.2.0/analysis/output/OPENFGA-ANALYSIS.md +0 -582
  124. superbrowser_sdk-2.2.0/analysis/output/SKYLL-ANALYSIS.md +0 -176
  125. superbrowser_sdk-2.2.0/analysis/output/TEMPORAL-ANALYSIS.md +0 -493
  126. superbrowser_sdk-2.2.0/analysis/output/TOOL-BENCHMARK-ASSESSMENT.md +0 -66
  127. superbrowser_sdk-2.2.0/labels/config.json +0 -88
  128. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.env.example +0 -0
  129. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.github/workflows/benchmark.yml +0 -0
  130. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.github/workflows/dco.yml +0 -0
  131. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.github/workflows/e2e.yml +0 -0
  132. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.github/workflows/publish.yml +0 -0
  133. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.github/workflows/smoke.yml +0 -0
  134. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/.pre-commit-config.yaml +0 -0
  135. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/CONTRIBUTING.md +0 -0
  136. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/Dockerfile +0 -0
  137. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/LICENSE +0 -0
  138. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/Super-Browser.png +0 -0
  139. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/behavioral.html +0 -0
  140. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/dom-heavy.html +0 -0
  141. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/form.html +0 -0
  142. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/benchmarks/fixtures/simple.html +0 -0
  143. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/benchmarks/v1.11.0-baseline-patchright.json +0 -0
  144. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/benchmarks/v1.11.0-baseline-patchright.md +0 -0
  145. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/conftest.py +0 -0
  146. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docker-compose.yml +0 -0
  147. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/agent-reliability.md +0 -0
  148. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/aiv/AIV_FRAMEWORK_v5.3.md +0 -0
  149. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/anti-detection-ejecta.md +0 -0
  150. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/api-ergonomics-audit.md +0 -0
  151. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/api-reference.md +0 -0
  152. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/api-stability.md +0 -0
  153. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/architecture.md +0 -0
  154. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/behavioral-synthesis.md +0 -0
  155. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/browser-networking.md +0 -0
  156. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/cloak-integration.md +0 -0
  157. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/consistency-engine.md +0 -0
  158. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/discovery/DISCOVERY-REPORT.md +0 -0
  159. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/error-catalog.md +0 -0
  160. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/fingerprint-scoring.md +0 -0
  161. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/fingerprint-validation.md +0 -0
  162. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/gap-analysis.md +0 -0
  163. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/human-behavior.md +0 -0
  164. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/memory.md +0 -0
  165. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/migration/v1-to-v2.md +0 -0
  166. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/migration/v1.8-to-v1.9.md +0 -0
  167. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/operating-doctrine.md +0 -0
  168. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/platform-abstraction.md +0 -0
  169. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/plugins.md +0 -0
  170. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/quickstart.md +0 -0
  171. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/recording.md +0 -0
  172. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/README.md +0 -0
  173. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-decomposition.md +0 -0
  174. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-a-api-simplification.md +0 -0
  175. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-b-network-stealth.md +0 -0
  176. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-c-behavioral-realism.md +0 -0
  177. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-d-challenge-infrastructure.md +0 -0
  178. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/rfcs/v2-track-e-e2e-harness.md +0 -0
  179. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/docs/stealth-coverage.md +0 -0
  180. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/backend_selection.py +0 -0
  181. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/basic_usage.py +0 -0
  182. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/budget_tracking.py +0 -0
  183. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/cloak_stealth.py +0 -0
  184. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/error_handling.py +0 -0
  185. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/fingerprint_scan.py +0 -0
  186. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/human_behavior.py +0 -0
  187. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/multi_tab_workflow.py +0 -0
  188. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/session_persistence.py +0 -0
  189. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/examples/stealth_mode.py +0 -0
  190. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/agent_efficiency_benchmark.py +0 -0
  191. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/browser_benchmark.py +0 -0
  192. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/e2e_trend.py +0 -0
  193. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/run_stealth_gauntlet.sh +0 -0
  194. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/smoke_published.py +0 -0
  195. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/scripts/validate_e2e_report.py +0 -0
  196. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/__main__.py +0 -0
  197. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/__init__.py +0 -0
  198. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/config.py +0 -0
  199. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/debug.py +0 -0
  200. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/delegator.py +0 -0
  201. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/__init__.py +0 -0
  202. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/anthropic_client.py +0 -0
  203. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/browser_transport.py +0 -0
  204. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/budget_aware.py +0 -0
  205. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/factory.py +0 -0
  206. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/openai_client.py +0 -0
  207. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/llm/protocol.py +0 -0
  208. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/loop_detector.py +0 -0
  209. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/plugins.py +0 -0
  210. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/registry.py +0 -0
  211. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/router.py +0 -0
  212. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/structured_logging.py +0 -0
  213. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/agent/types.py +0 -0
  214. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/__init__.py +0 -0
  215. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/bezier.py +0 -0
  216. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/fitts.py +0 -0
  217. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/gauss.py +0 -0
  218. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/keyboard.py +0 -0
  219. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/mouse.py +0 -0
  220. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/prng.py +0 -0
  221. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/qwerty.py +0 -0
  222. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/scroll.py +0 -0
  223. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/behavioral/types.py +0 -0
  224. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/__init__.py +0 -0
  225. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/__init__.py +0 -0
  226. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/cdp_backend.py +0 -0
  227. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/patchright_backend.py +0 -0
  228. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/playwright_backend.py +0 -0
  229. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/backends/selenium_backend.py +0 -0
  230. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/cdp.py +0 -0
  231. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/cloak_backend.py +0 -0
  232. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/cloud.py +0 -0
  233. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/discovery.py +0 -0
  234. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/engine.py +0 -0
  235. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/fetch.py +0 -0
  236. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/__init__.py +0 -0
  237. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/bidi_injector.py +0 -0
  238. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/cdp_injector.py +0 -0
  239. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/injectors/page_injector.py +0 -0
  240. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/page.py +0 -0
  241. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/shutdown.py +0 -0
  242. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/browser/tabs.py +0 -0
  243. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/__init__.py +0 -0
  244. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/cascade.py +0 -0
  245. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/client.py +0 -0
  246. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/compressor.py +0 -0
  247. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/cost_estimator.py +0 -0
  248. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/credential_pool.py +0 -0
  249. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/governor.py +0 -0
  250. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/budget/types.py +0 -0
  251. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/cli/commands.py +0 -0
  252. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/cli/interactive.py +0 -0
  253. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/cli/script.py +0 -0
  254. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/config.py +0 -0
  255. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/events/__init__.py +0 -0
  256. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/events/bus.py +0 -0
  257. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/events/types.py +0 -0
  258. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/__init__.py +0 -0
  259. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/cache.py +0 -0
  260. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/decorator.py +0 -0
  261. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/presets.py +0 -0
  262. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/recovery.py +0 -0
  263. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/snapshot.py +0 -0
  264. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/types.py +0 -0
  265. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/interaction/vision.py +0 -0
  266. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/memory/__init__.py +0 -0
  267. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/memory/integration.py +0 -0
  268. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/memory/store.py +0 -0
  269. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/memory/types.py +0 -0
  270. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/plugins/__init__.py +0 -0
  271. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/plugins/decorators.py +0 -0
  272. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/plugins/hooks.py +0 -0
  273. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/py.typed +0 -0
  274. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recording/__init__.py +0 -0
  275. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recording/persistence.py +0 -0
  276. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recording/recorder.py +0 -0
  277. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recording/replayer.py +0 -0
  278. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recording/report.py +0 -0
  279. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recording/types.py +0 -0
  280. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/__init__.py +0 -0
  281. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/checkpoint.py +0 -0
  282. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/classifier.py +0 -0
  283. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/coordinator.py +0 -0
  284. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/event_bus.py +0 -0
  285. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/format_validator.py +0 -0
  286. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/reflection.py +0 -0
  287. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/retry_tracker.py +0 -0
  288. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/session_recovery.py +0 -0
  289. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/types.py +0 -0
  290. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/recovery/watchdogs.py +0 -0
  291. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/results/__init__.py +0 -0
  292. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/results/output.py +0 -0
  293. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/results/typed.py +0 -0
  294. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/results/types.py +0 -0
  295. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/results/validation.py +0 -0
  296. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/__init__.py +0 -0
  297. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/action_redaction.py +0 -0
  298. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/approval.py +0 -0
  299. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/credential_vault.py +0 -0
  300. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/domain_filter.py +0 -0
  301. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/gate.py +0 -0
  302. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/injection.py +0 -0
  303. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/manager.py +0 -0
  304. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/policy.py +0 -0
  305. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/redactor.py +0 -0
  306. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/security/types.py +0 -0
  307. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/session/__init__.py +0 -0
  308. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/session/proxy.py +0 -0
  309. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/skills/__init__.py +0 -0
  310. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/skills/activation.py +0 -0
  311. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/skills/markdown.py +0 -0
  312. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/skills/registry.py +0 -0
  313. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/skills/types.py +0 -0
  314. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/__init__.py +0 -0
  315. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/action_policy.py +0 -0
  316. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/captcha.py +0 -0
  317. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/__init__.py +0 -0
  318. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/cache.py +0 -0
  319. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/pow.py +0 -0
  320. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/challenges/turnstile.py +0 -0
  321. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/__init__.py +0 -0
  322. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/dag.py +0 -0
  323. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/derive.py +0 -0
  324. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/errors.py +0 -0
  325. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/inject.py +0 -0
  326. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/inject_delivery.py +0 -0
  327. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/matrix.py +0 -0
  328. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/prng.py +0 -0
  329. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rule.py +0 -0
  330. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/__init__.py +0 -0
  331. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/audio.py +0 -0
  332. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/behavior.py +0 -0
  333. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/fonts.py +0 -0
  334. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/gpu.py +0 -0
  335. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/locale.py +0 -0
  336. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/navigator.py +0 -0
  337. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/screen.py +0 -0
  338. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/consistency/rules/user_agent.py +0 -0
  339. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/diagnostics.py +0 -0
  340. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/__init__.py +0 -0
  341. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/audio.py +0 -0
  342. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/browser_apis.py +0 -0
  343. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/canvas.py +0 -0
  344. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/config.py +0 -0
  345. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/registry.py +0 -0
  346. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/timing.py +0 -0
  347. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/types.py +0 -0
  348. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/ejecta/webrtc.py +0 -0
  349. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/fingerprint_scanner.py +0 -0
  350. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/fingerprint_score.py +0 -0
  351. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/headers.py +0 -0
  352. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/human.py +0 -0
  353. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/human_config.py +0 -0
  354. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/manager.py +0 -0
  355. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/__init__.py +0 -0
  356. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/linux-chrome-stable.json +0 -0
  357. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/macos-chrome-stable.json +0 -0
  358. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/macos-m4-chrome-stable.json +0 -0
  359. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/data/windows-chrome-stable.json +0 -0
  360. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/host_detect.py +0 -0
  361. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/profiles/schema.py +0 -0
  362. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/proxy.py +0 -0
  363. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/proxy_pool.py +0 -0
  364. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/report.py +0 -0
  365. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/scoring.py +0 -0
  366. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/tls_baselines.json +0 -0
  367. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/tls_fingerprint.py +0 -0
  368. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/types.py +0 -0
  369. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/user_agent_pool.py +0 -0
  370. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/__init__.py +0 -0
  371. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/checks.py +0 -0
  372. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/harness.py +0 -0
  373. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/report.py +0 -0
  374. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/stealth/validation/suite.py +0 -0
  375. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/testing.py +0 -0
  376. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/__init__.py +0 -0
  377. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/cost_analytics.py +0 -0
  378. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/flow_logger.py +0 -0
  379. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/middleware.py +0 -0
  380. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/session_db.py +0 -0
  381. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/sinks.py +0 -0
  382. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/tracing/types.py +0 -0
  383. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/verification/__init__.py +0 -0
  384. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/verification/ax_diff.py +0 -0
  385. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/verification/hasher.py +0 -0
  386. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/verification/types.py +0 -0
  387. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/verification/verifier.py +0 -0
  388. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/__init__.py +0 -0
  389. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/cache.py +0 -0
  390. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/controller.py +0 -0
  391. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/coords.py +0 -0
  392. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/factory.py +0 -0
  393. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/ocr.py +0 -0
  394. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/providers.py +0 -0
  395. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/src/super_browser/vision/types.py +0 -0
  396. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/__init__.py +0 -0
  397. {superbrowser_sdk-2.2.0/tests/integration → superbrowser_sdk-2.3.0/tests/adversarial}/__init__.py +0 -0
  398. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/conftest.py +0 -0
  399. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/__init__.py +0 -0
  400. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/conftest.py +0 -0
  401. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_01_example_nav.py +0 -0
  402. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_02_google_search.py +0 -0
  403. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_03_github_login.py +0 -0
  404. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_04_amazon_search.py +0 -0
  405. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_05_google_forms.py +0 -0
  406. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_06_google_flights.py +0 -0
  407. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_07_wikipedia_extract.py +0 -0
  408. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_08_reddit_spa.py +0 -0
  409. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_09_form_complex.py +0 -0
  410. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/discovery/test_task_10_signup_flow.py +0 -0
  411. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/__init__.py +0 -0
  412. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/conftest.py +0 -0
  413. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_behavioral_realism.py +0 -0
  414. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_challenge_detection.py +0 -0
  415. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_interaction.py +0 -0
  416. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_live_navigation.py +0 -0
  417. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_multi_tab.py +0 -0
  418. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_navigation.py +0 -0
  419. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_session_persistence.py +0 -0
  420. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e/test_stealth_overhead.py +0 -0
  421. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/e2e_v1_3_journey.py +0 -0
  422. {superbrowser_sdk-2.2.0/tests/stealth_detection → superbrowser_sdk-2.3.0/tests/integration}/__init__.py +0 -0
  423. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/conftest.py +0 -0
  424. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_config_composition.py +0 -0
  425. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_engine_backends.py +0 -0
  426. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_error_paths.py +0 -0
  427. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_facade_smoke.py +0 -0
  428. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_full_lifecycle.py +0 -0
  429. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_multi_backend.py +0 -0
  430. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_performance_smoke.py +0 -0
  431. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_playwright_integration.py +0 -0
  432. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_public_api.py +0 -0
  433. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_session_persistence.py +0 -0
  434. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_stealth_abstraction.py +0 -0
  435. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v1100_features.py +0 -0
  436. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v150_features.py +0 -0
  437. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v160_features.py +0 -0
  438. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v170_features.py +0 -0
  439. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v180_features.py +0 -0
  440. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v190_features.py +0 -0
  441. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v191_features.py +0 -0
  442. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v192_features.py +0 -0
  443. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v193_features.py +0 -0
  444. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v194_features.py +0 -0
  445. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v195_features.py +0 -0
  446. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v1_3_features.py +0 -0
  447. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/integration/test_v1_4_features.py +0 -0
  448. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/pattern_validation.py +0 -0
  449. {superbrowser_sdk-2.2.0/tests/test_agent → superbrowser_sdk-2.3.0/tests/stealth_detection}/__init__.py +0 -0
  450. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/conftest.py +0 -0
  451. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_chrome_runtime.py +0 -0
  452. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_cli_switches.py +0 -0
  453. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_headless_indicators.py +0 -0
  454. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_live_sites.py +0 -0
  455. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_runtime_enable.py +0 -0
  456. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_tls_fingerprint.py +0 -0
  457. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/stealth_detection/test_webdriver.py +0 -0
  458. {superbrowser_sdk-2.2.0/tests/test_behavioral → superbrowser_sdk-2.3.0/tests/test_agent}/__init__.py +0 -0
  459. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_action_timeout.py +0 -0
  460. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_browser_transport.py +0 -0
  461. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_controller_rebinding.py +0 -0
  462. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_debug_mode.py +0 -0
  463. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_default_tooling.py +0 -0
  464. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_delegator.py +0 -0
  465. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_error_screenshots.py +0 -0
  466. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade.py +0 -0
  467. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security.py +0 -0
  468. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_control.py +0 -0
  469. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_file_tab.py +0 -0
  470. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_network.py +0 -0
  471. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_facade_security_session.py +0 -0
  472. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_fail_fast.py +0 -0
  473. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm.py +0 -0
  474. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm_budget.py +0 -0
  475. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm_production.py +0 -0
  476. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_llm_streaming.py +0 -0
  477. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_loop.py +0 -0
  478. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_loop_detector.py +0 -0
  479. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_prompt_isolation.py +0 -0
  480. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_registry.py +0 -0
  481. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_retry_budget.py +0 -0
  482. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_streaming.py +0 -0
  483. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_structured_logging.py +0 -0
  484. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_tab_cap.py +0 -0
  485. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_task_02.py +0 -0
  486. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_agent/test_types.py +0 -0
  487. {superbrowser_sdk-2.2.0/tests/test_benchmark → superbrowser_sdk-2.3.0/tests/test_behavioral}/__init__.py +0 -0
  488. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_behavioral.py +0 -0
  489. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_dwell.py +0 -0
  490. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_human_config_dwell.py +0 -0
  491. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_navigation.py +0 -0
  492. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_orchestrator.py +0 -0
  493. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_behavioral/test_session_seed.py +0 -0
  494. {superbrowser_sdk-2.2.0/tests/test_browser → superbrowser_sdk-2.3.0/tests/test_benchmark}/__init__.py +0 -0
  495. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_benchmark/test_efficiency.py +0 -0
  496. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_benchmarks/test_browser_benchmark.py +0 -0
  497. {superbrowser_sdk-2.2.0/tests/test_budget → superbrowser_sdk-2.3.0/tests/test_browser}/__init__.py +0 -0
  498. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cdp.py +0 -0
  499. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cdp_backend.py +0 -0
  500. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cloak_backend.py +0 -0
  501. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cloak_docs.py +0 -0
  502. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_cloak_integration.py +0 -0
  503. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_config.py +0 -0
  504. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_discovery.py +0 -0
  505. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_engine_protocol.py +0 -0
  506. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_fetch.py +0 -0
  507. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_injectors.py +0 -0
  508. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_page.py +0 -0
  509. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_patchright_backend.py +0 -0
  510. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_playwright_backend.py +0 -0
  511. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_selenium_backend.py +0 -0
  512. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_session.py +0 -0
  513. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_browser/test_shutdown.py +0 -0
  514. {superbrowser_sdk-2.2.0/tests/test_interaction → superbrowser_sdk-2.3.0/tests/test_budget}/__init__.py +0 -0
  515. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_cascade.py +0 -0
  516. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_cascade_governor.py +0 -0
  517. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_circuit_breaker.py +0 -0
  518. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_client.py +0 -0
  519. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_compressor.py +0 -0
  520. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_cost_estimator.py +0 -0
  521. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_credential_pool.py +0 -0
  522. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_governor.py +0 -0
  523. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_budget/test_types.py +0 -0
  524. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_cli/test_interactive.py +0 -0
  525. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_cli/test_script.py +0 -0
  526. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_cli/test_stealth_check.py +0 -0
  527. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_cli/test_stealth_validate.py +0 -0
  528. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_cli/test_unified_cli.py +0 -0
  529. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_config.py +0 -0
  530. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_e2e/test_report_schema.py +0 -0
  531. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_e2e/test_trend.py +0 -0
  532. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_audio.py +0 -0
  533. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_batch37_integration.py +0 -0
  534. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_batch38_integration.py +0 -0
  535. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_browser_apis.py +0 -0
  536. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_canvas.py +0 -0
  537. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_integration.py +0 -0
  538. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_timing.py +0 -0
  539. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_ejecta/test_webrtc.py +0 -0
  540. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_events/test_event_bus.py +0 -0
  541. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_events/test_lifecycle_hooks.py +0 -0
  542. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_governance_docs.py +0 -0
  543. {superbrowser_sdk-2.2.0/tests/test_memory → superbrowser_sdk-2.3.0/tests/test_interaction}/__init__.py +0 -0
  544. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_cache.py +0 -0
  545. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_controller.py +0 -0
  546. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_decorator.py +0 -0
  547. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_injection.py +0 -0
  548. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_page_change.py +0 -0
  549. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_presets.py +0 -0
  550. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_recovery.py +0 -0
  551. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_snapshot.py +0 -0
  552. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_types.py +0 -0
  553. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_interaction/test_vision.py +0 -0
  554. {superbrowser_sdk-2.2.0/tests/test_recording → superbrowser_sdk-2.3.0/tests/test_memory}/__init__.py +0 -0
  555. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_memory/test_cli_config.py +0 -0
  556. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_memory/test_integration.py +0 -0
  557. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_memory/test_store.py +0 -0
  558. {superbrowser_sdk-2.2.0/tests/test_recovery → superbrowser_sdk-2.3.0/tests/test_recording}/__init__.py +0 -0
  559. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recording/test_persistence.py +0 -0
  560. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recording/test_recorder.py +0 -0
  561. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recording/test_replayer.py +0 -0
  562. {superbrowser_sdk-2.2.0/tests/test_results → superbrowser_sdk-2.3.0/tests/test_recovery}/__init__.py +0 -0
  563. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_checkpoint.py +0 -0
  564. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_classifier.py +0 -0
  565. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_coordinator.py +0 -0
  566. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_event_bus.py +0 -0
  567. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_format_validator.py +0 -0
  568. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_reflection.py +0 -0
  569. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_retry_tracker.py +0 -0
  570. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_session_recovery.py +0 -0
  571. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_types.py +0 -0
  572. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_recovery/test_watchdogs.py +0 -0
  573. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_release/test_naming_consistency.py +0 -0
  574. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_release/test_smoke_published.py +0 -0
  575. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_release/test_verify_artifact.py +0 -0
  576. {superbrowser_sdk-2.2.0/tests/test_security → superbrowser_sdk-2.3.0/tests/test_results}/__init__.py +0 -0
  577. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_results/test_batch40_integration.py +0 -0
  578. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_results/test_categories.py +0 -0
  579. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_results/test_output.py +0 -0
  580. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_results/test_typed.py +0 -0
  581. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_results/test_types.py +0 -0
  582. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_results/test_validation.py +0 -0
  583. {superbrowser_sdk-2.2.0/tests/test_session → superbrowser_sdk-2.3.0/tests/test_runtime_correctness}/__init__.py +0 -0
  584. {superbrowser_sdk-2.2.0/tests/test_skills → superbrowser_sdk-2.3.0/tests/test_security}/__init__.py +0 -0
  585. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_approval.py +0 -0
  586. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_credential_vault.py +0 -0
  587. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_domain_filter.py +0 -0
  588. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_injection.py +0 -0
  589. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_manager.py +0 -0
  590. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_policy.py +0 -0
  591. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_redaction_pipeline.py +0 -0
  592. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_redactor.py +0 -0
  593. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_security/test_types.py +0 -0
  594. {superbrowser_sdk-2.2.0/tests/test_stealth → superbrowser_sdk-2.3.0/tests/test_session}/__init__.py +0 -0
  595. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_session/test_proxy.py +0 -0
  596. {superbrowser_sdk-2.2.0/tests/test_tracing → superbrowser_sdk-2.3.0/tests/test_skills}/__init__.py +0 -0
  597. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_skills/test_activation.py +0 -0
  598. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_skills/test_integration.py +0 -0
  599. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_skills/test_markdown.py +0 -0
  600. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_skills/test_registry.py +0 -0
  601. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_skills/test_types.py +0 -0
  602. {superbrowser_sdk-2.2.0/tests/test_verification → superbrowser_sdk-2.3.0/tests/test_stealth}/__init__.py +0 -0
  603. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_action_policy.py +0 -0
  604. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_captcha.py +0 -0
  605. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_captcha_resolution.py +0 -0
  606. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_challenge_cache.py +0 -0
  607. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_challenge_config.py +0 -0
  608. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_consistency/test_consistency.py +0 -0
  609. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_consistency_inject.py +0 -0
  610. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_diagnostics.py +0 -0
  611. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_e2e_lifecycle.py +0 -0
  612. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_e2e_reporting.py +0 -0
  613. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_fingerprint_scanner.py +0 -0
  614. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_fingerprint_score.py +0 -0
  615. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_headers.py +0 -0
  616. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_human.py +0 -0
  617. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_human_behavior_v2.py +0 -0
  618. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_kasada_detection.py +0 -0
  619. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_manager.py +0 -0
  620. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_network_stealth_config.py +0 -0
  621. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_profiles.py +0 -0
  622. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_proxy.py +0 -0
  623. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_proxy_pool.py +0 -0
  624. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_stealth_bridge.py +0 -0
  625. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_tls_fingerprint.py +0 -0
  626. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_turnstile_detection.py +0 -0
  627. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_types.py +0 -0
  628. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_user_agent_pool.py +0 -0
  629. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_stealth/test_validation.py +0 -0
  630. {superbrowser_sdk-2.2.0/tests/test_vision → superbrowser_sdk-2.3.0/tests/test_tracing}/__init__.py +0 -0
  631. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_cost_analytics.py +0 -0
  632. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_flow_logger.py +0 -0
  633. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_middleware.py +0 -0
  634. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_session_db.py +0 -0
  635. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_sinks.py +0 -0
  636. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_tracing/test_types.py +0 -0
  637. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_verification/test_ax_diff.py +0 -0
  638. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_verification/test_hasher.py +0 -0
  639. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_verification/test_types.py +0 -0
  640. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_verification/test_verifier.py +0 -0
  641. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_cache.py +0 -0
  642. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_controller.py +0 -0
  643. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_coords.py +0 -0
  644. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_factory.py +0 -0
  645. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_ocr.py +0 -0
  646. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_providers.py +0 -0
  647. {superbrowser_sdk-2.2.0 → superbrowser_sdk-2.3.0}/tests/test_vision/test_types.py +0 -0
@@ -0,0 +1,140 @@
1
+ name: Adversarial v3 Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - 'tests/adversarial_v3/**'
8
+ pull_request:
9
+ paths:
10
+ - 'tests/adversarial_v3/**'
11
+ workflow_dispatch:
12
+ inputs:
13
+ backend:
14
+ description: 'Browser backend for real-browser run'
15
+ required: false
16
+ default: 'stub'
17
+ type: choice
18
+ options:
19
+ - stub
20
+ - playwright
21
+ - superbrowser
22
+
23
+ jobs:
24
+ # --- Offline structural tests (always run, merge gate) ---
25
+ offline:
26
+ runs-on: ubuntu-latest
27
+ timeout-minutes: 5
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - uses: actions/setup-python@v5
31
+ with:
32
+ python-version: '3.11'
33
+ - name: Install test deps
34
+ run: pip install pytest pytest-asyncio
35
+ - name: Run offline adversarial v3 suite
36
+ working-directory: tests/adversarial_v3
37
+ run: |
38
+ PYTHONPATH=. python -m pytest tests/ -v --tb=short
39
+ - name: Verify stub produces no fabricated evidence
40
+ working-directory: tests/adversarial_v3
41
+ run: |
42
+ PYTHONPATH=. python -c "
43
+ import subprocess, json, sys, tempfile, os
44
+ out = tempfile.mkdtemp()
45
+ r = subprocess.run(
46
+ [sys.executable, 'run.py', '--all', '--backend', 'stub', '--output-dir', out],
47
+ capture_output=True, text=True
48
+ )
49
+ # Always surface subprocess output + report contents so any
50
+ # assertion failure is diagnosable. Previously capture_output
51
+ # hid run.py's stdout/stderr, leaving only a bare AssertionError.
52
+ print('=== run.py return code:', r.returncode, flush=True)
53
+ print('=== run.py STDOUT ===', flush=True)
54
+ print(r.stdout, flush=True)
55
+ print('=== run.py STDERR ===', flush=True)
56
+ print(r.stderr, flush=True)
57
+ reports = [f for f in os.listdir(out) if f.endswith('.json')]
58
+ print('=== report files:', reports, flush=True)
59
+ assert r.returncode == 0, f'Stub run should exit 0, got {r.returncode}'
60
+ # The harness writes two JSON files: the run report and
61
+ # adversarial-history.json (the trend log). Select only the
62
+ # per-run report; asserting on all *.json matched the history
63
+ # file too and failed with "Expected 1 report, got 2".
64
+ reports = [f for f in reports if f != 'adversarial-history.json']
65
+ assert len(reports) == 1, f'Expected 1 report, got {len(reports)}: {reports}'
66
+ with open(os.path.join(out, reports[0])) as f:
67
+ data = json.load(f)
68
+ clean = [r for r in data['results'] if r['verdict'] == 'clean']
69
+ flagged = [r for r in data['results'] if r['verdict'] == 'flagged']
70
+ print('=== verdicts:', [(r['vector_id'], r['verdict']) for r in data['results']], flush=True)
71
+ assert len(clean) == 0, f'Stub should not produce CLEAN, got {len(clean)}: {[r[\"vector_id\"] for r in clean]}'
72
+ assert len(flagged) == 0, f'Stub should not produce FLAGGED, got {len(flagged)}: {[r[\"vector_id\"] for r in flagged]}'
73
+ print(f'Stub honesty verified: 0 CLEAN, 0 FLAGGED, exit 0')
74
+ "
75
+
76
+ # --- Real-browser validation (manual dispatch only) ---
77
+ real-browser:
78
+ runs-on: ubuntu-latest
79
+ timeout-minutes: 10
80
+ if: github.event_name == 'workflow_dispatch'
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+ - uses: actions/setup-python@v5
84
+ with:
85
+ python-version: '3.11'
86
+ - name: Install deps
87
+ run: |
88
+ pip install playwright pytest pytest-asyncio
89
+ python -m playwright install --with-deps chromium
90
+ - name: Install SuperBrowser (for superbrowser backend)
91
+ if: github.event.inputs.backend == 'superbrowser'
92
+ run: |
93
+ # Install the SDK from the checked-out repository, NOT from PyPI.
94
+ # `pip install superbrowser-sdk[all]` would validate the published
95
+ # package while the PR's src/ tree went unimported — a false
96
+ # certification. `.[all]` installs the code under review.
97
+ pip install '.[all]'
98
+ python -m patchright install --with-deps chromium
99
+ - name: Run controlled tier
100
+ # Diagnostic only. run.py exits non-zero on any CRITICAL+FLAGGED
101
+ # verdict — which is the *expected* outcome on a bare CI runner
102
+ # with headless Chromium (the detection tool is doing its job).
103
+ # A flag here means detection worked, not that the harness broke.
104
+ # We capture the report but do not let it fail the job; the
105
+ # smoke-test step below is the actual wiring gate.
106
+ continue-on-error: true
107
+ working-directory: tests/adversarial_v3
108
+ run: |
109
+ PYTHONPATH=. python run.py \
110
+ --tier controlled \
111
+ --backend ${{ github.event.inputs.backend }} \
112
+ --output-dir /tmp/adv3-reports
113
+ - name: Run internal vectors
114
+ # Same rationale as the controlled tier: diagnostic capture.
115
+ continue-on-error: true
116
+ working-directory: tests/adversarial_v3
117
+ run: |
118
+ PYTHONPATH=. python run.py \
119
+ --tier fingerprint --tier automation --tier ejector --tier network --tier controlled \
120
+ --backend ${{ github.event.inputs.backend }} \
121
+ --output-dir /tmp/adv3-reports
122
+ - name: Run SuperBrowser backend smoke tests
123
+ # The real-backend merge gate. SB_AD3_SMOKE=1 un-skips the 8
124
+ # tests in test_superbrowser_backend.py that instantiate
125
+ # SuperBrowserBackend against the checked-out SDK. These catch
126
+ # constructor/lifecycle/evaluate drift. Unlike the diagnostic
127
+ # tiers above, THIS step is allowed to fail the job — it tests
128
+ # backend wiring, not stealth outcome.
129
+ if: github.event.inputs.backend == 'superbrowser'
130
+ working-directory: tests/adversarial_v3
131
+ env:
132
+ SB_AD3_SMOKE: '1'
133
+ run: |
134
+ PYTHONPATH=.:../../src python -m pytest tests/test_superbrowser_backend.py -v --tb=short
135
+ - name: Upload reports
136
+ uses: actions/upload-artifact@v4
137
+ if: always()
138
+ with:
139
+ name: adversarial-v3-reports
140
+ path: /tmp/adv3-reports/
@@ -0,0 +1,117 @@
1
+ name: Adversarial Stealth Validation
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tier:
7
+ description: "Which tier(s) to run"
8
+ required: true
9
+ default: "tier3"
10
+ type: choice
11
+ options:
12
+ - tier3
13
+ - tier1
14
+ - tier2
15
+ - all
16
+ run_id:
17
+ description: "Custom run ID (optional)"
18
+ required: false
19
+ type: string
20
+
21
+ concurrency:
22
+ group: adversarial-${{ github.ref }}
23
+ cancel-in-progress: false
24
+
25
+ jobs:
26
+ adversarial:
27
+ runs-on: ubuntu-latest
28
+ timeout-minutes: 30
29
+
30
+ steps:
31
+ - name: Checkout
32
+ uses: actions/checkout@v4
33
+
34
+ - name: Set up Python
35
+ uses: actions/setup-python@v5
36
+ with:
37
+ python-version: "3.11"
38
+
39
+ - name: Install dependencies
40
+ run: |
41
+ python -m pip install --upgrade pip
42
+ pip install -e .[all] || pip install -e .
43
+ pip install pytest pytest-asyncio
44
+
45
+ - name: Install browser engine
46
+ run: |
47
+ python -m patchright install --with-deps chromium || \
48
+ python -m playwright install --with-deps chromium || true
49
+
50
+ - name: Compute tier env vars
51
+ id: tiers
52
+ run: |
53
+ TIER="${{ inputs.tier }}"
54
+ if [ "$TIER" = "tier1" ] || [ "$TIER" = "all" ]; then
55
+ echo "adv=1" >> "$GITHUB_OUTPUT"
56
+ else
57
+ echo "adv=0" >> "$GITHUB_OUTPUT"
58
+ fi
59
+ if [ "$TIER" = "tier2" ] || [ "$TIER" = "all" ]; then
60
+ echo "vendors=1" >> "$GITHUB_OUTPUT"
61
+ echo "vendors_ack=1" >> "$GITHUB_OUTPUT"
62
+ else
63
+ echo "vendors=0" >> "$GITHUB_OUTPUT"
64
+ echo "vendors_ack=0" >> "$GITHUB_OUTPUT"
65
+ fi
66
+
67
+ - name: Run adversarial harness
68
+ env:
69
+ SB_ADV: ${{ steps.tiers.outputs.adv }}
70
+ SB_ADV_VENDORS: ${{ steps.tiers.outputs.vendors }}
71
+ SB_ADV_VENDORS_ACK: ${{ steps.tiers.outputs.vendors_ack }}
72
+ run: |
73
+ RUN_ID_ARG=""
74
+ if [ -n "${{ inputs.run_id }}" ]; then
75
+ RUN_ID_ARG="--run-id ${{ inputs.run_id }}"
76
+ fi
77
+ python scripts/adversarial_run.py \
78
+ --tier ${{ inputs.tier }} \
79
+ --output adversarial-results/report.json \
80
+ --markdown adversarial-results/report.md \
81
+ --history adversarial-results/adversarial-history.json \
82
+ $RUN_ID_ARG
83
+
84
+ - name: Upload artifacts
85
+ uses: actions/upload-artifact@v4
86
+ with:
87
+ name: adversarial-report-${{ github.run_id }}
88
+ path: adversarial-results/
89
+
90
+ - name: Comment on PR (if triggered from a PR branch)
91
+ if: github.event_name == 'workflow_dispatch' && github.event.inputs.tier != 'tier3'
92
+ uses: actions/github-script@v7
93
+ with:
94
+ script: |
95
+ const fs = require('fs');
96
+ // workflow_dispatch from a branch does not populate
97
+ // context.issue.number. Find the PR for this branch instead.
98
+ const branch = context.ref.replace('refs/heads/', '');
99
+ const prs = await github.rest.pulls.list({
100
+ owner: context.repo.owner,
101
+ repo: context.repo.repo,
102
+ head: `${context.repo.owner}:${branch}`,
103
+ state: 'open',
104
+ });
105
+ if (prs.data.length === 0) {
106
+ core.info(`No open PR found for branch ${branch}, skipping comment.`);
107
+ return;
108
+ }
109
+ const prNumber = prs.data[0].number;
110
+ const md = fs.readFileSync('adversarial-results/report.md', 'utf8');
111
+ await github.rest.issues.createComment({
112
+ issue_number: prNumber,
113
+ owner: context.repo.owner,
114
+ repo: context.repo.repo,
115
+ body: `## 🤖 Adversarial Stealth Validation Report\n\n${md}`
116
+ });
117
+ core.info(`Commented on PR #${prNumber}`);
@@ -0,0 +1,64 @@
1
+ name: Stress Test
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ mode:
7
+ description: "Quick or realistic"
8
+ required: true
9
+ default: "quick"
10
+ type: choice
11
+ options:
12
+ - quick
13
+ - realistic
14
+ sessions:
15
+ description: "Number of sessions (realistic mode)"
16
+ required: false
17
+ default: "3"
18
+ concurrency:
19
+ description: "Concurrency (realistic mode)"
20
+ required: false
21
+ default: "2"
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ stress:
28
+ runs-on: ubuntu-latest
29
+ timeout-minutes: 15
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+
33
+ - uses: actions/setup-python@v5
34
+ with:
35
+ python-version: "3.12"
36
+
37
+ - name: Install Super Browser
38
+ run: |
39
+ pip install --upgrade pip
40
+ pip install -e ".[patchright]"
41
+ python -m patchright install chromium
42
+
43
+ - name: Run stress test (quick)
44
+ if: inputs.mode == 'quick'
45
+ run: |
46
+ python scripts/stress_real_world.py --quick \
47
+ --output stress-results
48
+
49
+ - name: Run stress test (realistic)
50
+ if: inputs.mode == 'realistic'
51
+ run: |
52
+ python scripts/stress_real_world.py --realistic \
53
+ --sessions ${{ inputs.sessions }} \
54
+ --concurrency ${{ inputs.concurrency }} \
55
+ --output stress-results
56
+
57
+ - name: Upload stress report
58
+ if: always()
59
+ uses: actions/upload-artifact@v4
60
+ with:
61
+ name: stress-report
62
+ path: stress-results/
63
+ retention-days: 90
64
+ if-no-files-found: warn
@@ -67,6 +67,7 @@ jobs:
67
67
  --ignore=tests/pattern_validation.py
68
68
  --ignore=tests/stealth_detection/
69
69
  --ignore=tests/discovery/
70
+ --ignore=tests/adversarial/
70
71
  -q
71
72
  env:
72
73
  PYTHONIOENCODING: utf-8
@@ -70,7 +70,19 @@ benchmarks/results/
70
70
 
71
71
  # Smoke test results
72
72
  smoke-results/
73
+ stress-results/
73
74
 
74
75
  # E2E trend artifacts
75
76
  tests/e2e/artifacts/e2e-history.json
76
77
  tests/e2e/artifacts/e2e-trend.md
78
+ adversarial-results/
79
+
80
+ # Adversarial v3 artifacts
81
+ tests/adversarial_v3/adversarial-results/
82
+ tests/adversarial_v3/.pytest_cache/
83
+
84
+ # Research / competitive-analysis snapshots (one-time, not living docs)
85
+ analysis/
86
+
87
+ # Agent UI-state config (workspace-local, not SDK artifacts)
88
+ labels/
@@ -5,7 +5,57 @@ 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
- ## [Unreleased]
8
+ ## [2.3.0] — 2026-06-22
9
+
10
+ ### Bug Fixes
11
+
12
+ - `BrowserSession.start()` now passes `locale` to `new_context()`, fixing the missing `Accept-Language` header regression (T5-002, #198). Added `locale` field to `SessionConfig` (default `"en-US"`); `locale=None` omits the key for engine defaults.
13
+
14
+ ### MCP Server — Phase 2
15
+
16
+ - Restored tested MCP server (`superbrowser-mcp`, `python -m super_browser.mcp_server`) over stdio (#179).
17
+ - Permission substrate: `MCPSessionPolicy`, `MCPAuthorizer`, `MCPAuditEntry` — central 5-step authorization path (write-enabled → action-count → timeout → `SecurityManager` → audit) (#183).
18
+ - Write tools: `navigate`, `scroll`, `press_key`, `click`, `fill`, `open_tab`, `close_tab` — all gated by `MCPSessionPolicy.allow_writes` (default `False`) and routed through `SecurityManager` before reaching the facade (#184, #185).
19
+ - `build_server()` now accepts `policy` and `security_manager` kwargs; `list_tools()` advertises write tools only when `allow_writes=True`.
20
+ - Default server behavior is asymmetric: `list_tools()` advertises 6 read-only tools; `call_tool()` recognizes write-tool names and returns a structured policy refusal (not "unknown tool").
21
+ - `fill` sends only the literal caller-supplied value — does not retrieve, infer, store, or auto-fill credentials.
22
+ - Structured refusals, domain allow/block enforcement, audit logging for all write attempts (allowed and denied).
23
+ - Still excluded: `download`, `upload`, `act`, arbitrary JS execution.
24
+
25
+ ## [2.2.1] — 2026-06-17
26
+
27
+ ### Overview
28
+
29
+ **v2.2.1 — Runtime Correctness**
30
+
31
+ Patch release fixing three user-facing runtime defects discovered in
32
+ post-release source audit. No new features, no breaking changes.
33
+
34
+ ### Fixed
35
+
36
+ - **Rich page fingerprint `interactive_count`** (loop.py): Was iterating
37
+ dict keys instead of `.values()`, calling `.get()` on string keys.
38
+ The `except` block silently returned `interactive_count=0` every time,
39
+ weakening page change detection. Now correctly counts interactive
40
+ nodes via `is_interactive` attribute.
41
+
42
+ - **iframe action scoping** (controller.py + facade.py): `enter_frame()`
43
+ pushed a frame locator but no interaction method used it — all actions
44
+ targeted the top-level page instead of the iframe. New
45
+ `FrameInteractionTarget` adapter normalizes Playwright's
46
+ `FrameLocator` API (`.locator(sel).click()`) to match the controller's
47
+ selector-tier signatures (`.click(sel)`).
48
+
49
+ - **IPReputationClient async path** (ip_reputation.py): Replaced
50
+ deprecated `asyncio.get_event_loop()` with `asyncio.get_running_loop()`
51
+ to fix DeprecationWarning on every call and future RuntimeError risk.
52
+
53
+ ### Internal
54
+
55
+ - **Stress signal accuracy** (#167): RSS measurement prefers `psutil`
56
+ with platform-aware fallback; periodic `RSSSampler`; hard sleeps
57
+ replaced with `_wait_for_condition()` polling; `parallel_profiles`
58
+ verifies cross-context isolation; `/api/upload` returns real digest.
9
59
 
10
60
  ## [2.2.0] — 2026-06-16
11
61
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: superbrowser-sdk
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Anti-detection agent browser SDK — stealth, budget governance, security guardrails, and structured error recovery behind one async facade
5
5
  Project-URL: Homepage, https://github.com/Octo-Lex/Super-Browser
6
6
  Project-URL: Documentation, https://github.com/Octo-Lex/Super-Browser#readme
@@ -19,7 +19,6 @@ Classifier: Operating System :: OS Independent
19
19
  Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
- Classifier: Programming Language :: Python :: 3.13
23
22
  Classifier: Programming Language :: Python :: Implementation :: CPython
24
23
  Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
25
24
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -31,6 +30,7 @@ Requires-Dist: aiohttp>=3.9; extra == 'all'
31
30
  Requires-Dist: anthropic>=0.40; extra == 'all'
32
31
  Requires-Dist: cryptography>=42.0; extra == 'all'
33
32
  Requires-Dist: httpx>=0.27; extra == 'all'
33
+ Requires-Dist: mcp>=1.0; extra == 'all'
34
34
  Requires-Dist: openai>=1.0; extra == 'all'
35
35
  Requires-Dist: patchright>=1.0; extra == 'all'
36
36
  Requires-Dist: pillow>=10.0; extra == 'all'
@@ -57,6 +57,8 @@ Requires-Dist: pytest-cov>=7.0; extra == 'dev'
57
57
  Requires-Dist: pytest>=9.0; extra == 'dev'
58
58
  Requires-Dist: ruff>=0.4; extra == 'dev'
59
59
  Requires-Dist: twine>=5.0; extra == 'dev'
60
+ Provides-Extra: mcp
61
+ Requires-Dist: mcp>=1.0; extra == 'mcp'
60
62
  Provides-Extra: openai
61
63
  Requires-Dist: openai>=1.0; extra == 'openai'
62
64
  Provides-Extra: patchright
@@ -78,7 +80,9 @@ Description-Content-Type: text/markdown
78
80
  [![PyPI](https://img.shields.io/pypi/v/superbrowser-sdk?color=blue)](https://pypi.org/project/superbrowser-sdk/)
79
81
  [![License](https://img.shields.io/badge/license-Apache--2.0-green)](https://github.com/Octo-Lex/Super-Browser/blob/main/LICENSE)
80
82
 
81
- **Super Browser** is an anti-detection agent browser SDK. It wraps browser automation (Patchright, Playwright, Selenium, or raw CDP) in an agent-first API with stealth, budget governance, security guardrails, and structured error recovery. MCP is a transport, the agent SDK is the user-facing layer, and stealth is the foundation.
83
+ **Super Browser** is an agent-first, security-gated, anti-detection browser SDK built on top of existing automation engines. It wraps Patchright, Playwright, Selenium, or raw CDP behind one async facade with stealth defaults, multi-backend support, structured errors, budget governance, an MCP server with permissioned write tools, and an adversarial detection test suite that measures stealth honestly.
84
+
85
+ > **Stealth evidence:** The adversarial suite shows Super-Browser at **16/25 clean** vs raw Playwright's **14/25** on controlled server + scanner targets, with `navigator.webdriver` and Sannysoft resolved and **0 regressions**. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md) for the full comparison table and known limitations.
82
86
 
83
87
  ## Installation
84
88
 
@@ -105,6 +109,14 @@ pip install superbrowser-sdk[selenium] # Enterprise CI
105
109
  pip install superbrowser-sdk[all]
106
110
  ```
107
111
 
112
+ For the MCP server (stdio, for Claude Desktop / Cursor integration):
113
+
114
+ ```bash
115
+ pip install superbrowser-sdk[mcp,patchright]
116
+ ```
117
+
118
+ See [`docs/mcp.md`](docs/mcp.md) for the 13-tool surface and client configuration.
119
+
108
120
  For specific LLM providers:
109
121
 
110
122
  ```bash
@@ -129,7 +141,7 @@ async def main():
129
141
  })
130
142
 
131
143
  # 3. Create the facade and run
132
- async with SuperBrowser(llm_client=llm) as sb:
144
+ async with SuperBrowser(config=cfg, llm_client=llm) as sb:
133
145
  page = await sb.navigate("https://example.com")
134
146
  heading = await sb.extract("the page heading", selector="h1")
135
147
  print(f"Heading: {heading.data.extracted}")
@@ -250,27 +262,29 @@ Additional subsystems:
250
262
  |-----------|---------|
251
263
  | **Self-Healing Selectors** | Automatically recovers from broken CSS/XPath selectors using fuzzy matching |
252
264
  | **Stealth Mode** | Anti-detection patches (navigator properties, WebDriver flags, viewport fingerprint) |
253
- | **Output Budget** | Caps token usage per action to prevent runaway LLM costs |
254
- | **Security Guardrails** | URL allow/deny lists, domain validation, sensitive-input redaction |
265
+ | **Adversarial Detection Suite** | 25-vector test harness that measures stealth honestly against controlled server + real scanners. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md). |
266
+ | **Output Budget** | Caps token usage per action to prevent runaway LLM costs (daily, per-action, per-turn scopes) |
267
+ | **Security Guardrails** | URL allow/deny lists, domain validation, sensitive-input redaction, structured refusals before side effects |
268
+ | **MCP Server** | 13-tool stdio server (6 read-only + 7 write tools behind `MCPSessionPolicy` + `SecurityManager`). See [`docs/mcp.md`](docs/mcp.md). |
255
269
  | **Structured Results** | Every action returns a typed `ActionResult` with timing, method used, and error category |
270
+ | **Behavioral Synthesis** | Bézier mouse paths, seeded human-like keystroke timing, inertial scroll from a deterministic seed |
256
271
  | **Vision** | Screenshot-based fallback for pages that resist DOM inspection |
257
272
 
258
273
  Full API documentation lives in [`docs/`](docs/).
259
274
 
260
275
  ## What's New (Unreleased)
261
276
 
262
- ### Agent Streaming, Default Tooling, and Security Perimeter
263
-
264
- Nine waves of production-control improvements merged to `main`:
277
+ ### MCP Server, Adversarial Suite, Stealth Evidence
265
278
 
279
+ - **MCP Server** — Permissioned stdio server with 13 tools (6 read-only + 7 write). Write tools route through `MCPSessionPolicy` → `SecurityManager` → audit before reaching the browser. Default is read-only advertisement; writes opt-in via `build_server(policy=MCPSessionPolicy(allow_writes=True))`. See [`docs/mcp.md`](docs/mcp.md).
280
+ - **Adversarial Detection Suite** — 25-vector assessment harness across 6 tiers (fingerprint, automation, ejecta, behavioral, network, controlled) plus external scanners. Honest stub semantics (`JSUnsupportedError` → INCONCLUSIVE, never fabricated). See [`tests/adversarial_v3/`](tests/adversarial_v3/).
281
+ - **Stealth Evidence** — Published comparison: Super-Browser **16/25 clean** vs raw Playwright **14/25** on controlled server + scanner targets. `navigator.webdriver` and Sannysoft resolved; 0 regressions. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md).
282
+ - **Behavioral Telemetry** — Mouse/keystroke/scroll analysis vectors replace permanent SKIPPED with real telemetry-driven verdicts when `--record-behavior` is enabled.
266
283
  - **Streaming API** — `act_stream()` yields `StreamEvent` for real-time agent progress. Provider token streaming for OpenAI and Anthropic.
267
284
  - **Default Tooling** — 10 built-in tools auto-registered on startup (7 controller + 3 facade). Agents work out-of-box.
268
- - **Prompt Isolation** — Tool API removed from `<untrusted-screen-content>` wrappers.
269
285
  - **Security Perimeter** — All 12 side-effecting facade methods enforce `SecurityManager` before reaching the browser.
270
286
  - **Controller Rebinding** — Tools late-bind to current controller after tab switches.
271
287
 
272
- See the [Security Guardrails](#security-guardrails), [Streaming](#streaming), and [Default Agent Tooling](#default-agent-tooling) sections above.
273
-
274
288
  ## What's New in v1.9
275
289
 
276
290
  ### Platform Abstraction + Distribution — One API, Any Browser
@@ -4,7 +4,9 @@
4
4
  [![PyPI](https://img.shields.io/pypi/v/superbrowser-sdk?color=blue)](https://pypi.org/project/superbrowser-sdk/)
5
5
  [![License](https://img.shields.io/badge/license-Apache--2.0-green)](https://github.com/Octo-Lex/Super-Browser/blob/main/LICENSE)
6
6
 
7
- **Super Browser** is an anti-detection agent browser SDK. It wraps browser automation (Patchright, Playwright, Selenium, or raw CDP) in an agent-first API with stealth, budget governance, security guardrails, and structured error recovery. MCP is a transport, the agent SDK is the user-facing layer, and stealth is the foundation.
7
+ **Super Browser** is an agent-first, security-gated, anti-detection browser SDK built on top of existing automation engines. It wraps Patchright, Playwright, Selenium, or raw CDP behind one async facade with stealth defaults, multi-backend support, structured errors, budget governance, an MCP server with permissioned write tools, and an adversarial detection test suite that measures stealth honestly.
8
+
9
+ > **Stealth evidence:** The adversarial suite shows Super-Browser at **16/25 clean** vs raw Playwright's **14/25** on controlled server + scanner targets, with `navigator.webdriver` and Sannysoft resolved and **0 regressions**. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md) for the full comparison table and known limitations.
8
10
 
9
11
  ## Installation
10
12
 
@@ -31,6 +33,14 @@ pip install superbrowser-sdk[selenium] # Enterprise CI
31
33
  pip install superbrowser-sdk[all]
32
34
  ```
33
35
 
36
+ For the MCP server (stdio, for Claude Desktop / Cursor integration):
37
+
38
+ ```bash
39
+ pip install superbrowser-sdk[mcp,patchright]
40
+ ```
41
+
42
+ See [`docs/mcp.md`](docs/mcp.md) for the 13-tool surface and client configuration.
43
+
34
44
  For specific LLM providers:
35
45
 
36
46
  ```bash
@@ -55,7 +65,7 @@ async def main():
55
65
  })
56
66
 
57
67
  # 3. Create the facade and run
58
- async with SuperBrowser(llm_client=llm) as sb:
68
+ async with SuperBrowser(config=cfg, llm_client=llm) as sb:
59
69
  page = await sb.navigate("https://example.com")
60
70
  heading = await sb.extract("the page heading", selector="h1")
61
71
  print(f"Heading: {heading.data.extracted}")
@@ -176,27 +186,29 @@ Additional subsystems:
176
186
  |-----------|---------|
177
187
  | **Self-Healing Selectors** | Automatically recovers from broken CSS/XPath selectors using fuzzy matching |
178
188
  | **Stealth Mode** | Anti-detection patches (navigator properties, WebDriver flags, viewport fingerprint) |
179
- | **Output Budget** | Caps token usage per action to prevent runaway LLM costs |
180
- | **Security Guardrails** | URL allow/deny lists, domain validation, sensitive-input redaction |
189
+ | **Adversarial Detection Suite** | 25-vector test harness that measures stealth honestly against controlled server + real scanners. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md). |
190
+ | **Output Budget** | Caps token usage per action to prevent runaway LLM costs (daily, per-action, per-turn scopes) |
191
+ | **Security Guardrails** | URL allow/deny lists, domain validation, sensitive-input redaction, structured refusals before side effects |
192
+ | **MCP Server** | 13-tool stdio server (6 read-only + 7 write tools behind `MCPSessionPolicy` + `SecurityManager`). See [`docs/mcp.md`](docs/mcp.md). |
181
193
  | **Structured Results** | Every action returns a typed `ActionResult` with timing, method used, and error category |
194
+ | **Behavioral Synthesis** | Bézier mouse paths, seeded human-like keystroke timing, inertial scroll from a deterministic seed |
182
195
  | **Vision** | Screenshot-based fallback for pages that resist DOM inspection |
183
196
 
184
197
  Full API documentation lives in [`docs/`](docs/).
185
198
 
186
199
  ## What's New (Unreleased)
187
200
 
188
- ### Agent Streaming, Default Tooling, and Security Perimeter
189
-
190
- Nine waves of production-control improvements merged to `main`:
201
+ ### MCP Server, Adversarial Suite, Stealth Evidence
191
202
 
203
+ - **MCP Server** — Permissioned stdio server with 13 tools (6 read-only + 7 write). Write tools route through `MCPSessionPolicy` → `SecurityManager` → audit before reaching the browser. Default is read-only advertisement; writes opt-in via `build_server(policy=MCPSessionPolicy(allow_writes=True))`. See [`docs/mcp.md`](docs/mcp.md).
204
+ - **Adversarial Detection Suite** — 25-vector assessment harness across 6 tiers (fingerprint, automation, ejecta, behavioral, network, controlled) plus external scanners. Honest stub semantics (`JSUnsupportedError` → INCONCLUSIVE, never fabricated). See [`tests/adversarial_v3/`](tests/adversarial_v3/).
205
+ - **Stealth Evidence** — Published comparison: Super-Browser **16/25 clean** vs raw Playwright **14/25** on controlled server + scanner targets. `navigator.webdriver` and Sannysoft resolved; 0 regressions. See [`docs/stealth-evidence.md`](docs/stealth-evidence.md).
206
+ - **Behavioral Telemetry** — Mouse/keystroke/scroll analysis vectors replace permanent SKIPPED with real telemetry-driven verdicts when `--record-behavior` is enabled.
192
207
  - **Streaming API** — `act_stream()` yields `StreamEvent` for real-time agent progress. Provider token streaming for OpenAI and Anthropic.
193
208
  - **Default Tooling** — 10 built-in tools auto-registered on startup (7 controller + 3 facade). Agents work out-of-box.
194
- - **Prompt Isolation** — Tool API removed from `<untrusted-screen-content>` wrappers.
195
209
  - **Security Perimeter** — All 12 side-effecting facade methods enforce `SecurityManager` before reaching the browser.
196
210
  - **Controller Rebinding** — Tools late-bind to current controller after tab switches.
197
211
 
198
- See the [Security Guardrails](#security-guardrails), [Streaming](#streaming), and [Default Agent Tooling](#default-agent-tooling) sections above.
199
-
200
212
  ## What's New in v1.9
201
213
 
202
214
  ### Platform Abstraction + Distribution — One API, Any Browser