nerdit 0.8.2__tar.gz → 0.8.4__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.4}/PKG-INFO +4 -4
- {nerdit-0.8.2 → nerdit-0.8.4}/README.md +3 -3
- {nerdit-0.8.2 → nerdit-0.8.4}/pyproject.toml +1 -1
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/__init__.py +1 -1
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/ai.py +5 -4
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/settings.py +7 -6
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/ai_gateway.py +22 -10
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/secrets.py +5 -5
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/secret_scope.py +8 -4
- nerdit-0.8.2/src/nerdit/daemon/web/dist/assets/index-BZxXG41K.js → nerdit-0.8.4/src/nerdit/daemon/web/dist/assets/index-DYi0MWJD.js +17 -17
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/index.html +1 -1
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/SecretsPanel.tsx +13 -3
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Settings.tsx +8 -4
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/20-command-palette.spec.ts +19 -9
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/ai_gateway.py +2 -2
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/secrets.py +3 -4
- {nerdit-0.8.2 → nerdit-0.8.4}/.gitignore +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/LICENSE +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/NOTICE +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/__main__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/app.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/checks.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/client.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/apply.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/backup.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/capabilities.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/check_deps.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/connect.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/daemon.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/db.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/dev.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/diagnose.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/doctor.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/exit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/init.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/link.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/logs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/mcp.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/routes.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/secrets.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/serve.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/share.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/store.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/token.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/trust.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/uninstall.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/update.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/vars.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/display.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/upload.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_templates/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_templates/builtin.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_templates/loader.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/build.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/defaults.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/project.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/redaction.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/store.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/app.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/keys.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/app_build.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/backup.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/bindings/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/bindings/registry.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/bindings/secretref.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/builder.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/cutover.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/backend.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/binding.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/controller.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/deploy_state.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/discovery.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/dns.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/eventlog.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/gitsource.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/gitwatch.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/health.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/jobconfig.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/launch.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/apps.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/capability.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/client.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/frames.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/hosted.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/identity.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/manager.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/mux.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/backend.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/binding.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/controller.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/monitor.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/node_packages.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/node_runtime.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/notify.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/project_identity.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/admin.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/certs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/edgeauth.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/manager.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/routing.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/supervisor.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/tls.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/remediation_settle.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/resources/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/resources/controller.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/retention.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/container.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/docker.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/protocol.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/stub.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/sandbox.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/secrets.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/sweeper.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/variables.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/volumes.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/workload.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/appfactory.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/auth.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/bodylimit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/bootstrap.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/deploy_pipeline.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/errors.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/idempotency.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/imagegc.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/lifecycle.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/limits.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/middleware.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/project_delegation.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/remediation.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/_resources.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/app_config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/app_templates.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/auth.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/cluster.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/databases.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/gpus.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/health.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/images.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/link.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_diagnose.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_logs_stream.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_run.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_stats.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_wait.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/share.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/tokens.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/_base.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/cluster.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/databases.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/exposure.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/gpus.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/health.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/license.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/link.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/proxy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_diagnose.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_purge.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_run.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_stats.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_wait.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/tokens.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/server.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/service_purge.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/sse.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/sweeps.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/uploads.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/views/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/views/hosted.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/views/service.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/index-CLfzcEzV.css +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/eslint.config.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/index.html +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/package-lock.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/package.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/playwright.config.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/postcss.config.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/auditStream.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/client.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/client.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/clusterEvents.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/queries.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/queries.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/types.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/AuthGate.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/AuthGate.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/CommandPalette.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ConfigurePanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DaemonStatusBanner.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DeployDialog.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DeployProgress.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DiagnosePanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/Dropzone.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ErrorBoundary.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServiceLogsPanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServicePublicUrl.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServiceShareCard.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServiceShareCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/TemplateDeployDialog.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ToastViewport.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/UnlinkedBanner.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/UnlinkedBanner.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/AiEndpointFields.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/BindingSwitch.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/GenericBindingsPanel.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/KeyFlow.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/sections.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/useBindingDraft.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/AppearanceCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/DiskCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/DoctorCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/GpuCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/HostnameCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/ProxyStatusCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/RoutesCard.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ui.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ui.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/aiProviders.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/analytics.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/apiErrors.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/apiErrors.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/auth.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/bindings.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/bindings.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/deployPhase.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/format.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/format.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/projects.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/projects.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/sse.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/sse.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/status.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/status.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/theme.test.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/theme.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/main.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Audit.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Databases.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Login.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Login.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Models.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectDetail.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectPage.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectPage.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectPolling.test.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Projects.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ServiceRedirect.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Tokens.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/shell/AppShell.tsx +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/shell/navItems.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/state/toastStore.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/styles/globals.css +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tailwind.config.js +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/01-login-and-overview.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/05-services.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/06-models.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/07-audit.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/08-secrets.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/10-settings.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/11-configure.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/12-deploy.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/13-bindings.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/14-responsive-shell.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/17-projects.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/18-navigation.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/19-project-page.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/21-tokens.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/22-system-cards.spec.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/fixtures.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tsconfig.json +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tsconfig.tsbuildinfo +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/vite.config.ts +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/database.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/enums.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/_base.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/ai_gateway.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/audit.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/domains.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/endpoints.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/events.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/gpus.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/idempotency.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/logs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/secret_claims.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/service_config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/shares.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/tokens.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/workloads.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/rows.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/errors.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/server.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/_shared.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/cluster.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/config.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/databases.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/deploy.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/exposure.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/models.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/projects.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/services.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/system.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/workspaces.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/transport.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/__init__.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/certs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/disk.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/frozen.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/fs.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/ids.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/install_layout.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/logging.py +0 -0
- {nerdit-0.8.2 → nerdit-0.8.4}/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.4
|
|
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.4/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.4/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.4/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.4/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.4/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.4/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)
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Reads list names only; values are injected at container launch, never returned.
|
|
4
4
|
Writes require scope/role authorization, idempotency and redacted auditing.
|
|
5
|
-
Shared scope maps to _shared storage:
|
|
6
|
-
principal may read names. A rowless
|
|
7
|
-
(`daemon/secret_scope.py`): the first
|
|
8
|
-
deploy consumes it. Key rotation is
|
|
9
|
-
Mounted under /api only.
|
|
5
|
+
Shared scope maps to _shared storage: a submitter or admin sets values (0.8.4),
|
|
6
|
+
only admins delete them, any authenticated principal may read names. A rowless
|
|
7
|
+
name is authorized through its claim (`daemon/secret_scope.py`): the first
|
|
8
|
+
write reserves it for the caller until a deploy consumes it. Key rotation is
|
|
9
|
+
admin-only and audits counts only. Mounted under /api only.
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
from __future__ import annotations
|
|
@@ -221,8 +221,12 @@ async def authorize_secret_scope(
|
|
|
221
221
|
for the caller — unless an orphan secrets file is present, which a non-admin
|
|
222
222
|
may not adopt (409 `secret.orphaned_scope`) — and a read or delete is a
|
|
223
223
|
404 for non-admins. `write` is the mutation gate on `shared`, which skips
|
|
224
|
-
row lookup:
|
|
225
|
-
shared
|
|
224
|
+
row lookup: a set (`mint`) takes submitter or admin (0.8.4, D-P31-5: a
|
|
225
|
+
shared value is what every deploy already receives, and a hosted box's
|
|
226
|
+
console writes its AI gateway keys here through the submitter-capped
|
|
227
|
+
tunnel), a delete removes what other apps use and stays admin, any
|
|
228
|
+
authenticated caller reads names; refuse all shared operations if a legacy
|
|
229
|
+
service owns that name.
|
|
226
230
|
"""
|
|
227
231
|
guard_name(service)
|
|
228
232
|
if service == _SHARED_PUBLIC:
|
|
@@ -234,8 +238,8 @@ async def authorize_secret_scope(
|
|
|
234
238
|
"shared-scope secrets are disabled.",
|
|
235
239
|
hint="Rename or delete that service, then restart the daemon.",
|
|
236
240
|
)
|
|
237
|
-
if write:
|
|
238
|
-
require_role(request, TokenRole.admin)
|
|
241
|
+
if write: # a set (`mint`) is submitter-or-admin; a delete stays admin
|
|
242
|
+
require_role(request, *((TokenRole.submitter,) if mint else ()), TokenRole.admin)
|
|
239
243
|
return
|
|
240
244
|
# `/secrets/{service}` passes no `project` (label-only); the variables
|
|
241
245
|
# routes pass the project they already judged (D-P40-7).
|