wavexis 2.2.5__tar.gz → 2.2.6__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.
- {wavexis-2.2.5 → wavexis-2.2.6}/CHANGELOG.md +9 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/PKG-INFO +1 -1
- {wavexis-2.2.5 → wavexis-2.2.6}/pyproject.toml +1 -1
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/__init__.py +1 -1
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_session.py +52 -6
- {wavexis-2.2.5 → wavexis-2.2.6}/.dockerignore +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.github/workflows/ci.yml +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.github/workflows/docs.yml +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.github/workflows/release.yml +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/.gitignore +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/CODE_OF_CONDUCT.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/CONTRIBUTING.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/Dockerfile +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/LICENSE +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/README.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/SECURITY.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/actions.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/backends.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/cli.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/config.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/exceptions.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/multi.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/plugins.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/api/serve.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/auth.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/ci-cd.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/css.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/debug.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/record-replay.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/scraping.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/screenshots.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/cookbook/serve-mode.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/assert.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/backends.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/commands.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/init.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/installation.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/multi.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/perf.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/plugins.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/quickstart.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/raw.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/repl.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/guide/troubleshooting.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/docs/index.md +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/mkdocs.yml +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/stubs/bidiwave/__init__.pyi +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/stubs/cdpwave/__init__.pyi +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/__init__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/conftest.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/__init__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_a11y.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_animation.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_backend_selection.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_browser.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_console.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_css.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_debug.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_dialog.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_dom.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_dom_snapshot.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_emulation.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_emulation_advanced.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_eval.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_har.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_input.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_media.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_multi.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_navigate.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_network.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_network_advanced.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_overlay.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_pdf.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_perf.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_permissions.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_raw.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_record.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_scrape.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_screenshot.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_security.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_serve.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_service_worker.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_storage.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_tabs.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_webaudio.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/integration/test_webauthn.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/__init__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_abstract_backend_phase5.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_actions.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_actions_phase5.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_animation_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_assert_multi.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_auth.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_backend_manager.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_bidi_backend.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_bidi_phase5.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_bluetooth_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_cast_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_cleanup.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_cli_phase5.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_config.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_config_phase5.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_cookies_headers_actions.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_css_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_debug_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_dom_snapshot_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_download_screencast.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_emulation_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_error_handling.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_exceptions.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_format_record.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_global_options.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_init.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_input_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_interactions_crawl.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_manager.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_media_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_multi.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_multi_improvements.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_new_features.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_output.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_overlay_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_perf_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_perf_console.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_plugins.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_raw.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_record.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_repl.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_serve.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_service_worker_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_storage_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_webaudio_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/tests/unit/test_webauthn_action.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/__main__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/__init__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/accessibility.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/animation.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/base.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/bluetooth.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/browser.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/cast.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/console.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/cookies.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/crawl.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/css.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/debug.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/dialog.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/dom.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/dom_snapshot.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/download.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/emulation.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/eval.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/extract.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/form.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/har.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/headers.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/input.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/lighthouse.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/media.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/multi.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/navigate.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/network.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/overlay.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/pdf.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/performance.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/permissions.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/record.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/scrape.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/screencast.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/screenshot.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/security.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/service_worker.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/session.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/storage.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/tabs.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/wait.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/webaudio.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/webauthn.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/actions/websocket.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/auth.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/backend/__init__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/backend/base.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/backend/bidi.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/backend/cdp.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/backend/manager.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cleanup.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/__init__.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_advanced.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_capture.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_config.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_debug.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_emulation.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_experimental.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_input.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_navigation.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_network.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_perf.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_serve.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_shared.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/_workflow.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/cli/app.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/config.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/exceptions.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/init.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/multi.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/output.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/plugins.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/record.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/repl.py +0 -0
- {wavexis-2.2.5 → wavexis-2.2.6}/wavexis/serve.py +0 -0
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to wavexis are documented in this file.
|
|
4
4
|
|
|
5
|
+
## v2.2.6 — 2026-07-07
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Named sessions: `--name` flag stores sessions in `~/.wavexis/sessions/`
|
|
10
|
+
- `wavexis session list` — list all saved named sessions with size and modification date
|
|
11
|
+
- `wavexis session delete --name <name>` — delete a named session
|
|
12
|
+
- Named sessions persist between runs, enabling stateful workflows
|
|
13
|
+
|
|
5
14
|
## v2.2.5 — 2026-07-07
|
|
6
15
|
|
|
7
16
|
### Improved
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wavexis
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.6
|
|
4
4
|
Summary: Browser automation CLI — wraps cdpwave and bidiwave, no Node.js, no Chromium download
|
|
5
5
|
Project-URL: Homepage, https://github.com/MathiasPaulenko/wavexis
|
|
6
6
|
Project-URL: Repository, https://github.com/MathiasPaulenko/wavexis
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
|
+
import time
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import Any
|
|
8
9
|
|
|
@@ -21,7 +22,7 @@ from wavexis.config import WaitStrategy
|
|
|
21
22
|
@app.command()
|
|
22
23
|
def session(
|
|
23
24
|
action: str = typer.Argument(
|
|
24
|
-
..., help="Session action: save, load"
|
|
25
|
+
..., help="Session action: save, load, list, delete"
|
|
25
26
|
),
|
|
26
27
|
url: str = typer.Argument(
|
|
27
28
|
"", help="URL to navigate to (for save) or load before navigating (for load)"
|
|
@@ -29,18 +30,60 @@ def session(
|
|
|
29
30
|
output: str = typer.Option(
|
|
30
31
|
"session.json", "--output", "-o", help="Session file path"
|
|
31
32
|
),
|
|
33
|
+
name: str = typer.Option(
|
|
34
|
+
"", "--name", "-n", help="Named session (stored in ~/.wavexis/sessions/)"
|
|
35
|
+
),
|
|
32
36
|
) -> None:
|
|
33
37
|
"""Save or load browser session state (cookies + localStorage + sessionStorage).
|
|
34
38
|
|
|
35
39
|
\b
|
|
36
40
|
Save: wavexis session save https://app.com -o mysession.json
|
|
37
41
|
Load: wavexis session load mysession.json https://app.com
|
|
42
|
+
Named: wavexis session save https://app.com --name mysession
|
|
43
|
+
List: wavexis session list
|
|
44
|
+
Delete: wavexis session delete --name mysession
|
|
38
45
|
"""
|
|
39
46
|
from wavexis.actions.session import SessionLoadAction, SessionSaveAction
|
|
40
47
|
|
|
41
|
-
|
|
48
|
+
sessions_dir = Path.home() / ".wavexis" / "sessions"
|
|
49
|
+
|
|
50
|
+
def _session_path() -> Path:
|
|
51
|
+
if name:
|
|
52
|
+
return sessions_dir / f"{name}.json"
|
|
53
|
+
return Path(output)
|
|
54
|
+
|
|
55
|
+
if action == "list":
|
|
56
|
+
if not sessions_dir.exists():
|
|
57
|
+
typer.echo("No saved sessions found.")
|
|
58
|
+
return
|
|
59
|
+
sessions = list(sessions_dir.glob("*.json"))
|
|
60
|
+
if not sessions:
|
|
61
|
+
typer.echo("No saved sessions found.")
|
|
62
|
+
return
|
|
63
|
+
typer.echo(f"Saved sessions ({len(sessions)}):")
|
|
64
|
+
for s in sorted(sessions):
|
|
65
|
+
stat = s.stat()
|
|
66
|
+
modified = time.strftime("%Y-%m-%d %H:%M", time.localtime(stat.st_mtime))
|
|
67
|
+
typer.echo(f" {s.stem} ({stat.st_size} bytes, {modified})")
|
|
68
|
+
return
|
|
69
|
+
|
|
70
|
+
if action == "delete":
|
|
71
|
+
if not name:
|
|
72
|
+
typer.echo("Error: --name required for delete", err=True)
|
|
73
|
+
raise typer.Exit(1)
|
|
74
|
+
target = _session_path()
|
|
75
|
+
if not target.exists():
|
|
76
|
+
typer.echo(f"Error: session '{name}' not found", err=True)
|
|
77
|
+
raise typer.Exit(1)
|
|
78
|
+
target.unlink()
|
|
79
|
+
typer.echo(f"Deleted session '{name}'")
|
|
80
|
+
return
|
|
81
|
+
|
|
82
|
+
session_path = _session_path()
|
|
42
83
|
|
|
43
84
|
if action == "save":
|
|
85
|
+
if name:
|
|
86
|
+
sessions_dir.mkdir(parents=True, exist_ok=True)
|
|
44
87
|
if not url:
|
|
45
88
|
typer.echo("Error: URL required for session save", err=True)
|
|
46
89
|
raise typer.Exit(1)
|
|
@@ -56,11 +99,11 @@ def session(
|
|
|
56
99
|
await backend.close()
|
|
57
100
|
|
|
58
101
|
_run_async(_save_session())
|
|
59
|
-
typer.echo(f"Session saved to {
|
|
102
|
+
typer.echo(f"Session saved to {session_path}")
|
|
60
103
|
|
|
61
104
|
elif action == "load":
|
|
62
105
|
if not session_path.exists():
|
|
63
|
-
typer.echo(f"Error: session file not found: {
|
|
106
|
+
typer.echo(f"Error: session file not found: {session_path}", err=True)
|
|
64
107
|
raise typer.Exit(1)
|
|
65
108
|
|
|
66
109
|
async def _load_session() -> Any:
|
|
@@ -80,10 +123,13 @@ def session(
|
|
|
80
123
|
result = _run_async(_load_session())
|
|
81
124
|
if result is None:
|
|
82
125
|
return
|
|
83
|
-
typer.echo(f"Session loaded from {
|
|
126
|
+
typer.echo(f"Session loaded from {session_path}: {result}")
|
|
84
127
|
|
|
85
128
|
else:
|
|
86
|
-
typer.echo(
|
|
129
|
+
typer.echo(
|
|
130
|
+
f"Error: unknown session action '{action}'. Use save, load, list, or delete.",
|
|
131
|
+
err=True,
|
|
132
|
+
)
|
|
87
133
|
raise typer.Exit(1)
|
|
88
134
|
|
|
89
135
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|