nerdit 0.7.0__tar.gz → 0.7.2__tar.gz

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