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.
- {tokenade-6.3.0 → tokenade-6.4.0}/PKG-INFO +27 -11
- {tokenade-6.3.0 → tokenade-6.4.0}/README.md +25 -10
- {tokenade-6.3.0 → tokenade-6.4.0}/pyproject.toml +2 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/__init__.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/__init__.py +8 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/handlers/infrastructure.py +0 -4
- tokenade-6.4.0/tokenade/cli/handlers/misc.py +216 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/management.py +27 -448
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/proxy.py +17 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/session.py +61 -9
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/cdp_connection.py +0 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/dashboard.py +1 -3
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/dependencies.py +2 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/fingerprint.py +2 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/patcher.py +2 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/profile_cloner.py +3 -3
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/session_state.py +47 -18
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/launcher.py +4 -4
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/manager.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth_test.py +1 -1
- tokenade-6.4.0/tokenade/core/browser/storage_extractor.py +231 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/synchronizer.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/xvfb.py +2 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/cicd/workflow_generator.py +3 -3
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/at_rest.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/daemon/session_daemon.py +3 -3
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/mobile_import.py +1 -1
- tokenade-6.4.0/tokenade/core/importer/plugin_export.py +257 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_packager.py +36 -11
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/container_orchestrator.py +2 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_browser.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_loader.py +17 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_testing.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_verifier.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/rating_sync.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/logging/structured.py +3 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/residential.py +2 -2
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/oauth_refresh.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/session_validator.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/runtime/engine.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/runtime/tls_matcher.py +1 -1
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/__init__.py +26 -4
- tokenade-6.4.0/tokenade/plugin/api.py +139 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/base.py +162 -14
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/oauth2/plugin.py +1 -1
- tokenade-6.4.0/tokenade/tests/test_phase80.py +266 -0
- tokenade-6.4.0/tokenade/tests/test_plugin_api.py +347 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_packager.py +3 -3
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_packager_coverage.py +11 -10
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/PKG-INFO +27 -11
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/SOURCES.txt +5 -7
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/requires.txt +1 -0
- tokenade-6.3.0/tokenade/cli/handlers/misc.py +0 -69
- tokenade-6.3.0/tokenade/tests/test_cdp_injection_coverage2.py +0 -317
- tokenade-6.3.0/tokenade/tests/test_cdp_injection_coverage3.py +0 -170
- tokenade-6.3.0/tokenade/tests/test_cdp_proxy_coverage3.py +0 -702
- tokenade-6.3.0/tokenade/tests/test_cdp_proxy_start_errors.py +0 -57
- tokenade-6.3.0/tokenade/tests/test_extension_bridge_coverage2.py +0 -251
- tokenade-6.3.0/tokenade/tests/test_server_gui_coverage.py +0 -87
- tokenade-6.3.0/tokenade/tests/test_server_utils_coverage2.py +0 -197
- {tokenade-6.3.0 → tokenade-6.4.0}/setup.cfg +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/__main__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/__main__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/advanced.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/completions.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/config.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/handlers/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/handlers/ci.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/output.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/cli/security.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/antidetection/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/antidetection/behavioral.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/antidetection/cdp_cleaner.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/api/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/api/server.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/batch/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/batch/operations.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/battle.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/captcha.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/cloak.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/cloudflare.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/profiles.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/backend.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth/cloak.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/stealth.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/tls_fingerprint.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/browser/undetectable.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/cicd/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/cicd/runner.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/config.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/cookie_crypto.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/crypto/encryptor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/daemon/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/errors.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/extractor/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/audio.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/base.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/battery.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/canvas.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/fonts.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/navigator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/plugins.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/screen.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/webgl.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/collectors/webrtc.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/injector.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/fingerprint/stealth.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/forensics/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/forensics/autopsy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/adb_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/advanced_validator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/browser_discovery.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/chromium_forks.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/competitor_import.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/cookie_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/db_utils.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/format_exporter.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/format_importer.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/local_storage_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/mobile_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/safari_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_comparator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_loader.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_refresher.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_rotation.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_rotator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_sharer.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_sync.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/session_vault.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/site_configs.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/tor_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/importer/validator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/injector/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/injector/profile_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/docker_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/fleet.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/kubernetes.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_registry.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/plugin_search.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/integration/webhooks.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/logging/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/monitoring/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/monitoring/analytics.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/monitoring/session_monitor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_api.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_gui.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_injection.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_routing.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/cdp_stealth.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/extension_bridge.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/forward_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/multi_site_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/rotation.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server_gui.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server_routing.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/proxy/server_utils.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/batch_refresh.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/encrypted_refresh.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/health_checker.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/health_reporter.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/refresh/health_scorer.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/runtime/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/security/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/security/audit.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/security/credentials.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/storage/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/storage/session_versions.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/utils/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/core/utils/performance.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/base.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/generic_oauth.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/github.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/handlers/google.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/plugin/oauth2/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/sdk/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/portability.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_accounts.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_advanced_validator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_advanced_validator_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_analytics.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_antidetection.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_monitor_endpoints.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_monitoring.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_sdk.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_server_comprehensive.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_api_server_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_at_rest_encryption.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_audit_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_autopsy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_base_handler_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_batch_operations.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_batch_operations_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_batch_refresh.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_battle.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_benchmarks.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_binary_patcher.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_discovery.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_discovery_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_improvements.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_manager_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_browser_support.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_gui_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_injection_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_injection_coverage4.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_proxy_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_routing_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cdp_stealth_coverage2.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_chromium_forks_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_ci_runner.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cicd.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_advanced.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_helpers.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_init_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_integration.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_main_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_management.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_management_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_monitor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_output.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_refactor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_security_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_security_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cli_session.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cloak.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cloudflare_akamai.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_collectors.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_comprehensive.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_config_and_cdp_modules.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_container_orchestration.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cookie_crypto.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_cookie_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_coverage_boost.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_credentials_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_crypto.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_custom_errors.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_daemon.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_db_utils.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_db_utils_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_docker_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encrypted_refresh.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encryptor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encryptor_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_encryptor_edge.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_engine_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_enterprise.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_extension_bridge_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_collectors.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_collectors_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_consistency.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_injector.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fingerprint_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_fleet.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_format_export.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_forward_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_forward_proxy_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_generic_oauth_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_github_handler_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_google_handler_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_handlers.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_health_checker_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_health_reporter.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_health_scorer.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_importer_integration.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_integration.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_kubernetes.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage_extractor.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage_extractor_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_local_storage_extractor_coverage2.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_mac_crypto.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_mobile_extractor_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_mobile_import.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_monitoring.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_multi_site_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_multi_site_proxy_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_new_plugins.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_oauth_refresh.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_performance.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_performance_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_playwright_e2e.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_loader.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_loader_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_marketplace.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_registry.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_system.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_plugin_types.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_cloner.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_management.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_manager_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_profile_manager_coverage2.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_property_based.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_config.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_gui.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_modules.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_proxy_rotation.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_rating_sync.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_refresh_browser.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_runtime.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_safari_extractor_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_sdk_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_security.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_server_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_server_routing_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_server_utils_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_comparator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_loader.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_loader_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_manager.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_monitor_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_monitor_enhanced.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_refresher.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_rotation.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_rotator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sharer.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sharer_coverage2.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sync.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_sync_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_validator.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_vault.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_session_versions.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_share_improvements.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_site_configs_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_site_filter.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_site_handlers.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_ssrf.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_stealth.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_stealth_enhanced.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_stealth_validation.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_structured_logging.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_sync_import.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tls.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tls_matcher.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tls_matcher_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tor_extractor_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_tui.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_undetectable.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_validator_coverage.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_webhooks.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tests/test_xvfb.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tui/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/tui/app.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade/utils/__init__.py +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/dependency_links.txt +0 -0
- {tokenade-6.3.0 → tokenade-6.4.0}/tokenade.egg-info/entry_points.txt +0 -0
- {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
|
+
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.
|
|
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
|
-
**
|
|
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
|
|
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
|
|
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/ #
|
|
824
|
+
└── tests/ # 5165+ tests
|
|
809
825
|
```
|
|
810
826
|
|
|
811
827
|
## Security
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Tokenade v6.
|
|
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
|
-
**
|
|
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
|
|
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
|
|
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/ #
|
|
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.
|
|
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",
|
|
@@ -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)")
|
|
@@ -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}")
|