wasm-cli 1.5.0__tar.gz → 1.5.1__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.
- {wasm_cli-1.5.0/src/wasm_cli.egg-info → wasm_cli-1.5.1}/PKG-INFO +1 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/pyproject.toml +1 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/setup.py +1 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/__init__.py +1 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/backup_schedules.py +2 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/cron.py +2 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/deps.py +8 -5
- wasm_cli-1.5.1/src/wasm/web/pydantic_compat.py +98 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1/src/wasm_cli.egg-info}/PKG-INFO +1 -1
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm_cli.egg-info/SOURCES.txt +1 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/LICENSE +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/MANIFEST.in +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/README.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/MONITOR.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/OBS_SETUP.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/assets/logo.png +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/assets/logo_bg.png +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/superpowers/plans/2026-08-13-wasm-competitive-parity-roadmap.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/superpowers/specs/2026-08-12-wasm-panel-design-direction.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/superpowers/specs/2026-08-12-wasm-v1-refactor-design.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/superpowers/specs/2026-08-13-wasm-competitive-parity-design.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/man/wasm.1 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/setup.cfg +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/__main__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/app.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/backup.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/cert.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/config.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/db.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/env.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/health.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/monitor.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/service.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/setup.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/site.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/store.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/version.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/web.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/commands/webapp.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/interactive.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/panel_links.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/cli/prompts.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/completions/README.md +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/completions/_wasm +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/completions/wasm.bash +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/completions/wasm.fish +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/app_state.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/config.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/dependencies.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/exceptions.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/fs.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/logger.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/net.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/notifier.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/runner.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/store.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/totp.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/update_checker.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/core/utils.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/auto.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/base.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/docker_compose.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/env_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/health.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/nginx_config.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/package_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/path_resolver.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/preflight.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/prisma.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/registration.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/summary.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/turbo.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/helpers/workspace.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/interface.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/monorepo.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/nextjs.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/nodejs.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/pipeline.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/python.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/recorder.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/registry.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/static.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/deployers/vite.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/main.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/apache_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/backup_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/backup_scheduler.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/base_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/cert_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/cron_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/base.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/mongodb.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/mysql.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/postgres.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/redis.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/database/registry.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/nginx_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/service_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/source_manager.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/managers/webserver.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/email_notifier.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/metrics.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/models.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/observation_store.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/process_monitor.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/signals.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/monitor/timeseries.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/apache/proxy.conf.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/apache/static.conf.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/nginx/advanced.conf.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/nginx/monorepo.conf.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/nginx/proxy.conf.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/nginx/static.conf.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/_escape.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/app.service.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/backup-service.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/backup-timer.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/cron-service.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/cron-timer.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/templates/systemd/docker-compose.service.j2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/domain.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/environment.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/names.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/port.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/source.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/validators/ssh.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/apps.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/auth.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/backups.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/certs.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/config.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/databases.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/hooks.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/jobs.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/metrics.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/monitor.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/router.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/services.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/sites.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/api/system.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/auth.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/events.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/jobs.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/metrics_collector.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/server.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/app.css +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/logo.png +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/logo.webp +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/panel.js +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-condensed-latin-500-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-condensed-latin-600-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/htmx.min.js +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/qrcodegen.js +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/sse.js +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/uplot.min.css +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/uplot.min.js +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/xterm.css +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/static/vendor/xterm.js +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/_macros.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/base.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/api_tokens.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/app_charts.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/app_env.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/backup_schedule_section.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/cron_runs.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/cron_section.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/db_console.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/db_engine.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/deploy_form_check.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/deploy_form_options.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/deploy_recent.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/deploy_rollback.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/deploy_rows.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/infra_service_editor.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/infra_service_form.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/infra_site_editor.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/infra_site_form.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/machine.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/notif_channels.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/sessions.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_editor.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_form_backups.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_form_notifications.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_form_paths.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_form_ssl.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_form_web.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_form_webserver.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/settings_section.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/totp.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/fragments/webhook_section.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/login.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/activity.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/app.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/backups.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/certificates.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/cron.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/dashboard.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/databases.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/deploy.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/deployment_detail.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/deployments.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/failure.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/missing.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/resources.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/service_editor.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/service_new.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/settings.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/site_editor.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/templates/pages/site_new.html +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/app_charts.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/backup_schedules.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/context.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/cron.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/databases.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/deploy_form.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/deployments.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/infrastructure.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/machine.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/rendering.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/resources.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/router.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/views/settings_editor.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/websockets/__init__.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm/web/websockets/router.py +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm_cli.egg-info/dependency_links.txt +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm_cli.egg-info/entry_points.txt +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm_cli.egg-info/requires.txt +0 -0
- {wasm_cli-1.5.0 → wasm_cli-1.5.1}/src/wasm_cli.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "wasm-cli"
|
|
7
|
-
version = "1.5.
|
|
7
|
+
version = "1.5.1"
|
|
8
8
|
description = "Web App System Management - Deploy and manage web applications on Linux servers"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "WASM-NCSAL" }
|
|
@@ -9,7 +9,7 @@ from setuptools import setup, find_packages
|
|
|
9
9
|
|
|
10
10
|
setup(
|
|
11
11
|
name="wasm-cli",
|
|
12
|
-
version="1.5.
|
|
12
|
+
version="1.5.1",
|
|
13
13
|
description="Web App System Management - Deploy and manage web applications on Linux servers",
|
|
14
14
|
author="Yago López Prado",
|
|
15
15
|
author_email="yago.lopez.adeje@gmail.com",
|
|
@@ -15,7 +15,7 @@ from importlib.metadata import version as _installed_version
|
|
|
15
15
|
#: as an OBS build directory. The single source of truth is the ``version``
|
|
16
16
|
#: field of pyproject.toml; ``scripts/release.py`` keeps this literal and the
|
|
17
17
|
#: distribution packaging files in step with it.
|
|
18
|
-
_FALLBACK_VERSION = "1.5.
|
|
18
|
+
_FALLBACK_VERSION = "1.5.1"
|
|
19
19
|
|
|
20
20
|
try:
|
|
21
21
|
__version__ = _installed_version("wasm-cli")
|
|
@@ -29,7 +29,7 @@ import logging
|
|
|
29
29
|
from typing import Annotated
|
|
30
30
|
|
|
31
31
|
from fastapi import APIRouter, Depends, HTTPException
|
|
32
|
-
from pydantic import BaseModel, Field
|
|
32
|
+
from pydantic import BaseModel, Field
|
|
33
33
|
|
|
34
34
|
from wasm.core.exceptions import BackupError
|
|
35
35
|
from wasm.core.utils import domain_to_app_name
|
|
@@ -41,6 +41,7 @@ from wasm.managers.backup_scheduler import (
|
|
|
41
41
|
)
|
|
42
42
|
from wasm.web.api.auth import get_current_session
|
|
43
43
|
from wasm.web.api.deps import WASMErrorRoute, strict_domain
|
|
44
|
+
from wasm.web.pydantic_compat import field_validator
|
|
44
45
|
|
|
45
46
|
router = APIRouter(route_class=WASMErrorRoute)
|
|
46
47
|
|
|
@@ -28,13 +28,14 @@ import logging
|
|
|
28
28
|
from typing import Annotated, Any
|
|
29
29
|
|
|
30
30
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
31
|
-
from pydantic import BaseModel, Field
|
|
31
|
+
from pydantic import BaseModel, Field
|
|
32
32
|
|
|
33
33
|
from wasm.core.exceptions import ServiceError
|
|
34
34
|
from wasm.managers.backup_scheduler import SCHEDULE_ALIASES
|
|
35
35
|
from wasm.managers.cron_manager import CronJob, CronManager, validate_cron_calendar
|
|
36
36
|
from wasm.web.api.auth import get_current_session
|
|
37
37
|
from wasm.web.api.deps import WASMErrorRoute
|
|
38
|
+
from wasm.web.pydantic_compat import field_validator
|
|
38
39
|
|
|
39
40
|
router = APIRouter(route_class=WASMErrorRoute)
|
|
40
41
|
|
|
@@ -46,6 +46,7 @@ from wasm.core.exceptions import (
|
|
|
46
46
|
)
|
|
47
47
|
from wasm.validators.domain import validate_domain
|
|
48
48
|
from wasm.web.auth import SCOPE_RANK, ensure_scope, require_auth
|
|
49
|
+
from wasm.web.pydantic_compat import dump_model
|
|
49
50
|
|
|
50
51
|
#: Status used for a WASMError with no more specific mapping. A manager that
|
|
51
52
|
#: raises anything else is reporting that the operation failed on the server,
|
|
@@ -130,11 +131,13 @@ def error_response(exc: WASMError) -> JSONResponse:
|
|
|
130
131
|
# hint, and the client should not have to know the difference.
|
|
131
132
|
return JSONResponse(
|
|
132
133
|
status_code=status_for(exc),
|
|
133
|
-
content=
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
content=dump_model(
|
|
135
|
+
ErrorResponse(
|
|
136
|
+
detail=str(exc),
|
|
137
|
+
hint=getattr(exc, "details", None) or None,
|
|
138
|
+
error=type(exc).__name__,
|
|
139
|
+
)
|
|
140
|
+
),
|
|
138
141
|
)
|
|
139
142
|
|
|
140
143
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Copyright (c) 2024-2026 Yago Lopez Prado
|
|
2
|
+
# Licensed under WASM-NCSAL 1.0 (Commercial use prohibited)
|
|
3
|
+
# https://github.com/Perkybeet/wasm/blob/main/LICENSE
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
One import surface for the pydantic names that differ between v1 and v2.
|
|
7
|
+
|
|
8
|
+
The panel does not choose its pydantic. pip and Fedora install pydantic 2,
|
|
9
|
+
but Ubuntu 24.04 and Debian 12 package ``python3-pydantic`` 1.10, and the
|
|
10
|
+
.deb depends on the distribution package. FastAPI 0.100+ runs on either
|
|
11
|
+
major version, so the rest of the web layer never notices - until a module
|
|
12
|
+
imports a name only one major version has. That is how v1.5.0 shipped:
|
|
13
|
+
``from pydantic import field_validator`` imported cleanly under pip's
|
|
14
|
+
pydantic 2, and ``wasm web start`` died with ImportError on every Ubuntu
|
|
15
|
+
24.04 install.
|
|
16
|
+
|
|
17
|
+
This module bridges exactly the names the web layer uses, nothing more. It
|
|
18
|
+
is not a copy of pydantic and must not grow into one: a name goes here only
|
|
19
|
+
when the two majors spell it differently, and it keeps v2's spelling with
|
|
20
|
+
v2's semantics on both. ``tests/test_architecture.py`` forbids importing the
|
|
21
|
+
version-specific names from pydantic anywhere else.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
from typing import TYPE_CHECKING, Any
|
|
27
|
+
|
|
28
|
+
import pydantic
|
|
29
|
+
from pydantic import BaseModel
|
|
30
|
+
|
|
31
|
+
#: True under pydantic 2. Version detection has to work on both majors, and
|
|
32
|
+
#: ``pydantic.VERSION`` is the one spelling they share.
|
|
33
|
+
PYDANTIC_V2 = int(pydantic.VERSION.split(".")[0]) >= 2
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING or PYDANTIC_V2:
|
|
36
|
+
from pydantic import field_validator as field_validator
|
|
37
|
+
else:
|
|
38
|
+
from pydantic import validator as _v1_validator
|
|
39
|
+
|
|
40
|
+
def field_validator(
|
|
41
|
+
field: str, *fields: str, mode: str = "after", check_fields: bool | None = None
|
|
42
|
+
) -> Any:
|
|
43
|
+
"""
|
|
44
|
+
pydantic v2's ``field_validator``, expressed as a v1 ``validator``.
|
|
45
|
+
|
|
46
|
+
Only the surface the web layer uses is mapped: ``mode="before"``
|
|
47
|
+
becomes v1's ``pre=True`` and ``mode="after"`` its default, both of
|
|
48
|
+
which mean the same thing they mean in v2. ``allow_reuse`` is always
|
|
49
|
+
set because v1 keeps a global registry of validator names and would
|
|
50
|
+
otherwise refuse the module on a re-import, which is exactly what a
|
|
51
|
+
reloading server does.
|
|
52
|
+
|
|
53
|
+
The decorated function must take ``(cls, value)`` and nothing else:
|
|
54
|
+
v2's ``ValidationInfo`` does not exist in v1, so a validator that
|
|
55
|
+
needs more than the value cannot be bridged and must be refactored
|
|
56
|
+
not to.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
field: Name of the field to validate.
|
|
60
|
+
*fields: Further field names, validated by the same function.
|
|
61
|
+
mode: ``"before"`` or ``"after"``, with v2's meaning. The other
|
|
62
|
+
v2 modes have no v1 equivalent and are refused.
|
|
63
|
+
check_fields: Passed through to v1's ``check_fields`` untouched.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
The decorator, exactly as v2's ``field_validator`` would return.
|
|
67
|
+
|
|
68
|
+
Raises:
|
|
69
|
+
TypeError: When ``mode`` names a v2 mode v1 cannot express.
|
|
70
|
+
"""
|
|
71
|
+
if mode not in ("before", "after"):
|
|
72
|
+
raise TypeError(
|
|
73
|
+
f"field_validator mode {mode!r} has no pydantic v1 equivalent; "
|
|
74
|
+
"use 'before' or 'after'"
|
|
75
|
+
)
|
|
76
|
+
kwargs: dict[str, Any] = {"pre": mode == "before", "allow_reuse": True}
|
|
77
|
+
if check_fields is not None:
|
|
78
|
+
kwargs["check_fields"] = check_fields
|
|
79
|
+
return _v1_validator(field, *fields, **kwargs)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def dump_model(model: BaseModel) -> dict[str, Any]:
|
|
83
|
+
"""
|
|
84
|
+
Serialise a model to a plain dict, whichever pydantic is installed.
|
|
85
|
+
|
|
86
|
+
v2 spells this ``model_dump()`` and v1 ``dict()``; each major warns or
|
|
87
|
+
fails on the other's spelling, so callers use this instead of either.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
model: The model instance to serialise.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
The model's fields as a dictionary, as the installed pydantic builds
|
|
94
|
+
it.
|
|
95
|
+
"""
|
|
96
|
+
if PYDANTIC_V2:
|
|
97
|
+
return model.model_dump()
|
|
98
|
+
return model.dict()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/superpowers/specs/2026-08-12-wasm-panel-design-direction.md
RENAMED
|
File without changes
|
{wasm_cli-1.5.0 → wasm_cli-1.5.1}/docs/superpowers/specs/2026-08-12-wasm-v1-refactor-design.md
RENAMED
|
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
|