nerdit 0.8.2__tar.gz → 0.8.3__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.8.2 → nerdit-0.8.3}/PKG-INFO +4 -4
- {nerdit-0.8.2 → nerdit-0.8.3}/README.md +3 -3
- {nerdit-0.8.2 → nerdit-0.8.3}/pyproject.toml +1 -1
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/__init__.py +1 -1
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/ai.py +5 -4
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/settings.py +7 -6
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/ai_gateway.py +22 -10
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/ai_gateway.py +2 -2
- {nerdit-0.8.2 → nerdit-0.8.3}/.gitignore +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/LICENSE +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/NOTICE +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/__main__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/app.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/checks.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/client.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/apply.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/backup.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/capabilities.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/check_deps.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/connect.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/daemon.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/db.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/dev.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/diagnose.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/doctor.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/exit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/init.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/link.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/logs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/mcp.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/routes.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/secrets.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/serve.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/share.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/store.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/token.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/trust.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/uninstall.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/update.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/commands/vars.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/display.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/cli/upload.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/app_config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/app_templates/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/app_templates/builtin.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/app_templates/loader.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/build.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/defaults.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/project.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/redaction.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/config/store.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/ai_gateway/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/ai_gateway/app.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/ai_gateway/keys.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/ai_gateway/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/app_build.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/backup.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/bindings/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/bindings/registry.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/bindings/secretref.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/builder.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/cutover.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/data/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/data/backend.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/data/binding.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/data/controller.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/deploy_state.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/discovery.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/dns.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/eventlog.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/gitsource.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/gitwatch.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/health.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/jobconfig.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/launch.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/apps.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/capability.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/client.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/frames.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/hosted.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/identity.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/manager.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/link/mux.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/models/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/models/backend.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/models/binding.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/models/controller.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/monitor.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/node_packages.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/node_runtime.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/notify.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/project_identity.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/admin.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/certs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/edgeauth.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/manager.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/routing.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/supervisor.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/proxy/tls.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/remediation_settle.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/resources/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/resources/controller.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/retention.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/runtime/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/runtime/container.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/runtime/docker.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/runtime/protocol.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/runtime/stub.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/sandbox.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/secrets.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/sweeper.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/variables.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/volumes.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/workload.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/core/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/appfactory.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/auth.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/bodylimit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/bootstrap.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/deploy_pipeline.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/errors.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/idempotency.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/imagegc.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/lifecycle.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/limits.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/middleware.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/project_delegation.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/remediation.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/_resources.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/app_config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/app_templates.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/auth.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/cluster.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/databases.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/gpus.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/health.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/images.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/link.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/secrets.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/service_diagnose.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/service_logs_stream.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/service_run.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/service_stats.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/service_wait.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/share.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/tokens.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/routes/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/_base.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/cluster.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/databases.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/exposure.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/gpus.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/health.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/link.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/service_diagnose.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/service_purge.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/service_run.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/service_stats.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/service_wait.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/tokens.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/schemas/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/secret_scope.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/server.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/service_purge.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/sse.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/sweeps.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/uploads.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/views/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/views/hosted.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/views/service.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/index-BZxXG41K.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/assets/index-CLfzcEzV.css +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/dist/index.html +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/eslint.config.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/index.html +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/package-lock.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/package.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/playwright.config.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/postcss.config.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/auditStream.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/client.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/client.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/clusterEvents.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/queries.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/queries.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/api/types.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/AuthGate.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/AuthGate.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/CommandPalette.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ConfigurePanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/DaemonStatusBanner.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/DeployDialog.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/DeployProgress.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/DiagnosePanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/Dropzone.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ErrorBoundary.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/SecretsPanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ServiceLogsPanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ServicePublicUrl.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ServiceShareCard.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ServiceShareCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/TemplateDeployDialog.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ToastViewport.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/UnlinkedBanner.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/UnlinkedBanner.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/bindings/AiEndpointFields.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/bindings/BindingSwitch.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/bindings/GenericBindingsPanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/bindings/KeyFlow.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/bindings/sections.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/bindings/useBindingDraft.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/AppearanceCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/DiskCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/DoctorCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/GpuCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/HostnameCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/ProxyStatusCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/settings/RoutesCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ui.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/components/ui.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/aiProviders.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/analytics.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/apiErrors.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/apiErrors.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/auth.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/bindings.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/bindings.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/deployPhase.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/format.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/format.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/projects.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/projects.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/sse.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/sse.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/status.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/status.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/theme.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/lib/theme.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/main.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Audit.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Databases.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Login.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Login.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Models.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/ProjectDetail.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/ProjectPage.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/ProjectPage.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/ProjectPolling.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Projects.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/ServiceRedirect.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Settings.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/pages/Tokens.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/shell/AppShell.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/shell/navItems.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/state/toastStore.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/src/styles/globals.css +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tailwind.config.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/01-login-and-overview.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/05-services.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/06-models.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/07-audit.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/08-secrets.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/10-settings.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/11-configure.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/12-deploy.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/13-bindings.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/14-responsive-shell.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/17-projects.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/18-navigation.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/19-project-page.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/20-command-palette.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/21-tokens.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/22-system-cards.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tests/e2e/fixtures.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tsconfig.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/tsconfig.tsbuildinfo +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/daemon/web/vite.config.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/database.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/enums.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/_base.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/ai_gateway.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/endpoints.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/gpus.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/idempotency.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/logs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/secret_claims.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/service_config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/shares.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/tokens.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/queries/workloads.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/db/rows.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/errors.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/server.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/_shared.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/cluster.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/databases.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/exposure.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/secrets.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/tools/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/mcp/transport.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/certs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/disk.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/frozen.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/fs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/ids.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/install_layout.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/logging.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.3}/src/nerdit/utils/names.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: nerdit
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.3
|
|
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
|
|
@@ -272,10 +272,10 @@ Questions or feedback: [feedback@nerdit.ai](mailto:feedback@nerdit.ai).
|
|
|
272
272
|
|
|
273
273
|
## License
|
|
274
274
|
|
|
275
|
-
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.8.
|
|
276
|
-
are not covered by the code license, see [NOTICE](https://github.com/nerdit-ai/nerdit/blob/v0.8.
|
|
275
|
+
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.8.3/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.8.3/NOTICE).
|
|
277
277
|
|
|
278
278
|
## Contributing
|
|
279
279
|
|
|
280
|
-
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.8.
|
|
280
|
+
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.8.3/CONTRIBUTING.md)
|
|
281
281
|
explains how contributions land in releases.
|
|
@@ -213,10 +213,10 @@ Questions or feedback: [feedback@nerdit.ai](mailto:feedback@nerdit.ai).
|
|
|
213
213
|
|
|
214
214
|
## License
|
|
215
215
|
|
|
216
|
-
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.8.
|
|
217
|
-
are not covered by the code license, see [NOTICE](https://github.com/nerdit-ai/nerdit/blob/v0.8.
|
|
216
|
+
Apache-2.0, see [LICENSE](https://github.com/nerdit-ai/nerdit/blob/v0.8.3/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.8.3/NOTICE).
|
|
218
218
|
|
|
219
219
|
## Contributing
|
|
220
220
|
|
|
221
|
-
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.8.
|
|
221
|
+
Issues and pull requests are welcome. [CONTRIBUTING.md](https://github.com/nerdit-ai/nerdit/blob/v0.8.3/CONTRIBUTING.md)
|
|
222
222
|
explains how contributions land in releases.
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
An alias names a provider model and a `${secrets.shared.KEY}` reference to its
|
|
4
4
|
key; the key itself is set with `nerdit secrets set --shared` and never passes
|
|
5
|
-
through these commands. Writes
|
|
5
|
+
through these commands. Writes take a submitter or admin token and mint an
|
|
6
|
+
idempotency key; a submitter revokes the keys of its own apps only.
|
|
6
7
|
"""
|
|
7
8
|
|
|
8
9
|
from __future__ import annotations
|
|
@@ -74,7 +75,7 @@ def routes_set(
|
|
|
74
75
|
"never the key itself.",
|
|
75
76
|
),
|
|
76
77
|
) -> None:
|
|
77
|
-
"""Create or replace an alias (admin).
|
|
78
|
+
"""Create or replace an alias (submitter or admin).
|
|
78
79
|
|
|
79
80
|
Example: nerdit ai routes set fast --model openai/gpt-4o-mini
|
|
80
81
|
--base-url https://openrouter.ai/api/v1 --key-ref '${secrets.shared.OPENROUTER_API_KEY}'
|
|
@@ -101,7 +102,7 @@ def routes_rm(
|
|
|
101
102
|
alias: str = typer.Argument(..., help="Alias to remove."),
|
|
102
103
|
force: bool = typer.Option(False, "--force", help="Remove even if a running app uses it."),
|
|
103
104
|
) -> None:
|
|
104
|
-
"""Remove an alias (admin). Refused while a running app uses it, unless --force."""
|
|
105
|
+
"""Remove an alias (submitter or admin). Refused while a running app uses it, unless --force."""
|
|
105
106
|
asyncio.run(
|
|
106
107
|
call_or_exit(_client().remove_ai_route(alias, force=force, idempotency_key=uuid4().hex))
|
|
107
108
|
)
|
|
@@ -128,7 +129,7 @@ def keys_list(
|
|
|
128
129
|
|
|
129
130
|
@keys_app.command("revoke")
|
|
130
131
|
def keys_revoke(service: str = typer.Argument(..., help="App whose keys to revoke.")) -> None:
|
|
131
|
-
"""Revoke an app's virtual keys (admin); it gets a new one when it restarts."""
|
|
132
|
+
"""Revoke an app's virtual keys (its owner or admin); it gets a new one when it restarts."""
|
|
132
133
|
result = asyncio.run(
|
|
133
134
|
call_or_exit(_client().revoke_ai_gateway_keys(service, idempotency_key=uuid4().hex))
|
|
134
135
|
)
|
|
@@ -684,14 +684,15 @@ class ModelsSettings(BaseModel):
|
|
|
684
684
|
class AiGatewaySettings(BaseModel):
|
|
685
685
|
"""The machine's AI gateway: one OpenAI-compatible listener for app containers.
|
|
686
686
|
|
|
687
|
-
|
|
688
|
-
``
|
|
689
|
-
``
|
|
690
|
-
|
|
691
|
-
|
|
687
|
+
On by default since 0.8.3 (a hosted box has no admin principal to turn it
|
|
688
|
+
on; ``enabled = false`` is the opt-out). The daemon serves it on the models
|
|
689
|
+
bridge (never ``0.0.0.0``: the host comes from ``[models].bridge_host``, not
|
|
690
|
+
from here) at ``port`` and answers 401 without a virtual key. Apps reach it
|
|
691
|
+
through ``[ai.*] provider = "gateway"``; provider keys stay on the machine.
|
|
692
|
+
Every field is captured at startup and requires a restart.
|
|
692
693
|
"""
|
|
693
694
|
|
|
694
|
-
enabled: bool =
|
|
695
|
+
enabled: bool = True
|
|
695
696
|
port: int = Field(default=9330, ge=1024, le=65535)
|
|
696
697
|
upstream_timeout_s: int = Field(default=120, ge=1)
|
|
697
698
|
stream_timeout_s: int = Field(default=600, ge=1)
|
|
@@ -7,8 +7,10 @@ only read and write its SQLite rows, so they answer while the gateway is off
|
|
|
7
7
|
* Reads (any authenticated principal): the state view, the aliases, the key
|
|
8
8
|
metadata and the usage aggregates. No view carries a secret value, a
|
|
9
9
|
virtual key or its hash: an alias shows its `api_key_ref` (a name).
|
|
10
|
-
* Writes
|
|
11
|
-
|
|
10
|
+
* Writes take submitter or admin (0.8.3, D-P31-5): an alias only references a
|
|
11
|
+
shared secret a submitter's own deploy already receives, and a hosted box's
|
|
12
|
+
tunnel principal is submitter-capped. Daemon config stays admin. `PUT` needs
|
|
13
|
+
an `Idempotency-Key`. Audit params carry the
|
|
12
14
|
alias, provider, model, the base_url HOST and the ref name, never a value.
|
|
13
15
|
* `base_url` is the anti-SSRF gate: https to a host that resolves to public
|
|
14
16
|
addresses only, or plain http to loopback / the models bridge (a local
|
|
@@ -29,7 +31,7 @@ from pydantic import BaseModel, Field
|
|
|
29
31
|
from nerdit.config.project import AI_GATEWAY_ALIAS_HINT, AI_GATEWAY_ALIAS_RE, SECRET_REF_RE
|
|
30
32
|
from nerdit.core.jobconfig import parse_job_config
|
|
31
33
|
from nerdit.daemon.audit import audit_params
|
|
32
|
-
from nerdit.daemon.auth import require_role
|
|
34
|
+
from nerdit.daemon.auth import require_owner_or_admin, require_role
|
|
33
35
|
from nerdit.daemon.errors import NerditError
|
|
34
36
|
from nerdit.daemon.schemas._base import StrictRequestModel
|
|
35
37
|
from nerdit.db.enums import JobKind
|
|
@@ -271,12 +273,12 @@ async def list_ai_routes(request: Request) -> AiRouteList:
|
|
|
271
273
|
async def set_ai_route(
|
|
272
274
|
request: Request, alias: str, body: AiRouteSetRequest
|
|
273
275
|
) -> AiRouteWriteResponse:
|
|
274
|
-
"""Create or replace an alias (admin; `Idempotency-Key` required).
|
|
276
|
+
"""Create or replace an alias (submitter or admin; `Idempotency-Key` required).
|
|
275
277
|
|
|
276
278
|
Answers 200 with `enabled: false` while the gateway is off: the alias is
|
|
277
279
|
stored and serves once `[ai_gateway]` is enabled.
|
|
278
280
|
"""
|
|
279
|
-
require_role(request, TokenRole.admin)
|
|
281
|
+
require_role(request, TokenRole.submitter, TokenRole.admin)
|
|
280
282
|
_check_alias(alias)
|
|
281
283
|
host: str | None = None
|
|
282
284
|
ref_key: str | None = None
|
|
@@ -336,8 +338,11 @@ async def remove_ai_route(
|
|
|
336
338
|
alias: str,
|
|
337
339
|
force: bool = Query(False, description="Remove even if a running app uses the alias."),
|
|
338
340
|
) -> dict:
|
|
339
|
-
"""Remove an alias (admin).
|
|
340
|
-
|
|
341
|
+
"""Remove an alias (submitter or admin).
|
|
342
|
+
|
|
343
|
+
409 while a running app's `[ai.*]` uses it, unless `force`.
|
|
344
|
+
"""
|
|
345
|
+
require_role(request, TokenRole.submitter, TokenRole.admin)
|
|
341
346
|
_check_alias(alias)
|
|
342
347
|
request.state.audit_params = audit_params({"alias": alias, "force": force})
|
|
343
348
|
queries = request.app.state.queries
|
|
@@ -373,13 +378,20 @@ async def list_ai_gateway_keys(
|
|
|
373
378
|
operation_id="revoke_ai_gateway_keys",
|
|
374
379
|
)
|
|
375
380
|
async def revoke_ai_gateway_keys(request: Request, service: str) -> AiKeyRevokeResponse:
|
|
376
|
-
"""Revoke a service's virtual keys (
|
|
377
|
-
|
|
381
|
+
"""Revoke a service's virtual keys (its owner or admin).
|
|
382
|
+
|
|
383
|
+
The app gets a new one when it restarts.
|
|
384
|
+
"""
|
|
385
|
+
require_role(request, TokenRole.submitter, TokenRole.admin)
|
|
378
386
|
queries = request.app.state.queries
|
|
379
387
|
# The path value reaches the audit row and the response only once it names a
|
|
380
388
|
# real service: a pasted key or a typo must not be stored or echoed.
|
|
381
|
-
|
|
389
|
+
job = await queries.get_service_by_name(service)
|
|
390
|
+
if job is None:
|
|
382
391
|
raise NerditError(404, "not_found", "No such service.", hint="nerdit ai keys list")
|
|
392
|
+
# A submitter revokes its own apps' keys only (a revoked app answers 401 until
|
|
393
|
+
# it restarts); NULL-owner rows stay admin-only, like every service verb.
|
|
394
|
+
require_owner_or_admin(request, job)
|
|
383
395
|
request.state.audit_params = audit_params({"service": service})
|
|
384
396
|
revoked = await queries.revoke_ai_gateway_keys(service)
|
|
385
397
|
return AiKeyRevokeResponse(service=service, revoked=revoked)
|
|
@@ -111,7 +111,7 @@ async def set_ai_route(
|
|
|
111
111
|
] = None,
|
|
112
112
|
idempotency_key: IdempotencyKey = None,
|
|
113
113
|
) -> Any:
|
|
114
|
-
"""Create or replace a machine AI gateway alias (admin).
|
|
114
|
+
"""Create or replace a machine AI gateway alias (submitter or admin).
|
|
115
115
|
|
|
116
116
|
Apps then declare ``[ai.default] provider = "gateway"`` and
|
|
117
117
|
``model = "<alias>"``: the daemon injects the gateway URL and a per-app
|
|
@@ -140,7 +140,7 @@ async def remove_ai_route(
|
|
|
140
140
|
] = False,
|
|
141
141
|
idempotency_key: IdempotencyKey = None,
|
|
142
142
|
) -> Any:
|
|
143
|
-
"""Remove a machine AI gateway alias (admin).
|
|
143
|
+
"""Remove a machine AI gateway alias (submitter or admin).
|
|
144
144
|
|
|
145
145
|
Refused with 409 ``ai_gateway.alias_in_use`` (naming the apps) while a
|
|
146
146
|
running app's ``[ai.*]`` uses it, unless ``force``.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|