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.
Files changed (380) hide show
  1. {nerdit-0.8.2 → nerdit-0.8.4}/PKG-INFO +4 -4
  2. {nerdit-0.8.2 → nerdit-0.8.4}/README.md +3 -3
  3. {nerdit-0.8.2 → nerdit-0.8.4}/pyproject.toml +1 -1
  4. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/__init__.py +1 -1
  5. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/ai.py +5 -4
  6. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/settings.py +7 -6
  7. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/ai_gateway.py +22 -10
  8. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/secrets.py +5 -5
  9. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/secret_scope.py +8 -4
  10. 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
  11. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/index.html +1 -1
  12. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/SecretsPanel.tsx +13 -3
  13. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Settings.tsx +8 -4
  14. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/20-command-palette.spec.ts +19 -9
  15. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/ai_gateway.py +2 -2
  16. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/secrets.py +3 -4
  17. {nerdit-0.8.2 → nerdit-0.8.4}/.gitignore +0 -0
  18. {nerdit-0.8.2 → nerdit-0.8.4}/LICENSE +0 -0
  19. {nerdit-0.8.2 → nerdit-0.8.4}/NOTICE +0 -0
  20. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/__main__.py +0 -0
  21. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/__init__.py +0 -0
  22. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/app.py +0 -0
  23. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/checks.py +0 -0
  24. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/client.py +0 -0
  25. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/__init__.py +0 -0
  26. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/apply.py +0 -0
  27. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/backup.py +0 -0
  28. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/capabilities.py +0 -0
  29. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/check_deps.py +0 -0
  30. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/config.py +0 -0
  31. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/connect.py +0 -0
  32. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/daemon.py +0 -0
  33. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/db.py +0 -0
  34. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/deploy.py +0 -0
  35. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/dev.py +0 -0
  36. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/diagnose.py +0 -0
  37. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/doctor.py +0 -0
  38. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/domains.py +0 -0
  39. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/events.py +0 -0
  40. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/exit.py +0 -0
  41. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/init.py +0 -0
  42. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/license.py +0 -0
  43. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/link.py +0 -0
  44. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/logs.py +0 -0
  45. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/mcp.py +0 -0
  46. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/models.py +0 -0
  47. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/projects.py +0 -0
  48. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/proxy.py +0 -0
  49. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/routes.py +0 -0
  50. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/secrets.py +0 -0
  51. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/serve.py +0 -0
  52. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/services.py +0 -0
  53. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/share.py +0 -0
  54. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/store.py +0 -0
  55. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/system.py +0 -0
  56. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/token.py +0 -0
  57. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/trust.py +0 -0
  58. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/uninstall.py +0 -0
  59. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/update.py +0 -0
  60. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/commands/vars.py +0 -0
  61. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/display.py +0 -0
  62. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/cli/upload.py +0 -0
  63. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/__init__.py +0 -0
  64. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_config.py +0 -0
  65. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_templates/__init__.py +0 -0
  66. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_templates/builtin.json +0 -0
  67. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/app_templates/loader.py +0 -0
  68. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/build.py +0 -0
  69. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/defaults.py +0 -0
  70. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/project.py +0 -0
  71. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/redaction.py +0 -0
  72. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/config/store.py +0 -0
  73. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/__init__.py +0 -0
  74. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/__init__.py +0 -0
  75. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/app.py +0 -0
  76. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/keys.py +0 -0
  77. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/ai_gateway/proxy.py +0 -0
  78. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/app_build.py +0 -0
  79. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/backup.py +0 -0
  80. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/bindings/__init__.py +0 -0
  81. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/bindings/registry.py +0 -0
  82. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/bindings/secretref.py +0 -0
  83. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/builder.py +0 -0
  84. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/cutover.py +0 -0
  85. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/__init__.py +0 -0
  86. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/backend.py +0 -0
  87. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/binding.py +0 -0
  88. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/data/controller.py +0 -0
  89. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/deploy_state.py +0 -0
  90. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/discovery.py +0 -0
  91. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/dns.py +0 -0
  92. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/eventlog.py +0 -0
  93. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/events.py +0 -0
  94. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/gitsource.py +0 -0
  95. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/gitwatch.py +0 -0
  96. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/health.py +0 -0
  97. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/jobconfig.py +0 -0
  98. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/launch.py +0 -0
  99. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/license.py +0 -0
  100. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/__init__.py +0 -0
  101. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/apps.py +0 -0
  102. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/capability.py +0 -0
  103. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/client.py +0 -0
  104. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/frames.py +0 -0
  105. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/hosted.py +0 -0
  106. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/identity.py +0 -0
  107. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/manager.py +0 -0
  108. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/link/mux.py +0 -0
  109. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/__init__.py +0 -0
  110. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/backend.py +0 -0
  111. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/binding.py +0 -0
  112. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/models/controller.py +0 -0
  113. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/monitor.py +0 -0
  114. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/node_packages.py +0 -0
  115. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/node_runtime.py +0 -0
  116. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/notify.py +0 -0
  117. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/project_identity.py +0 -0
  118. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/__init__.py +0 -0
  119. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/admin.py +0 -0
  120. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/certs.py +0 -0
  121. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/domains.py +0 -0
  122. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/edgeauth.py +0 -0
  123. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/manager.py +0 -0
  124. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/routing.py +0 -0
  125. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/supervisor.py +0 -0
  126. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/proxy/tls.py +0 -0
  127. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/remediation_settle.py +0 -0
  128. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/resources/__init__.py +0 -0
  129. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/resources/controller.py +0 -0
  130. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/retention.py +0 -0
  131. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/__init__.py +0 -0
  132. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/container.py +0 -0
  133. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/docker.py +0 -0
  134. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/protocol.py +0 -0
  135. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/runtime/stub.py +0 -0
  136. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/sandbox.py +0 -0
  137. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/secrets.py +0 -0
  138. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/services.py +0 -0
  139. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/sweeper.py +0 -0
  140. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/variables.py +0 -0
  141. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/volumes.py +0 -0
  142. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/workload.py +0 -0
  143. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/core/workspaces.py +0 -0
  144. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/__init__.py +0 -0
  145. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/appfactory.py +0 -0
  146. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/audit.py +0 -0
  147. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/auth.py +0 -0
  148. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/bodylimit.py +0 -0
  149. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/bootstrap.py +0 -0
  150. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/deploy_pipeline.py +0 -0
  151. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/errors.py +0 -0
  152. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/idempotency.py +0 -0
  153. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/imagegc.py +0 -0
  154. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/lifecycle.py +0 -0
  155. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/limits.py +0 -0
  156. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/middleware.py +0 -0
  157. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/project_delegation.py +0 -0
  158. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/remediation.py +0 -0
  159. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/__init__.py +0 -0
  160. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/_resources.py +0 -0
  161. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/app_config.py +0 -0
  162. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/app_templates.py +0 -0
  163. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/audit.py +0 -0
  164. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/auth.py +0 -0
  165. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/cluster.py +0 -0
  166. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/config.py +0 -0
  167. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/databases.py +0 -0
  168. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/deploy.py +0 -0
  169. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/domains.py +0 -0
  170. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/events.py +0 -0
  171. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/gpus.py +0 -0
  172. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/health.py +0 -0
  173. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/images.py +0 -0
  174. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/license.py +0 -0
  175. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/link.py +0 -0
  176. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/models.py +0 -0
  177. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/projects.py +0 -0
  178. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/proxy.py +0 -0
  179. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_diagnose.py +0 -0
  180. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_logs_stream.py +0 -0
  181. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_run.py +0 -0
  182. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_stats.py +0 -0
  183. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/service_wait.py +0 -0
  184. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/services.py +0 -0
  185. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/share.py +0 -0
  186. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/system.py +0 -0
  187. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/tokens.py +0 -0
  188. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/routes/workspaces.py +0 -0
  189. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/__init__.py +0 -0
  190. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/_base.py +0 -0
  191. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/audit.py +0 -0
  192. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/cluster.py +0 -0
  193. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/config.py +0 -0
  194. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/databases.py +0 -0
  195. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/deploy.py +0 -0
  196. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/events.py +0 -0
  197. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/exposure.py +0 -0
  198. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/gpus.py +0 -0
  199. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/health.py +0 -0
  200. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/license.py +0 -0
  201. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/link.py +0 -0
  202. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/models.py +0 -0
  203. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/proxy.py +0 -0
  204. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_diagnose.py +0 -0
  205. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_purge.py +0 -0
  206. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_run.py +0 -0
  207. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_stats.py +0 -0
  208. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/service_wait.py +0 -0
  209. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/services.py +0 -0
  210. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/system.py +0 -0
  211. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/tokens.py +0 -0
  212. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/schemas/workspaces.py +0 -0
  213. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/server.py +0 -0
  214. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/service_purge.py +0 -0
  215. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/sse.py +0 -0
  216. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/sweeps.py +0 -0
  217. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/uploads.py +0 -0
  218. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/views/__init__.py +0 -0
  219. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/views/hosted.py +0 -0
  220. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/views/service.py +0 -0
  221. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  222. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  223. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  224. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  225. {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
  226. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  227. {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
  228. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  229. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  230. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  231. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  232. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/dist/assets/index-CLfzcEzV.css +0 -0
  233. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/eslint.config.js +0 -0
  234. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/index.html +0 -0
  235. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/package-lock.json +0 -0
  236. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/package.json +0 -0
  237. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/playwright.config.ts +0 -0
  238. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/postcss.config.js +0 -0
  239. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/auditStream.ts +0 -0
  240. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/client.test.ts +0 -0
  241. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/client.ts +0 -0
  242. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/clusterEvents.ts +0 -0
  243. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/queries.test.ts +0 -0
  244. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/queries.ts +0 -0
  245. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/api/types.ts +0 -0
  246. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/AuthGate.test.tsx +0 -0
  247. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/AuthGate.tsx +0 -0
  248. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/CommandPalette.tsx +0 -0
  249. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ConfigurePanel.tsx +0 -0
  250. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DaemonStatusBanner.tsx +0 -0
  251. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DeployDialog.tsx +0 -0
  252. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DeployProgress.tsx +0 -0
  253. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/DiagnosePanel.tsx +0 -0
  254. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/Dropzone.tsx +0 -0
  255. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ErrorBoundary.tsx +0 -0
  256. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServiceLogsPanel.tsx +0 -0
  257. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServicePublicUrl.tsx +0 -0
  258. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServiceShareCard.test.tsx +0 -0
  259. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ServiceShareCard.tsx +0 -0
  260. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/TemplateDeployDialog.tsx +0 -0
  261. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ToastViewport.tsx +0 -0
  262. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/UnlinkedBanner.test.tsx +0 -0
  263. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/UnlinkedBanner.tsx +0 -0
  264. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/AiEndpointFields.tsx +0 -0
  265. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/BindingSwitch.tsx +0 -0
  266. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/GenericBindingsPanel.tsx +0 -0
  267. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/KeyFlow.tsx +0 -0
  268. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/sections.tsx +0 -0
  269. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/bindings/useBindingDraft.ts +0 -0
  270. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/AppearanceCard.tsx +0 -0
  271. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/DiskCard.tsx +0 -0
  272. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/DoctorCard.tsx +0 -0
  273. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/GpuCard.tsx +0 -0
  274. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/HostnameCard.tsx +0 -0
  275. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/ProxyStatusCard.tsx +0 -0
  276. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/settings/RoutesCard.tsx +0 -0
  277. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ui.test.tsx +0 -0
  278. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/components/ui.tsx +0 -0
  279. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/aiProviders.ts +0 -0
  280. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/analytics.ts +0 -0
  281. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/apiErrors.test.ts +0 -0
  282. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/apiErrors.ts +0 -0
  283. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/auth.ts +0 -0
  284. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/bindings.test.ts +0 -0
  285. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/bindings.ts +0 -0
  286. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/deployPhase.ts +0 -0
  287. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/format.test.ts +0 -0
  288. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/format.ts +0 -0
  289. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/projects.test.ts +0 -0
  290. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/projects.ts +0 -0
  291. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/sse.test.ts +0 -0
  292. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/sse.ts +0 -0
  293. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/status.test.ts +0 -0
  294. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/status.ts +0 -0
  295. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/theme.test.ts +0 -0
  296. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/lib/theme.ts +0 -0
  297. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/main.tsx +0 -0
  298. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Audit.tsx +0 -0
  299. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Databases.tsx +0 -0
  300. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Login.test.tsx +0 -0
  301. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Login.tsx +0 -0
  302. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Models.tsx +0 -0
  303. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectDetail.tsx +0 -0
  304. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectPage.test.tsx +0 -0
  305. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectPage.tsx +0 -0
  306. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ProjectPolling.test.tsx +0 -0
  307. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Projects.tsx +0 -0
  308. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/ServiceRedirect.tsx +0 -0
  309. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/pages/Tokens.tsx +0 -0
  310. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/shell/AppShell.tsx +0 -0
  311. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/shell/navItems.ts +0 -0
  312. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/state/toastStore.ts +0 -0
  313. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/src/styles/globals.css +0 -0
  314. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tailwind.config.js +0 -0
  315. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/01-login-and-overview.spec.ts +0 -0
  316. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/05-services.spec.ts +0 -0
  317. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/06-models.spec.ts +0 -0
  318. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/07-audit.spec.ts +0 -0
  319. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/08-secrets.spec.ts +0 -0
  320. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/10-settings.spec.ts +0 -0
  321. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/11-configure.spec.ts +0 -0
  322. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/12-deploy.spec.ts +0 -0
  323. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/13-bindings.spec.ts +0 -0
  324. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/14-responsive-shell.spec.ts +0 -0
  325. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/17-projects.spec.ts +0 -0
  326. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/18-navigation.spec.ts +0 -0
  327. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/19-project-page.spec.ts +0 -0
  328. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/21-tokens.spec.ts +0 -0
  329. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/22-system-cards.spec.ts +0 -0
  330. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tests/e2e/fixtures.ts +0 -0
  331. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tsconfig.json +0 -0
  332. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/tsconfig.tsbuildinfo +0 -0
  333. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/daemon/web/vite.config.ts +0 -0
  334. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/__init__.py +0 -0
  335. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/database.py +0 -0
  336. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/enums.py +0 -0
  337. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/models.py +0 -0
  338. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/__init__.py +0 -0
  339. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/_base.py +0 -0
  340. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/ai_gateway.py +0 -0
  341. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/audit.py +0 -0
  342. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/domains.py +0 -0
  343. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/endpoints.py +0 -0
  344. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/events.py +0 -0
  345. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/gpus.py +0 -0
  346. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/idempotency.py +0 -0
  347. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/logs.py +0 -0
  348. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/projects.py +0 -0
  349. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/secret_claims.py +0 -0
  350. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/service_config.py +0 -0
  351. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/services.py +0 -0
  352. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/shares.py +0 -0
  353. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/tokens.py +0 -0
  354. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/queries/workloads.py +0 -0
  355. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/db/rows.py +0 -0
  356. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/__init__.py +0 -0
  357. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/errors.py +0 -0
  358. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/server.py +0 -0
  359. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/__init__.py +0 -0
  360. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/_shared.py +0 -0
  361. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/cluster.py +0 -0
  362. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/config.py +0 -0
  363. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/databases.py +0 -0
  364. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/deploy.py +0 -0
  365. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/exposure.py +0 -0
  366. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/models.py +0 -0
  367. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/projects.py +0 -0
  368. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/services.py +0 -0
  369. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/system.py +0 -0
  370. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/tools/workspaces.py +0 -0
  371. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/mcp/transport.py +0 -0
  372. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/__init__.py +0 -0
  373. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/certs.py +0 -0
  374. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/disk.py +0 -0
  375. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/frozen.py +0 -0
  376. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/fs.py +0 -0
  377. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/ids.py +0 -0
  378. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/install_layout.py +0 -0
  379. {nerdit-0.8.2 → nerdit-0.8.4}/src/nerdit/utils/logging.py +0 -0
  380. {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.2
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.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.8.2/NOTICE).
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.2/CONTRIBUTING.md)
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.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.8.2/NOTICE).
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.2/CONTRIBUTING.md)
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.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nerdit"
7
- version = "0.8.2"
7
+ version = "0.8.4"
8
8
  description = "The local AI PaaS — deploy and operate apps on your own hardware, with first-class local AI"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Nerdit — Le moteur de l'IA locale."""
2
2
 
3
- __version__ = "0.8.2"
3
+ __version__ = "0.8.4"
@@ -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 are admin-only and mint an idempotency key.
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
- Off by default; when on, the daemon serves it on the models bridge (never
688
- ``0.0.0.0``: the host comes from ``[models].bridge_host``, not from here) at
689
- ``port``. Apps reach it through ``[ai.*] provider = "gateway"`` with a
690
- per-service virtual key; provider keys stay on the machine. Every field is
691
- captured at startup and requires a restart.
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 = False
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 are admin-only: an alias is machine-wide and spends the machine's
11
- provider keys. `PUT` needs an `Idempotency-Key`. Audit params carry the
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). 409 while a running app's `[ai.*]` uses it, unless `force`."""
340
- require_role(request, TokenRole.admin)
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 (admin); the app gets a new one when it restarts."""
377
- require_role(request, TokenRole.admin)
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
- if await queries.get_service_by_name(service) is None:
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: only admins write it, any authenticated
6
- principal may read names. A rowless name is authorized through its claim
7
- (`daemon/secret_scope.py`): the first write reserves it for the caller until a
8
- deploy consumes it. Key rotation is admin-only and audits counts only.
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: admins write, any authenticated caller reads names; refuse all
225
- shared operations if a legacy service owns that name.
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).