tokenade 6.3.0__tar.gz → 6.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. {tokenade-6.3.0 → tokenade-6.4.0}/PKG-INFO +27 -11
  2. {tokenade-6.3.0 → tokenade-6.4.0}/README.md +25 -10
  3. {tokenade-6.3.0 → tokenade-6.4.0}/pyproject.toml +2 -1
  4. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/__init__.py +1 -1
  5. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/__init__.py +8 -0
  6. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/handlers/infrastructure.py +0 -4
  7. tokenade-6.4.0/tokenade/cli/handlers/misc.py +216 -0
  8. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/management.py +27 -448
  9. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/proxy.py +17 -0
  10. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/session.py +61 -9
  11. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/cdp_connection.py +0 -2
  12. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/dashboard.py +1 -3
  13. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/dependencies.py +2 -2
  14. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/fingerprint.py +2 -2
  15. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/patcher.py +2 -2
  16. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/profile_cloner.py +3 -3
  17. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/session_state.py +47 -18
  18. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/launcher.py +4 -4
  19. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/manager.py +1 -1
  20. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth_test.py +1 -1
  21. tokenade-6.4.0/tokenade/core/browser/storage_extractor.py +231 -0
  22. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/synchronizer.py +1 -1
  23. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/xvfb.py +2 -2
  24. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/cicd/workflow_generator.py +3 -3
  25. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/at_rest.py +1 -1
  26. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/daemon/session_daemon.py +3 -3
  27. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/mobile_import.py +1 -1
  28. tokenade-6.4.0/tokenade/core/importer/plugin_export.py +257 -0
  29. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_packager.py +36 -11
  30. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/container_orchestrator.py +2 -2
  31. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_browser.py +1 -1
  32. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_loader.py +17 -0
  33. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_testing.py +1 -1
  34. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_verifier.py +1 -1
  35. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/rating_sync.py +1 -1
  36. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/logging/structured.py +3 -2
  37. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/residential.py +2 -2
  38. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/oauth_refresh.py +1 -1
  39. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/session_validator.py +1 -1
  40. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/runtime/engine.py +1 -1
  41. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/runtime/tls_matcher.py +1 -1
  42. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/__init__.py +26 -4
  43. tokenade-6.4.0/tokenade/plugin/api.py +139 -0
  44. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/base.py +162 -14
  45. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/oauth2/plugin.py +1 -1
  46. tokenade-6.4.0/tokenade/tests/test_phase80.py +266 -0
  47. tokenade-6.4.0/tokenade/tests/test_plugin_api.py +347 -0
  48. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_packager.py +3 -3
  49. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_packager_coverage.py +11 -10
  50. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/PKG-INFO +27 -11
  51. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/SOURCES.txt +5 -7
  52. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/requires.txt +1 -0
  53. tokenade-6.3.0/tokenade/cli/handlers/misc.py +0 -69
  54. tokenade-6.3.0/tokenade/tests/test_cdp_injection_coverage2.py +0 -317
  55. tokenade-6.3.0/tokenade/tests/test_cdp_injection_coverage3.py +0 -170
  56. tokenade-6.3.0/tokenade/tests/test_cdp_proxy_coverage3.py +0 -702
  57. tokenade-6.3.0/tokenade/tests/test_cdp_proxy_start_errors.py +0 -57
  58. tokenade-6.3.0/tokenade/tests/test_extension_bridge_coverage2.py +0 -251
  59. tokenade-6.3.0/tokenade/tests/test_server_gui_coverage.py +0 -87
  60. tokenade-6.3.0/tokenade/tests/test_server_utils_coverage2.py +0 -197
  61. {tokenade-6.3.0 → tokenade-6.4.0}/setup.cfg +0 -0
  62. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/__main__.py +0 -0
  63. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/__main__.py +0 -0
  64. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/advanced.py +0 -0
  65. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/completions.py +0 -0
  66. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/config.py +0 -0
  67. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/handlers/__init__.py +0 -0
  68. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/handlers/ci.py +0 -0
  69. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/output.py +0 -0
  70. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/security.py +0 -0
  71. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/__init__.py +0 -0
  72. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/antidetection/__init__.py +0 -0
  73. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/antidetection/behavioral.py +0 -0
  74. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/antidetection/cdp_cleaner.py +0 -0
  75. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/api/__init__.py +0 -0
  76. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/api/server.py +0 -0
  77. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/batch/__init__.py +0 -0
  78. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/batch/operations.py +0 -0
  79. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/__init__.py +0 -0
  80. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/battle.py +0 -0
  81. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/captcha.py +0 -0
  82. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/cloak.py +0 -0
  83. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/cloudflare.py +0 -0
  84. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/manager.py +0 -0
  85. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/profiles.py +0 -0
  86. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/__init__.py +0 -0
  87. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/backend.py +0 -0
  88. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/cloak.py +0 -0
  89. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth.py +0 -0
  90. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/tls_fingerprint.py +0 -0
  91. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/undetectable.py +0 -0
  92. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/cicd/__init__.py +0 -0
  93. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/cicd/runner.py +0 -0
  94. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/config.py +0 -0
  95. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/__init__.py +0 -0
  96. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/cookie_crypto.py +0 -0
  97. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/encryptor.py +0 -0
  98. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/daemon/__init__.py +0 -0
  99. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/errors.py +0 -0
  100. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/extractor/__init__.py +0 -0
  101. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/__init__.py +0 -0
  102. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/__init__.py +0 -0
  103. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/audio.py +0 -0
  104. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/base.py +0 -0
  105. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/battery.py +0 -0
  106. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/canvas.py +0 -0
  107. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/fonts.py +0 -0
  108. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/navigator.py +0 -0
  109. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/plugins.py +0 -0
  110. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/screen.py +0 -0
  111. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/webgl.py +0 -0
  112. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/webrtc.py +0 -0
  113. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/injector.py +0 -0
  114. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/manager.py +0 -0
  115. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/stealth.py +0 -0
  116. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/forensics/__init__.py +0 -0
  117. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/forensics/autopsy.py +0 -0
  118. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/__init__.py +0 -0
  119. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/adb_extractor.py +0 -0
  120. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/advanced_validator.py +0 -0
  121. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/browser_discovery.py +0 -0
  122. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/chromium_forks.py +0 -0
  123. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/competitor_import.py +0 -0
  124. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/cookie_extractor.py +0 -0
  125. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/db_utils.py +0 -0
  126. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/format_exporter.py +0 -0
  127. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/format_importer.py +0 -0
  128. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/local_storage_extractor.py +0 -0
  129. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/mobile_extractor.py +0 -0
  130. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/safari_extractor.py +0 -0
  131. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_comparator.py +0 -0
  132. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_loader.py +0 -0
  133. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_manager.py +0 -0
  134. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_refresher.py +0 -0
  135. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_rotation.py +0 -0
  136. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_rotator.py +0 -0
  137. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_sharer.py +0 -0
  138. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_sync.py +0 -0
  139. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_vault.py +0 -0
  140. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/site_configs.py +0 -0
  141. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/tor_extractor.py +0 -0
  142. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/validator.py +0 -0
  143. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/injector/__init__.py +0 -0
  144. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/injector/profile_manager.py +0 -0
  145. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/__init__.py +0 -0
  146. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/docker_manager.py +0 -0
  147. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/fleet.py +0 -0
  148. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/kubernetes.py +0 -0
  149. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_registry.py +0 -0
  150. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_search.py +0 -0
  151. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/webhooks.py +0 -0
  152. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/logging/__init__.py +0 -0
  153. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/monitoring/__init__.py +0 -0
  154. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/monitoring/analytics.py +0 -0
  155. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/monitoring/session_monitor.py +0 -0
  156. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/__init__.py +0 -0
  157. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_api.py +0 -0
  158. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_gui.py +0 -0
  159. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_injection.py +0 -0
  160. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_proxy.py +0 -0
  161. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_routing.py +0 -0
  162. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_stealth.py +0 -0
  163. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/extension_bridge.py +0 -0
  164. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/forward_proxy.py +0 -0
  165. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/multi_site_proxy.py +0 -0
  166. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/rotation.py +0 -0
  167. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server.py +0 -0
  168. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server_gui.py +0 -0
  169. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server_routing.py +0 -0
  170. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server_utils.py +0 -0
  171. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/__init__.py +0 -0
  172. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/batch_refresh.py +0 -0
  173. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/encrypted_refresh.py +0 -0
  174. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/health_checker.py +0 -0
  175. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/health_reporter.py +0 -0
  176. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/health_scorer.py +0 -0
  177. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/runtime/__init__.py +0 -0
  178. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/security/__init__.py +0 -0
  179. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/security/audit.py +0 -0
  180. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/security/credentials.py +0 -0
  181. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/storage/__init__.py +0 -0
  182. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/storage/session_versions.py +0 -0
  183. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/utils/__init__.py +0 -0
  184. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/utils/performance.py +0 -0
  185. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/__init__.py +0 -0
  186. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/base.py +0 -0
  187. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/generic_oauth.py +0 -0
  188. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/github.py +0 -0
  189. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/google.py +0 -0
  190. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/oauth2/__init__.py +0 -0
  191. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/sdk/__init__.py +0 -0
  192. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/__init__.py +0 -0
  193. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/portability.py +0 -0
  194. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_accounts.py +0 -0
  195. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_advanced_validator.py +0 -0
  196. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_advanced_validator_coverage.py +0 -0
  197. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_analytics.py +0 -0
  198. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_antidetection.py +0 -0
  199. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_monitor_endpoints.py +0 -0
  200. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_monitoring.py +0 -0
  201. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_sdk.py +0 -0
  202. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_server_comprehensive.py +0 -0
  203. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_server_coverage.py +0 -0
  204. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_at_rest_encryption.py +0 -0
  205. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_audit_coverage.py +0 -0
  206. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_autopsy.py +0 -0
  207. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_base_handler_coverage.py +0 -0
  208. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_batch_operations.py +0 -0
  209. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_batch_operations_coverage.py +0 -0
  210. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_batch_refresh.py +0 -0
  211. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_battle.py +0 -0
  212. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_benchmarks.py +0 -0
  213. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_binary_patcher.py +0 -0
  214. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser.py +0 -0
  215. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_discovery.py +0 -0
  216. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_discovery_coverage.py +0 -0
  217. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_improvements.py +0 -0
  218. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_manager_coverage.py +0 -0
  219. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_support.py +0 -0
  220. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_gui_coverage.py +0 -0
  221. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_injection_coverage.py +0 -0
  222. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_injection_coverage4.py +0 -0
  223. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_proxy_coverage.py +0 -0
  224. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_routing_coverage.py +0 -0
  225. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_stealth_coverage2.py +0 -0
  226. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_chromium_forks_coverage.py +0 -0
  227. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_ci_runner.py +0 -0
  228. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cicd.py +0 -0
  229. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli.py +0 -0
  230. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_advanced.py +0 -0
  231. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_helpers.py +0 -0
  232. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_init_coverage.py +0 -0
  233. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_integration.py +0 -0
  234. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_main_coverage.py +0 -0
  235. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_management.py +0 -0
  236. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_management_coverage.py +0 -0
  237. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_monitor.py +0 -0
  238. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_output.py +0 -0
  239. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_proxy.py +0 -0
  240. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_refactor.py +0 -0
  241. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_security_coverage.py +0 -0
  242. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_security_proxy.py +0 -0
  243. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_session.py +0 -0
  244. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cloak.py +0 -0
  245. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cloudflare_akamai.py +0 -0
  246. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_collectors.py +0 -0
  247. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_comprehensive.py +0 -0
  248. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_config_and_cdp_modules.py +0 -0
  249. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_container_orchestration.py +0 -0
  250. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cookie_crypto.py +0 -0
  251. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cookie_extractor.py +0 -0
  252. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_coverage_boost.py +0 -0
  253. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_credentials_coverage.py +0 -0
  254. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_crypto.py +0 -0
  255. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_custom_errors.py +0 -0
  256. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_daemon.py +0 -0
  257. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_db_utils.py +0 -0
  258. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_db_utils_coverage.py +0 -0
  259. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_docker_manager.py +0 -0
  260. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encrypted_refresh.py +0 -0
  261. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encryptor.py +0 -0
  262. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encryptor_coverage.py +0 -0
  263. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encryptor_edge.py +0 -0
  264. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_engine_coverage.py +0 -0
  265. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_enterprise.py +0 -0
  266. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_extension_bridge_coverage.py +0 -0
  267. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint.py +0 -0
  268. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_collectors.py +0 -0
  269. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_collectors_coverage.py +0 -0
  270. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_consistency.py +0 -0
  271. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_injector.py +0 -0
  272. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_manager.py +0 -0
  273. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fleet.py +0 -0
  274. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_format_export.py +0 -0
  275. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_forward_proxy.py +0 -0
  276. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_forward_proxy_coverage.py +0 -0
  277. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_generic_oauth_coverage.py +0 -0
  278. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_github_handler_coverage.py +0 -0
  279. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_google_handler_coverage.py +0 -0
  280. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_handlers.py +0 -0
  281. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_health_checker_coverage.py +0 -0
  282. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_health_reporter.py +0 -0
  283. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_health_scorer.py +0 -0
  284. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_importer_integration.py +0 -0
  285. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_integration.py +0 -0
  286. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_kubernetes.py +0 -0
  287. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage.py +0 -0
  288. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage_extractor.py +0 -0
  289. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage_extractor_coverage.py +0 -0
  290. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage_extractor_coverage2.py +0 -0
  291. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_mac_crypto.py +0 -0
  292. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_mobile_extractor_coverage.py +0 -0
  293. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_mobile_import.py +0 -0
  294. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_monitoring.py +0 -0
  295. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_multi_site_proxy.py +0 -0
  296. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_multi_site_proxy_coverage.py +0 -0
  297. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_new_plugins.py +0 -0
  298. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_oauth_refresh.py +0 -0
  299. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_performance.py +0 -0
  300. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_performance_coverage.py +0 -0
  301. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_playwright_e2e.py +0 -0
  302. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_loader.py +0 -0
  303. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_loader_coverage.py +0 -0
  304. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_marketplace.py +0 -0
  305. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_registry.py +0 -0
  306. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_system.py +0 -0
  307. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_types.py +0 -0
  308. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_cloner.py +0 -0
  309. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_management.py +0 -0
  310. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_manager.py +0 -0
  311. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_manager_coverage.py +0 -0
  312. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_manager_coverage2.py +0 -0
  313. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_property_based.py +0 -0
  314. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy.py +0 -0
  315. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_config.py +0 -0
  316. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_gui.py +0 -0
  317. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_modules.py +0 -0
  318. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_rotation.py +0 -0
  319. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_rating_sync.py +0 -0
  320. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_refresh_browser.py +0 -0
  321. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_runtime.py +0 -0
  322. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_safari_extractor_coverage.py +0 -0
  323. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_sdk_coverage.py +0 -0
  324. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_security.py +0 -0
  325. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_server_coverage.py +0 -0
  326. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_server_routing_coverage.py +0 -0
  327. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_server_utils_coverage.py +0 -0
  328. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_comparator.py +0 -0
  329. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_loader.py +0 -0
  330. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_loader_coverage.py +0 -0
  331. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_manager.py +0 -0
  332. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_monitor_coverage.py +0 -0
  333. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_monitor_enhanced.py +0 -0
  334. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_refresher.py +0 -0
  335. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_rotation.py +0 -0
  336. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_rotator.py +0 -0
  337. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sharer.py +0 -0
  338. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sharer_coverage2.py +0 -0
  339. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sync.py +0 -0
  340. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sync_coverage.py +0 -0
  341. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_validator.py +0 -0
  342. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_vault.py +0 -0
  343. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_versions.py +0 -0
  344. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_share_improvements.py +0 -0
  345. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_site_configs_coverage.py +0 -0
  346. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_site_filter.py +0 -0
  347. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_site_handlers.py +0 -0
  348. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_ssrf.py +0 -0
  349. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_stealth.py +0 -0
  350. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_stealth_enhanced.py +0 -0
  351. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_stealth_validation.py +0 -0
  352. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_structured_logging.py +0 -0
  353. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_sync_import.py +0 -0
  354. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tls.py +0 -0
  355. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tls_matcher.py +0 -0
  356. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tls_matcher_coverage.py +0 -0
  357. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tor_extractor_coverage.py +0 -0
  358. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tui.py +0 -0
  359. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_undetectable.py +0 -0
  360. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_validator_coverage.py +0 -0
  361. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_webhooks.py +0 -0
  362. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_xvfb.py +0 -0
  363. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tui/__init__.py +0 -0
  364. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tui/app.py +0 -0
  365. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/utils/__init__.py +0 -0
  366. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/dependency_links.txt +0 -0
  367. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/entry_points.txt +0 -0
  368. {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tokenade
3
- Version: 6.3.0
3
+ Version: 6.4.0
4
4
  Summary: Production-grade token shifting and session portability tool
5
5
  Author: Tokenade Team
6
6
  License: MIT
@@ -49,17 +49,18 @@ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
49
49
  Requires-Dist: pytest-aiohttp>=1.0.0; extra == "dev"
50
50
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
51
51
  Requires-Dist: pytest-timeout>=2.0.0; extra == "dev"
52
+ Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
52
53
  Requires-Dist: hypothesis>=6.0.0; extra == "dev"
53
54
  Requires-Dist: black>=23.0.0; extra == "dev"
54
55
  Requires-Dist: flake8>=6.0.0; extra == "dev"
55
56
  Requires-Dist: mypy>=1.0.0; extra == "dev"
56
57
  Requires-Dist: build>=1.0.0; extra == "dev"
57
58
 
58
- # Tokenade v6.2 — Browser Session Portability Tool
59
+ # Tokenade v6.4 — Browser Session Portability Tool
59
60
 
60
61
  Extract browser sessions from one device, package them into portable `.tokenade` files, and browse as the donor on another device using a **CDP reverse proxy** with TLS fingerprint matching.
61
62
 
62
- **5224+ tests** · **58 CLI commands** · **14 plugins** · **Grade A stealth**
63
+ **5165+ tests** · **50 CLI commands** · **20 plugins** · **Grade A stealth**
63
64
 
64
65
  ## Features
65
66
 
@@ -646,18 +647,33 @@ so servers see the donor's fingerprint, not yours.
646
647
  | **Enterprise Features** | ✅ Audit, RBAC, LDAP | ❌ | ❌ |
647
648
  | **Self-Hosted** | ✅ No third-party | N/A | ✅ |
648
649
 
650
+ ## What's New in v6.4
651
+
652
+ - **Plugin API v1.0** — All 20 plugins inherit from proper base classes (SessionRefreshPlugin, SiteHandlerPlugin, ProxyProviderPlugin, etc.)
653
+ - **API_VERSION checking** — Plugins declare API version, loader validates at load time
654
+ - **PluginResult** — Standard result type for all plugin methods
655
+ - **PluginConfig** — Config with JSON schema validation
656
+ - **Full Ecosystem Transfer** — .tokenade v3.0 format with per-origin localStorage + sessionStorage
657
+ - **CDP StorageExtractor** — Extract localStorage/sessionStorage via Chrome DevTools Protocol
658
+ - **Encryption at Export** — `--encrypt-password` flag encrypts .tokenade files at export time
659
+ - **Plugin-First Export** — Auto-discovers site handler plugins for extraction
660
+ - **ProxyProviderPlugin** — New base class for commercial proxy providers (AnyIP, BrightData, etc.)
661
+ - **NotificationPlugin** — New base class for notification providers (Slack, Discord, Email)
662
+ - **5165+ tests** — Comprehensive test coverage
663
+
664
+ ## What's New in v6.3
665
+
666
+ - **Stealth modules consolidated** — `core/browser/stealth/` package (manager, launcher, cloak, backend)
667
+ - **CLI handlers split** — `cli/handlers/` with infrastructure, CI, misc modules
668
+ - **Test suite optimization** — pytest-xdist parallel execution (150s → 27s)
669
+
649
670
  ## What's New in v6.2
650
671
 
651
- - **CloakBrowser Integration** — Stealth Chromium binary with 58 C++ patches as default backend (Grade A stealth, 96/100)
672
+ - **CloakBrowser Integration** — Stealth Chromium binary with 58 C++ patches as default backend
652
673
  - **Session CI Runner** — `tokenade ci run` reads `tokenade.yml` for automated session validation
653
674
  - **Fleet Management** — `tokenade fleet status|health|refresh|logs` across Docker/k8s containers
654
675
  - **Session Forensics** — `tokenade autopsy -s session.tokenade` — root-cause analysis for dead sessions
655
- - **Interactive TUI** — `tokenade tui` — marketplace browser, session manager, keyboard navigation (j/k/i/u/r)
656
- - **Site Handler Plugins** — Google, GitHub, Discord, Generic handlers for site-specific extraction/injection
657
- - **Global Ratings** — Sync plugin ratings via GitHub Issues API
658
- - **14 Official Plugins** — OAuth2, site handlers, session-health, webhook-notify, etc.
659
- - **58 CLI Commands** — Complete automation toolkit
660
- - **5224+ Tests** — Comprehensive test coverage
676
+ - **Interactive TUI** — `tokenade tui` — marketplace browser, session manager, keyboard navigation
661
677
 
662
678
  ## What's New in v6.0
663
679
 
@@ -805,7 +821,7 @@ tokenade/
805
821
  │ └── base.py # Plugin base classes
806
822
  ├── handlers/ # Site-specific handlers
807
823
  ├── extension/ # Browser extension
808
- └── tests/ # 5224+ tests
824
+ └── tests/ # 5165+ tests
809
825
  ```
810
826
 
811
827
  ## Security
@@ -1,8 +1,8 @@
1
- # Tokenade v6.2 — Browser Session Portability Tool
1
+ # Tokenade v6.4 — Browser Session Portability Tool
2
2
 
3
3
  Extract browser sessions from one device, package them into portable `.tokenade` files, and browse as the donor on another device using a **CDP reverse proxy** with TLS fingerprint matching.
4
4
 
5
- **5224+ tests** · **58 CLI commands** · **14 plugins** · **Grade A stealth**
5
+ **5165+ tests** · **50 CLI commands** · **20 plugins** · **Grade A stealth**
6
6
 
7
7
  ## Features
8
8
 
@@ -589,18 +589,33 @@ so servers see the donor's fingerprint, not yours.
589
589
  | **Enterprise Features** | ✅ Audit, RBAC, LDAP | ❌ | ❌ |
590
590
  | **Self-Hosted** | ✅ No third-party | N/A | ✅ |
591
591
 
592
+ ## What's New in v6.4
593
+
594
+ - **Plugin API v1.0** — All 20 plugins inherit from proper base classes (SessionRefreshPlugin, SiteHandlerPlugin, ProxyProviderPlugin, etc.)
595
+ - **API_VERSION checking** — Plugins declare API version, loader validates at load time
596
+ - **PluginResult** — Standard result type for all plugin methods
597
+ - **PluginConfig** — Config with JSON schema validation
598
+ - **Full Ecosystem Transfer** — .tokenade v3.0 format with per-origin localStorage + sessionStorage
599
+ - **CDP StorageExtractor** — Extract localStorage/sessionStorage via Chrome DevTools Protocol
600
+ - **Encryption at Export** — `--encrypt-password` flag encrypts .tokenade files at export time
601
+ - **Plugin-First Export** — Auto-discovers site handler plugins for extraction
602
+ - **ProxyProviderPlugin** — New base class for commercial proxy providers (AnyIP, BrightData, etc.)
603
+ - **NotificationPlugin** — New base class for notification providers (Slack, Discord, Email)
604
+ - **5165+ tests** — Comprehensive test coverage
605
+
606
+ ## What's New in v6.3
607
+
608
+ - **Stealth modules consolidated** — `core/browser/stealth/` package (manager, launcher, cloak, backend)
609
+ - **CLI handlers split** — `cli/handlers/` with infrastructure, CI, misc modules
610
+ - **Test suite optimization** — pytest-xdist parallel execution (150s → 27s)
611
+
592
612
  ## What's New in v6.2
593
613
 
594
- - **CloakBrowser Integration** — Stealth Chromium binary with 58 C++ patches as default backend (Grade A stealth, 96/100)
614
+ - **CloakBrowser Integration** — Stealth Chromium binary with 58 C++ patches as default backend
595
615
  - **Session CI Runner** — `tokenade ci run` reads `tokenade.yml` for automated session validation
596
616
  - **Fleet Management** — `tokenade fleet status|health|refresh|logs` across Docker/k8s containers
597
617
  - **Session Forensics** — `tokenade autopsy -s session.tokenade` — root-cause analysis for dead sessions
598
- - **Interactive TUI** — `tokenade tui` — marketplace browser, session manager, keyboard navigation (j/k/i/u/r)
599
- - **Site Handler Plugins** — Google, GitHub, Discord, Generic handlers for site-specific extraction/injection
600
- - **Global Ratings** — Sync plugin ratings via GitHub Issues API
601
- - **14 Official Plugins** — OAuth2, site handlers, session-health, webhook-notify, etc.
602
- - **58 CLI Commands** — Complete automation toolkit
603
- - **5224+ Tests** — Comprehensive test coverage
618
+ - **Interactive TUI** — `tokenade tui` — marketplace browser, session manager, keyboard navigation
604
619
 
605
620
  ## What's New in v6.0
606
621
 
@@ -748,7 +763,7 @@ tokenade/
748
763
  │ └── base.py # Plugin base classes
749
764
  ├── handlers/ # Site-specific handlers
750
765
  ├── extension/ # Browser extension
751
- └── tests/ # 5224+ tests
766
+ └── tests/ # 5165+ tests
752
767
  ```
753
768
 
754
769
  ## Security
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tokenade"
7
- version = "6.3.0"
7
+ version = "6.4.0"
8
8
  description = "Production-grade token shifting and session portability tool"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -49,6 +49,7 @@ dev = [
49
49
  "pytest-aiohttp>=1.0.0",
50
50
  "pytest-cov>=4.0.0",
51
51
  "pytest-timeout>=2.0.0",
52
+ "pytest-xdist>=3.0.0",
52
53
  "hypothesis>=6.0.0",
53
54
  "black>=23.0.0",
54
55
  "flake8>=6.0.0",
@@ -18,7 +18,7 @@ Usage:
18
18
  main()
19
19
  """
20
20
 
21
- __version__ = "6.3.0"
21
+ __version__ = "6.4.0"
22
22
  __author__ = "Tokenade Team"
23
23
  __license__ = "MIT"
24
24
 
@@ -1026,6 +1026,12 @@ Commands:
1026
1026
  export_parser.add_argument("--decrypt", action="store_true", help="Decrypt cookies (auto-detected)")
1027
1027
  export_parser.add_argument("--extract-local-storage", action="store_true", help="Also extract localStorage data")
1028
1028
  export_parser.add_argument("--local-storage-origin", help="Origin to extract localStorage from")
1029
+ export_parser.add_argument("--full", action="store_true", help="Extract cookies + localStorage + sessionStorage (v3.0 format)")
1030
+ export_parser.add_argument("--no-storage", action="store_true", help="Extract only cookies (backward compat)")
1031
+ export_parser.add_argument("--encrypt-password", help="Encrypt .tokenade file with this password at export time")
1032
+ export_parser.add_argument("--plugin", help="Force specific site handler plugin (e.g., google-handler)")
1033
+ export_parser.add_argument("--no-plugin", action="store_true", help="Skip plugin, use default extraction")
1034
+ export_parser.add_argument("--list-handlers", action="store_true", help="List available site handler plugins")
1029
1035
 
1030
1036
  # Load
1031
1037
  load_parser = subparsers.add_parser("load", help="Load session file into browser")
@@ -1120,6 +1126,7 @@ Commands:
1120
1126
  proxy_parser.add_argument("--session", "-s", help="Path to .tokenade session file (single mode)")
1121
1127
  proxy_parser.add_argument("--all", action="store_true", help="Serve all sessions (multi-site mode)")
1122
1128
  proxy_parser.add_argument("--sessions-dir", "-d", help="Directory of .tokenade files (for --all)")
1129
+ proxy_parser.add_argument("--decrypt-password", help="Decrypt .tokenade file with this password")
1123
1130
  proxy_parser.add_argument("--mode", choices=["gui", "forward"], default="gui",
1124
1131
  help="Proxy mode: gui (browser GUI) or forward (HTTP_PROXY)")
1125
1132
  proxy_parser.add_argument("--port", "-p", type=int, default=9222, help="Port to listen on (default: 9222)")
@@ -1478,6 +1485,7 @@ Commands:
1478
1485
  launch_parser.add_argument("--geoip", action="store_true", help="Auto-detect timezone/locale from proxy IP (CloakBrowser)")
1479
1486
  launch_parser.add_argument("--no-cloak", action="store_true", help="Force Playwright + JS patches (skip CloakBrowser)")
1480
1487
  launch_parser.add_argument("--profile", help="Persistent profile directory (CloakBrowser)")
1488
+ launch_parser.add_argument("--decrypt-password", help="Decrypt .tokenade file with this password")
1481
1489
 
1482
1490
  # Refresh Browser (cookie-based session refresh)
1483
1491
  refresh_browser_parser = subparsers.add_parser("refresh-browser", help="Refresh session via undetectable browser (no OAuth needed)")
@@ -2,11 +2,7 @@
2
2
  Infrastructure CLI commands — fleet, container, k8s.
3
3
  """
4
4
 
5
- import json
6
5
  import logging
7
- import os
8
- import sys
9
- from pathlib import Path
10
6
 
11
7
  logger = logging.getLogger("tokenade")
12
8
 
@@ -0,0 +1,216 @@
1
+ """
2
+ Misc CLI commands — tui, daemon, analytics, monitor.
3
+ """
4
+
5
+ import json
6
+ import logging
7
+ from pathlib import Path
8
+
9
+ logger = logging.getLogger("tokenade")
10
+
11
+
12
+ def _health_bar(score: float, width: int = 20) -> str:
13
+ """Render a health score bar."""
14
+ filled = int(score / 100 * width)
15
+ bar = "█" * filled + "░" * (width - filled)
16
+ return f"[{bar}] {score:.0f}%"
17
+
18
+
19
+ def cmd_monitor(args):
20
+ """Session monitoring management."""
21
+ from pathlib import Path
22
+
23
+ action = getattr(args, "monitor_command", None) or getattr(args, "monitor_action", None)
24
+
25
+ if action == "start":
26
+ _monitor_start(args)
27
+ elif action == "stop":
28
+ _monitor_stop()
29
+ elif action == "status":
30
+ _monitor_status(args)
31
+ elif action == "history":
32
+ _monitor_history()
33
+ elif action == "predict":
34
+ _monitor_predict(args)
35
+ else:
36
+ print("❌ Specify a monitor subcommand: status, start, stop, history, predict")
37
+
38
+
39
+ def _monitor_start(args):
40
+ """Start background monitoring."""
41
+ import time
42
+ from tokenade.core.monitoring.session_monitor import SessionMonitor, MonitorConfig
43
+
44
+ session = getattr(args, "session", None)
45
+ sessions_dir = getattr(args, "sessions_dir", None)
46
+ interval = getattr(args, "interval", 60)
47
+
48
+ config = MonitorConfig(check_interval=interval)
49
+ monitor = SessionMonitor(config)
50
+
51
+ if session:
52
+ session_id = monitor.register_session_file(session)
53
+ if session_id:
54
+ print(f"✅ Monitoring session: {session_id}")
55
+ else:
56
+ print(f"❌ Failed to register: {session}")
57
+ return
58
+ elif sessions_dir:
59
+ config.sessions_dir = sessions_dir
60
+ monitor = SessionMonitor(config)
61
+ registered = monitor.scan_sessions_dir()
62
+ if registered:
63
+ print(f"✅ Monitoring {len(registered)} sessions")
64
+ else:
65
+ print(f"❌ No sessions found in {sessions_dir}")
66
+ return
67
+ else:
68
+ print("❌ Specify --session or --sessions-dir")
69
+ return
70
+
71
+ monitor.start()
72
+ print("✅ Monitor started (Ctrl+C to stop)")
73
+ try:
74
+ while True:
75
+ time.sleep(interval)
76
+ except KeyboardInterrupt:
77
+ monitor.stop()
78
+ print("\n✅ Monitor stopped")
79
+
80
+
81
+ def _monitor_stop():
82
+ """Stop a running monitor (by PID file)."""
83
+ import os
84
+ import signal
85
+ pid_file = Path("~/.tokenade/monitor.pid").expanduser()
86
+ if not pid_file.exists():
87
+ print("❌ No monitor process found (no PID file)")
88
+ return
89
+
90
+ try:
91
+ pid = int(pid_file.read_text().strip())
92
+ os.kill(pid, signal.SIGTERM)
93
+ print(f"✅ Sent stop signal to monitor (PID: {pid})")
94
+ pid_file.unlink(missing_ok=True)
95
+ except (ProcessLookupError, ValueError) as e:
96
+ print(f"❌ Failed to stop monitor: {e}")
97
+ pid_file.unlink(missing_ok=True)
98
+
99
+
100
+ def _monitor_status(args):
101
+ """Show current monitoring status."""
102
+ from tokenade.core.monitoring.session_monitor import SessionMonitor, MonitorConfig
103
+
104
+ session = getattr(args, "session", None)
105
+ sessions_dir = getattr(args, "sessions_dir", None)
106
+
107
+ print("\n" + "=" * 60)
108
+ print("TOKENADE - Session Monitor Status")
109
+ print("=" * 60)
110
+
111
+ config = MonitorConfig(sessions_dir=sessions_dir)
112
+ monitor = SessionMonitor(config)
113
+
114
+ if session:
115
+ # Register the session if not already monitored
116
+ session_id = monitor.register_session_file(session)
117
+ if session_id:
118
+ status = monitor.get_status(session_id)
119
+ else:
120
+ status = None
121
+ if status:
122
+ site = status.site_name or session_id
123
+ bar = _health_bar(status.health_score)
124
+ print(f"\n📊 {site}")
125
+ print(f" Health: {bar}")
126
+ print(f" Cookies: {status.cookie_count}")
127
+ print(f" Expired: {status.expired_cookies}")
128
+ else:
129
+ print(f"❌ No status for: {session}")
130
+ elif sessions_dir:
131
+ registered = monitor.scan_sessions_dir()
132
+ if not registered:
133
+ print(f"📂 No sessions found in {sessions_dir}")
134
+ else:
135
+ statuses = monitor.get_all_statuses()
136
+ print(f"\n📂 {len(statuses)} sessions in {sessions_dir}\n")
137
+ for s in statuses:
138
+ bar = _health_bar(s.health_score)
139
+ print(f" {s.session_id}: {bar}")
140
+ else:
141
+ statuses = monitor.get_all_statuses()
142
+ if not statuses:
143
+ print("❌ No sessions registered. Use --session or --sessions-dir")
144
+ else:
145
+ print(f"\n📊 {len(statuses)} monitored sessions\n")
146
+ for s in statuses:
147
+ bar = _health_bar(s.health_score)
148
+ print(f" {s.session_id}: {bar}")
149
+
150
+
151
+ def _monitor_history():
152
+ """Show monitor event history."""
153
+ from tokenade.core.monitoring.session_monitor import SessionMonitor
154
+
155
+ monitor = SessionMonitor()
156
+ history = monitor.get_event_history()
157
+ if not history:
158
+ print("No monitor events recorded yet")
159
+ return
160
+ print(f"\n📋 Last {min(10, len(history))} events:\n")
161
+ for event in history[-10:]:
162
+ print(f" {event}")
163
+
164
+
165
+ def _monitor_predict(args):
166
+ """Predict session expiry."""
167
+ from tokenade.core.monitoring.session_monitor import SessionMonitor
168
+
169
+ session = getattr(args, "session", None)
170
+ monitor = SessionMonitor()
171
+
172
+ if session:
173
+ status = monitor.get_status(session)
174
+ if status and status.predicted_expiry:
175
+ print(f"⏰ {session}: predicted expiry in {status.predicted_expiry}")
176
+ else:
177
+ print("insufficient data for prediction")
178
+ else:
179
+ print("insufficient data for prediction")
180
+
181
+
182
+ def cmd_analytics(args):
183
+ """Session usage analytics."""
184
+ from tokenade.core.monitoring.analytics import SessionAnalytics
185
+
186
+ analytics = SessionAnalytics()
187
+
188
+ if args.analytics_command == "report":
189
+ days = getattr(args, "days", 30)
190
+ report = analytics.get_usage_report(days=days)
191
+ print(json.dumps(report, indent=2))
192
+ elif args.analytics_command == "cleanup":
193
+ analytics.cleanup()
194
+ print("✅ Analytics data cleaned up")
195
+ else:
196
+ print("Usage: tokenade analytics {report|cleanup}")
197
+ print("Usage: tokenade analytics {report|cleanup}")
198
+
199
+
200
+ def cmd_daemon(args):
201
+ """Background daemon management."""
202
+ from tokenade.core.daemon.session_daemon import SessionDaemon
203
+
204
+ daemon = SessionDaemon()
205
+
206
+ if args.daemon_action == "start":
207
+ daemon.start()
208
+ print("✅ Daemon started")
209
+ elif args.daemon_action == "stop":
210
+ daemon.stop()
211
+ print("✅ Daemon stopped")
212
+ elif args.daemon_action == "status":
213
+ status = daemon.get_status()
214
+ print(f"Daemon status: {status}")
215
+ else:
216
+ print("Usage: tokenade daemon {start|stop|status}")