nerdit 0.7.0__tar.gz → 0.7.2__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.
- {nerdit-0.7.0 → nerdit-0.7.2}/PKG-INFO +7 -6
- {nerdit-0.7.0 → nerdit-0.7.2}/README.md +6 -5
- {nerdit-0.7.0 → nerdit-0.7.2}/pyproject.toml +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/__init__.py +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/share.py +3 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/uninstall.py +14 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/display.py +3 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/eventlog.py +4 -3
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/services.py +18 -8
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/projects.py +5 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/service_logs_stream.py +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/service_wait.py +20 -2
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/services.py +1 -6
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/share.py +2 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/exposure.py +4 -2
- nerdit-0.7.0/src/nerdit/daemon/web/dist/assets/index-AmxeH3ZR.js → nerdit-0.7.2/src/nerdit/daemon/web/dist/assets/index-BiZkV8Cy.js +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/index.html +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ServiceShareCard.test.tsx +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ServiceShareCard.tsx +1 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/logs.py +9 -3
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/rows.py +2 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/exposure.py +8 -6
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/services.py +2 -1
- {nerdit-0.7.0 → nerdit-0.7.2}/.gitignore +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/LICENSE +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/NOTICE +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/__main__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/app.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/checks.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/client.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/apply.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/backup.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/capabilities.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/check_deps.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/connect.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/daemon.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/db.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/deploy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/dev.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/diagnose.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/doctor.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/domains.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/events.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/exit.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/init.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/license.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/link.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/logs.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/mcp.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/models.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/projects.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/proxy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/routes.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/secrets.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/serve.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/services.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/store.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/system.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/token.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/trust.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/update.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/commands/vars.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/cli/upload.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/app_config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/app_templates/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/app_templates/builtin.json +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/app_templates/loader.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/build.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/defaults.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/project.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/redaction.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/settings.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/config/store.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/app_build.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/backup.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/bindings/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/bindings/registry.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/bindings/secretref.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/builder.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/cutover.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/data/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/data/backend.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/data/binding.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/data/controller.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/deploy_state.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/discovery.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/dns.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/events.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/gitsource.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/gitwatch.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/health.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/jobconfig.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/launch.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/license.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/apps.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/capability.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/client.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/frames.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/hosted.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/identity.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/manager.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/link/mux.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/models/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/models/backend.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/models/binding.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/models/controller.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/monitor.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/node_packages.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/node_runtime.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/notify.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/project_identity.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/admin.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/certs.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/domains.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/edgeauth.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/manager.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/routing.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/supervisor.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/proxy/tls.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/remediation_settle.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/resources/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/resources/controller.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/retention.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/runtime/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/runtime/container.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/runtime/docker.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/runtime/protocol.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/runtime/stub.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/sandbox.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/secrets.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/sweeper.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/variables.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/volumes.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/workload.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/core/workspaces.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/appfactory.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/audit.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/auth.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/bodylimit.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/bootstrap.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/deploy_pipeline.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/errors.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/idempotency.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/imagegc.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/lifecycle.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/limits.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/middleware.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/project_delegation.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/remediation.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/_resources.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/app_config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/app_templates.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/audit.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/auth.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/cluster.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/databases.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/deploy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/domains.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/events.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/gpus.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/health.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/images.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/license.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/link.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/models.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/proxy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/secrets.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/service_diagnose.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/service_run.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/service_stats.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/system.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/tokens.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/routes/workspaces.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/_base.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/audit.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/cluster.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/databases.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/deploy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/events.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/gpus.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/health.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/license.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/link.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/models.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/proxy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/service_diagnose.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/service_purge.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/service_run.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/service_stats.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/service_wait.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/services.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/system.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/tokens.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/schemas/workspaces.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/secret_scope.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/server.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/service_purge.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/sse.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/sweeps.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/uploads.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/views/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/views/hosted.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/views/service.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/dist/assets/index-CLfzcEzV.css +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/eslint.config.js +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/index.html +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/package-lock.json +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/package.json +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/playwright.config.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/postcss.config.js +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/auditStream.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/client.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/client.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/clusterEvents.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/queries.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/queries.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/api/types.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/CommandPalette.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ConfigurePanel.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/DaemonStatusBanner.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/DeployDialog.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/DeployProgress.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/DiagnosePanel.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/Dropzone.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ErrorBoundary.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/SecretsPanel.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ServiceLogsPanel.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ServicePublicUrl.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/TemplateDeployDialog.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ToastViewport.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/UnlinkedBanner.test.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/UnlinkedBanner.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/bindings/AiEndpointFields.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/bindings/BindingSwitch.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/bindings/GenericBindingsPanel.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/bindings/KeyFlow.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/bindings/sections.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/bindings/useBindingDraft.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/AppearanceCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/DiskCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/DoctorCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/GpuCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/HostnameCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/ProxyStatusCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/settings/RoutesCard.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ui.test.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/components/ui.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/aiProviders.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/analytics.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/apiErrors.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/apiErrors.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/auth.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/bindings.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/bindings.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/deployPhase.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/format.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/format.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/projects.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/projects.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/sse.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/sse.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/status.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/status.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/theme.test.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/lib/theme.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/main.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Audit.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Databases.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Login.test.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Login.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Models.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/ProjectDetail.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/ProjectPage.test.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/ProjectPage.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/ProjectPolling.test.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Projects.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/ServiceRedirect.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Settings.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/pages/Tokens.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/shell/AppShell.tsx +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/shell/navItems.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/state/toastStore.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/src/styles/globals.css +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tailwind.config.js +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/01-login-and-overview.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/05-services.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/06-models.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/07-audit.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/08-secrets.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/10-settings.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/11-configure.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/12-deploy.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/13-bindings.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/14-responsive-shell.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/17-projects.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/18-navigation.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/19-project-page.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/20-command-palette.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/21-tokens.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/22-system-cards.spec.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tests/e2e/fixtures.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tsconfig.json +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/tsconfig.tsbuildinfo +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/daemon/web/vite.config.ts +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/database.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/enums.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/models.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/_base.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/audit.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/domains.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/endpoints.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/events.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/gpus.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/idempotency.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/projects.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/secret_claims.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/service_config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/services.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/shares.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/tokens.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/db/queries/workloads.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/errors.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/server.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/_shared.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/cluster.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/config.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/databases.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/deploy.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/models.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/projects.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/secrets.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/system.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/tools/workspaces.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/mcp/transport.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/__init__.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/certs.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/disk.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/frozen.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/fs.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/ids.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/install_layout.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/logging.py +0 -0
- {nerdit-0.7.0 → nerdit-0.7.2}/src/nerdit/utils/names.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: nerdit
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.2
|
|
4
4
|
Summary: The local AI PaaS — deploy and operate apps on your own hardware, with first-class local AI
|
|
5
5
|
Project-URL: Homepage, https://github.com/nerdit-ai/nerdit
|
|
6
6
|
Project-URL: Repository, https://github.com/nerdit-ai/nerdit
|
|
@@ -264,17 +264,18 @@ your own PostHog project.
|
|
|
264
264
|
- hosted URLs
|
|
265
265
|
|
|
266
266
|
Your machine connects out to the cloud, so you open no inbound port. Hosted
|
|
267
|
-
shares are private
|
|
268
|
-
publication and follows the
|
|
267
|
+
shares are private by default: only you and the people you allow in the Nerdit
|
|
268
|
+
App can open them. Public access needs an explicit publication and follows the
|
|
269
|
+
[Terms](https://nerdit.ai/terms).
|
|
269
270
|
|
|
270
271
|
Questions or feedback: [feedback@nerdit.ai](mailto:feedback@nerdit.ai).
|
|
271
272
|
|
|
272
273
|
## License
|
|
273
274
|
|
|
274
|
-
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.7.
|
|
275
|
-
are not covered by the code license, see [NOTICE](https://github.com/nerdit-ai/nerdit/blob/v0.7.
|
|
275
|
+
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.7.2/LICENSE). "Nerdit" and the logo are trademarks and
|
|
276
|
+
are not covered by the code license, see [NOTICE](https://github.com/nerdit-ai/nerdit/blob/v0.7.2/NOTICE).
|
|
276
277
|
|
|
277
278
|
## Contributing
|
|
278
279
|
|
|
279
|
-
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.7.
|
|
280
|
+
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.7.2/CONTRIBUTING.md)
|
|
280
281
|
explains how contributions land in releases.
|
|
@@ -205,17 +205,18 @@ your own PostHog project.
|
|
|
205
205
|
- hosted URLs
|
|
206
206
|
|
|
207
207
|
Your machine connects out to the cloud, so you open no inbound port. Hosted
|
|
208
|
-
shares are private
|
|
209
|
-
publication and follows the
|
|
208
|
+
shares are private by default: only you and the people you allow in the Nerdit
|
|
209
|
+
App can open them. Public access needs an explicit publication and follows the
|
|
210
|
+
[Terms](https://nerdit.ai/terms).
|
|
210
211
|
|
|
211
212
|
Questions or feedback: [feedback@nerdit.ai](mailto:feedback@nerdit.ai).
|
|
212
213
|
|
|
213
214
|
## License
|
|
214
215
|
|
|
215
|
-
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.7.
|
|
216
|
-
are not covered by the code license, see [NOTICE](https://github.com/nerdit-ai/nerdit/blob/v0.7.
|
|
216
|
+
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.7.2/LICENSE). "Nerdit" and the logo are trademarks and
|
|
217
|
+
are not covered by the code license, see [NOTICE](https://github.com/nerdit-ai/nerdit/blob/v0.7.2/NOTICE).
|
|
217
218
|
|
|
218
219
|
## Contributing
|
|
219
220
|
|
|
220
|
-
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.7.
|
|
221
|
+
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.7.2/CONTRIBUTING.md)
|
|
221
222
|
explains how contributions land in releases.
|
|
@@ -60,7 +60,9 @@ def share(
|
|
|
60
60
|
False,
|
|
61
61
|
"--public",
|
|
62
62
|
help=(
|
|
63
|
-
"Make the URL world-reachable instead of owner
|
|
63
|
+
"Make the URL world-reachable instead of private (the owner of this "
|
|
64
|
+
"machine's Nerdit account and the people they allow in the Nerdit "
|
|
65
|
+
"App). Needs an "
|
|
64
66
|
"active linked account AND either --consent or a \\[deploy].edge_auth "
|
|
65
67
|
"block on the app."
|
|
66
68
|
),
|
|
@@ -11,6 +11,7 @@ file may survive until reboot. Escape dynamic Rich text.
|
|
|
11
11
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
|
+
import contextlib
|
|
14
15
|
import os
|
|
15
16
|
import shutil
|
|
16
17
|
import signal
|
|
@@ -691,6 +692,19 @@ def _remove_unit(unit: ServiceUnit) -> None:
|
|
|
691
692
|
"""Disable and remove the unit only after the data-dir lock proves the daemon is gone."""
|
|
692
693
|
if unit.disable_argv != unit.stop_argv: # launchd's bootout is both
|
|
693
694
|
_run_unit_command(unit.disable_argv, note=" — continuing")
|
|
695
|
+
if unit.kind == "systemd-system":
|
|
696
|
+
# install.sh --template's drop-ins; an operator's own overrides stay.
|
|
697
|
+
# Before the base unit: unit discovery needs the base unit file, so a
|
|
698
|
+
# drop-in that outlived it would be invisible to a retried uninstall.
|
|
699
|
+
drop_in_dir = unit.unit_path.with_name(unit.unit_path.name + ".d")
|
|
700
|
+
names = ("10-fork-safe.conf", "20-docker0.conf", "30-deny-inbound.conf")
|
|
701
|
+
ours = [drop_in_dir / n for n in names]
|
|
702
|
+
if any(path_present(p) for p in ours):
|
|
703
|
+
for path in ours:
|
|
704
|
+
if path_present(path):
|
|
705
|
+
_delete_path(path)
|
|
706
|
+
with contextlib.suppress(OSError):
|
|
707
|
+
drop_in_dir.rmdir()
|
|
694
708
|
if path_present(unit.unit_path):
|
|
695
709
|
_delete_path(unit.unit_path)
|
|
696
710
|
console.print(f"[dim]Removed the service unit ({_plain(unit.unit_path)}).[/dim]")
|
|
@@ -472,6 +472,9 @@ def display_wait_outcome(result: dict) -> None:
|
|
|
472
472
|
outcome = result.get("outcome")
|
|
473
473
|
name = _plain(result.get("service_name")) or "service"
|
|
474
474
|
if outcome == "converged":
|
|
475
|
+
if result.get("status") == "stopped": # a requested stop converged
|
|
476
|
+
console.print(f"[green]Converged:[/green] {name} is stopped")
|
|
477
|
+
return
|
|
475
478
|
console.print(f"[green]Converged:[/green] {name} is healthy")
|
|
476
479
|
url = result.get("public_url")
|
|
477
480
|
if url:
|
|
@@ -98,9 +98,10 @@ EVENT_TYPES: frozenset[str] = frozenset(
|
|
|
98
98
|
# --- the owner's exposure decisions. `share.ready`: a share was set
|
|
99
99
|
# or changed — `data` carries `{access}` and, for a PRIVATE share
|
|
100
100
|
# only, `url`. A private hosted URL is not a bearer capability (the
|
|
101
|
-
# cloud edge still demands
|
|
102
|
-
# world-reachable and this feed is POSTed to
|
|
103
|
-
# so the public URL is omitted.
|
|
101
|
+
# cloud edge still demands a signed-in identity the owner allows),
|
|
102
|
+
# while a PUBLIC one is world-reachable and this feed is POSTed to
|
|
103
|
+
# third-party webhook hosts, so the public URL is omitted.
|
|
104
|
+
# `share.removed`: the share was deleted
|
|
104
105
|
# (`reason` = `unshared` | `service_deleted`). Never the capability
|
|
105
106
|
# token, never a navigation ticket.
|
|
106
107
|
"share.ready",
|
|
@@ -25,7 +25,7 @@ import sqlite3
|
|
|
25
25
|
import time
|
|
26
26
|
from collections.abc import AsyncIterator, Awaitable, Callable, Coroutine, Iterable
|
|
27
27
|
from dataclasses import dataclass, field
|
|
28
|
-
from datetime import UTC, datetime
|
|
28
|
+
from datetime import UTC, datetime, timedelta
|
|
29
29
|
from enum import StrEnum
|
|
30
30
|
from pathlib import Path
|
|
31
31
|
|
|
@@ -331,9 +331,15 @@ class RunPreconditionError(Exception):
|
|
|
331
331
|
#: flushes a partial batch.
|
|
332
332
|
_LOG_BATCH = 256
|
|
333
333
|
_LOG_FLUSH_S = 0.25
|
|
334
|
-
#: Stored rows of the resume
|
|
335
|
-
# ponytail: a busier resume
|
|
334
|
+
#: Stored rows of the resume window a re-adopted follow checks for replays.
|
|
335
|
+
# ponytail: a busier resume window re-inserts its lines past this bound.
|
|
336
336
|
_LOG_RESUME_MAX = 4 * _LOG_BATCH
|
|
337
|
+
#: Seconds a re-adopted follow rewinds behind the newest row's insert time.
|
|
338
|
+
#: Docker's `since` is container emission time; rows carry insert time, which
|
|
339
|
+
#: trails emission by the flush interval plus any reader backlog.
|
|
340
|
+
# ponytail: a reader more than this far behind still loses its unread backlog;
|
|
341
|
+
# persisting Docker's own line timestamps is the exact cursor.
|
|
342
|
+
_LOG_RESUME_LAG_S = 10
|
|
337
343
|
|
|
338
344
|
|
|
339
345
|
class RunInterruptedError(ContainerRuntimeError):
|
|
@@ -3054,16 +3060,20 @@ class ServiceController:
|
|
|
3054
3060
|
"""
|
|
3055
3061
|
now = datetime.now(UTC)
|
|
3056
3062
|
# Re-adopt the log stream if we are not already collecting it (reboot),
|
|
3057
|
-
# resuming
|
|
3058
|
-
# the container's whole log history into job_logs.
|
|
3059
|
-
#
|
|
3060
|
-
#
|
|
3063
|
+
# resuming shortly before the newest persisted row rather than replaying
|
|
3064
|
+
# the container's whole log history into job_logs. Row timestamps are
|
|
3065
|
+
# second-resolution INSERT times while Docker's inclusive `since` is
|
|
3066
|
+
# EMISSION time, so the follow rewinds `_LOG_RESUME_LAG_S` (a line
|
|
3067
|
+
# emitted before the last insert but never read is not lost) and the
|
|
3068
|
+
# rows stored since that point are handed over as `seen` to drop the
|
|
3069
|
+
# replay. Any row emitted >= since was inserted >= since, so `seen`
|
|
3070
|
+
# covers the whole replay.
|
|
3061
3071
|
if job.container_id and job.container_id not in self._log_tasks:
|
|
3062
3072
|
last = await self._queries.get_logs(job.id, tail=1, streams=[LogStream.stdout])
|
|
3063
3073
|
since = None
|
|
3064
3074
|
seen: list[str] = []
|
|
3065
3075
|
if last:
|
|
3066
|
-
ts = last[-1].timestamp
|
|
3076
|
+
ts = last[-1].timestamp - timedelta(seconds=_LOG_RESUME_LAG_S)
|
|
3067
3077
|
since = int(ts.replace(tzinfo=UTC).timestamp())
|
|
3068
3078
|
rows = await self._queries.get_logs(
|
|
3069
3079
|
job.id,
|
|
@@ -253,6 +253,9 @@ class ApplyResponse(BaseModel):
|
|
|
253
253
|
"""`POST /projects/{project}/apply`: what was planned, applied, or is still missing."""
|
|
254
254
|
|
|
255
255
|
project: str
|
|
256
|
+
project_id: str | None = Field(
|
|
257
|
+
default=None, description="The project's immutable id; null when a dry run creates it"
|
|
258
|
+
)
|
|
256
259
|
status: Literal["applied", "planned", "waiting_for_variables"]
|
|
257
260
|
dry_run: bool
|
|
258
261
|
services: list[ApplyServiceResult] = Field(default_factory=list)
|
|
@@ -1313,6 +1316,7 @@ async def apply_project(
|
|
|
1313
1316
|
if missing:
|
|
1314
1317
|
return ApplyResponse(
|
|
1315
1318
|
project=project,
|
|
1319
|
+
project_id=row.id if row is not None else None,
|
|
1316
1320
|
status="waiting_for_variables",
|
|
1317
1321
|
dry_run=dry_run,
|
|
1318
1322
|
missing=missing,
|
|
@@ -1329,6 +1333,7 @@ async def apply_project(
|
|
|
1329
1333
|
# awaited planning step just as the real deployment checks at reservation.
|
|
1330
1334
|
if row is not None:
|
|
1331
1335
|
await _judge_apply_project(request, row.id)
|
|
1336
|
+
result.project_id = row.id
|
|
1332
1337
|
return result
|
|
1333
1338
|
finally:
|
|
1334
1339
|
# `_finalize_deploy` adds masked `ai` / `db` members to the params it
|
|
@@ -132,7 +132,7 @@ async def _log_frames(
|
|
|
132
132
|
max id first is what makes skipping safe: anything written after this
|
|
133
133
|
read gets a strictly larger id.
|
|
134
134
|
"""
|
|
135
|
-
pre_max = await queries.max_log_id() if filtered else 0
|
|
135
|
+
pre_max = await queries.max_log_id(job_id) if filtered else 0
|
|
136
136
|
entries = await queries.get_logs(
|
|
137
137
|
job_id, since_id=cursor, grep=grep, since_ts=since_ts, limit=_POLL_CHUNK
|
|
138
138
|
)
|
|
@@ -45,7 +45,11 @@ _WAIT_TERMINAL_STATUSES = frozenset({JobStatus.failed, JobStatus.stopped, JobSta
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
def _evaluate_wait(
|
|
48
|
-
job: Job,
|
|
48
|
+
job: Job,
|
|
49
|
+
resolved_version: int | None,
|
|
50
|
+
version_aware: bool,
|
|
51
|
+
*,
|
|
52
|
+
explicit_version: bool = False,
|
|
49
53
|
) -> tuple[str | None, dict | None]:
|
|
50
54
|
"""Compute the wait outcome for a freshly-read row (or `None` = keep waiting).
|
|
51
55
|
|
|
@@ -63,6 +67,18 @@ def _evaluate_wait(
|
|
|
63
67
|
ld = None
|
|
64
68
|
status = job.status
|
|
65
69
|
|
|
70
|
+
# A requested stop is its own target, for every kind: the row reads
|
|
71
|
+
# `desired_state=stopped` at once but keeps its live status (and any
|
|
72
|
+
# `healthy` phase) until the reconciler's next tick tears the container
|
|
73
|
+
# down, so converge only on `stopped` — never on the container still
|
|
74
|
+
# running, nor `failed` on the very stop the caller asked for: a `failed`
|
|
75
|
+
# or `cancelled` row is torn down to `stopped` by the same tick, and a
|
|
76
|
+
# teardown that never lands ends in an honest `timeout`. A wait for an
|
|
77
|
+
# explicit version (`deploy --wait`) keeps its target: a concurrent stop
|
|
78
|
+
# must not read as that version converging.
|
|
79
|
+
if job.desired_state == "stopped" and not explicit_version:
|
|
80
|
+
return ("converged" if status == JobStatus.stopped else None), ld
|
|
81
|
+
|
|
66
82
|
# Model rows never carry a last_deploy phase machine
|
|
67
83
|
# (ModelController._stamp_last_deploy_failed is a no-op for them), so
|
|
68
84
|
# `version_aware` is always False here and the status-only branch below
|
|
@@ -309,7 +325,9 @@ async def wait_for_service(
|
|
|
309
325
|
async with _WAIT_SEMAPHORE:
|
|
310
326
|
started = time.monotonic()
|
|
311
327
|
while True:
|
|
312
|
-
outcome, ld = _evaluate_wait(
|
|
328
|
+
outcome, ld = _evaluate_wait(
|
|
329
|
+
job, resolved_version, version_aware, explicit_version=requested_version is not None
|
|
330
|
+
)
|
|
313
331
|
waited = time.monotonic() - started
|
|
314
332
|
if outcome is not None:
|
|
315
333
|
endpoint = await _endpoint_for(job)
|
|
@@ -20,7 +20,6 @@ from nerdit.core.volumes import VolumeSpecError, service_data_root
|
|
|
20
20
|
from nerdit.daemon.audit import audit_params
|
|
21
21
|
from nerdit.daemon.auth import (
|
|
22
22
|
QuotaExceeded,
|
|
23
|
-
current_principal,
|
|
24
23
|
require_owner_or_admin,
|
|
25
24
|
require_role,
|
|
26
25
|
require_service_scope,
|
|
@@ -531,11 +530,7 @@ async def logs_for_job( # noqa: PLR0913 - the bounded log query
|
|
|
531
530
|
# there. Captured BEFORE the scan — anything written after this read gets a
|
|
532
531
|
# strictly larger id, which is what makes skipping to it safe.
|
|
533
532
|
paged = (grep or since_ts) and not (tail is not None and tail > 0)
|
|
534
|
-
watermark = (
|
|
535
|
-
await queries.max_log_id()
|
|
536
|
-
if paged and current_principal(request).project_id is None
|
|
537
|
-
else None
|
|
538
|
-
)
|
|
533
|
+
watermark = await queries.max_log_id(job.id) if paged else None
|
|
539
534
|
# The forward branch carries the SAME cap as `tail` (the tail branch ignores
|
|
540
535
|
# `limit`): without one, a parameterless GET returns the whole retained
|
|
541
536
|
# history of a chatty service — tens of MB materialized as `LogEntry` objects
|
|
@@ -294,7 +294,8 @@ async def set_share(request: Request, name: str, body: ShareRequest) -> ShareVie
|
|
|
294
294
|
recorder = get_recorder()
|
|
295
295
|
if recorder is not None:
|
|
296
296
|
# A PRIVATE hosted URL is not a bearer capability — the cloud edge still
|
|
297
|
-
# demands
|
|
297
|
+
# demands a signed-in identity the owner allows (the owner, or a person
|
|
298
|
+
# allowed in the Nerdit App) — so it is safe to carry. A PUBLIC one is
|
|
298
299
|
# omitted: this feed is POSTed verbatim to operator-configured webhook
|
|
299
300
|
# hosts, and a world-reachable address does not need to travel there.
|
|
300
301
|
data: dict[str, object] = {"access": share.access}
|
|
@@ -71,8 +71,10 @@ class ShareRequest(StrictRequestModel):
|
|
|
71
71
|
access: Literal["private", "public"] = Field(
|
|
72
72
|
default="private",
|
|
73
73
|
description=(
|
|
74
|
-
"'private' (default) opens only for
|
|
75
|
-
"the
|
|
74
|
+
"'private' (default) opens only for the owner of this machine's "
|
|
75
|
+
"Nerdit account and the people they allow in the Nerdit App, checked "
|
|
76
|
+
"at the cloud edge; "
|
|
77
|
+
"'public' is world-reachable"
|
|
76
78
|
),
|
|
77
79
|
)
|
|
78
80
|
consent: bool = Field(
|