dstack 0.18.39__tar.gz → 0.18.40__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.

Potentially problematic release.


This version of dstack might be problematic. Click here for more details.

Files changed (671) hide show
  1. {dstack-0.18.39 → dstack-0.18.40}/PKG-INFO +6 -7
  2. {dstack-0.18.39 → dstack-0.18.40}/README.md +5 -6
  3. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/configurators/fleet.py +1 -1
  4. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/configurators/gateway.py +10 -1
  5. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/common.py +1 -2
  6. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/configurations.py +21 -0
  7. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/runs.py +1 -0
  8. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/volumes.py +9 -0
  9. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/logs.py +4 -1
  10. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/ssh/attach.py +6 -5
  11. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/models.py +1 -0
  12. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/testing/common.py +2 -0
  13. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/app.py +7 -3
  14. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_submitted_jobs.py +2 -2
  15. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/runner.py +1 -0
  16. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/fleets.py +1 -1
  17. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/base.py +10 -0
  18. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/dev.py +3 -0
  19. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/service.py +3 -0
  20. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/task.py +3 -0
  21. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/repo.py +1 -0
  22. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/services/service_proxy.py +4 -0
  23. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/runs.py +5 -4
  24. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/_public/runs.py +8 -0
  25. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/__init__.py +19 -3
  26. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_runs.py +28 -8
  27. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/version.py +1 -1
  28. {dstack-0.18.39 → dstack-0.18.40}/src/dstack.egg-info/PKG-INFO +6 -7
  29. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/services/test_logs.py +16 -6
  30. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_submitted_jobs.py +74 -1
  31. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_runs.py +4 -0
  32. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/proxy/routers/test_service_proxy.py +39 -0
  33. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/runner/test_client.py +6 -2
  34. {dstack-0.18.39 → dstack-0.18.40}/LICENSE.md +0 -0
  35. {dstack-0.18.39 → dstack-0.18.40}/setup.cfg +0 -0
  36. {dstack-0.18.39 → dstack-0.18.40}/setup.py +0 -0
  37. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/__init__.py +0 -0
  38. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/__init__.py +0 -0
  39. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/__init__.py +0 -0
  40. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/__init__.py +0 -0
  41. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/apply.py +0 -0
  42. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/attach.py +0 -0
  43. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/config.py +0 -0
  44. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/delete.py +0 -0
  45. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/fleet.py +0 -0
  46. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/gateway.py +0 -0
  47. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/init.py +0 -0
  48. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/logs.py +0 -0
  49. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/pool.py +0 -0
  50. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/ps.py +0 -0
  51. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/run.py +0 -0
  52. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/server.py +0 -0
  53. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/stats.py +0 -0
  54. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/stop.py +0 -0
  55. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/commands/volume.py +0 -0
  56. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/main.py +0 -0
  57. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/__init__.py +0 -0
  58. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/args.py +0 -0
  59. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/configurators/__init__.py +0 -0
  60. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/configurators/base.py +0 -0
  61. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/configurators/run.py +0 -0
  62. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/configurators/volume.py +0 -0
  63. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/profile.py +0 -0
  64. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/services/repos.py +0 -0
  65. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/__init__.py +0 -0
  66. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/fleet.py +0 -0
  67. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/gateway.py +0 -0
  68. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/rich.py +0 -0
  69. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/run.py +0 -0
  70. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/updates.py +0 -0
  71. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/cli/utils/volume.py +0 -0
  72. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/compat.py +0 -0
  73. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/__init__.py +0 -0
  74. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/__init__.py +0 -0
  75. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/aws/__init__.py +0 -0
  76. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/aws/auth.py +0 -0
  77. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/aws/compute.py +0 -0
  78. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/aws/config.py +0 -0
  79. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/aws/resources.py +0 -0
  80. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/azure/__init__.py +0 -0
  81. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/azure/auth.py +0 -0
  82. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/azure/compute.py +0 -0
  83. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/azure/config.py +0 -0
  84. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/azure/resources.py +0 -0
  85. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/azure/utils.py +0 -0
  86. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/base/__init__.py +0 -0
  87. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/base/compute.py +0 -0
  88. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/base/config.py +0 -0
  89. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/base/offers.py +0 -0
  90. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/cudo/__init__.py +0 -0
  91. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/cudo/api_client.py +0 -0
  92. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/cudo/compute.py +0 -0
  93. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/cudo/config.py +0 -0
  94. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/datacrunch/__init__.py +0 -0
  95. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/datacrunch/api_client.py +0 -0
  96. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/datacrunch/compute.py +0 -0
  97. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/datacrunch/config.py +0 -0
  98. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/gcp/__init__.py +0 -0
  99. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/gcp/auth.py +0 -0
  100. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/gcp/compute.py +0 -0
  101. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/gcp/config.py +0 -0
  102. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/gcp/resources.py +0 -0
  103. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/kubernetes/__init__.py +0 -0
  104. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/kubernetes/compute.py +0 -0
  105. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/kubernetes/config.py +0 -0
  106. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/kubernetes/utils.py +0 -0
  107. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/lambdalabs/__init__.py +0 -0
  108. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/lambdalabs/api_client.py +0 -0
  109. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/lambdalabs/compute.py +0 -0
  110. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/lambdalabs/config.py +0 -0
  111. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/local/__init__.py +0 -0
  112. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/local/compute.py +0 -0
  113. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/nebius/__init__.py +0 -0
  114. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/nebius/api_client.py +0 -0
  115. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/nebius/compute.py +0 -0
  116. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/nebius/config.py +0 -0
  117. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/nebius/types.py +0 -0
  118. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/__init__.py +0 -0
  119. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/auth.py +0 -0
  120. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/compute.py +0 -0
  121. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/config.py +0 -0
  122. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/exceptions.py +0 -0
  123. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/region.py +0 -0
  124. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/oci/resources.py +0 -0
  125. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/remote/__init__.py +0 -0
  126. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/remote/provisioning.py +0 -0
  127. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/runpod/__init__.py +0 -0
  128. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/runpod/api_client.py +0 -0
  129. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/runpod/compute.py +0 -0
  130. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/runpod/config.py +0 -0
  131. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/tensordock/__init__.py +0 -0
  132. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/tensordock/api_client.py +0 -0
  133. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/tensordock/compute.py +0 -0
  134. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/tensordock/config.py +0 -0
  135. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vastai/__init__.py +0 -0
  136. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vastai/api_client.py +0 -0
  137. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vastai/compute.py +0 -0
  138. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vastai/config.py +0 -0
  139. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vultr/__init__.py +0 -0
  140. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vultr/api_client.py +0 -0
  141. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vultr/compute.py +0 -0
  142. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/backends/vultr/config.py +0 -0
  143. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/consts.py +0 -0
  144. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/errors.py +0 -0
  145. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/__init__.py +0 -0
  146. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/__init__.py +0 -0
  147. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/aws.py +0 -0
  148. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/azure.py +0 -0
  149. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/base.py +0 -0
  150. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/cudo.py +0 -0
  151. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/datacrunch.py +0 -0
  152. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/dstack.py +0 -0
  153. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/gcp.py +0 -0
  154. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/kubernetes.py +0 -0
  155. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/lambdalabs.py +0 -0
  156. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/nebius.py +0 -0
  157. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/oci.py +0 -0
  158. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/runpod.py +0 -0
  159. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/tensordock.py +0 -0
  160. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/vastai.py +0 -0
  161. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/backends/vultr.py +0 -0
  162. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/common.py +0 -0
  163. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/config.py +0 -0
  164. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/envs.py +0 -0
  165. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/fleets.py +0 -0
  166. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/gateways.py +0 -0
  167. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/instances.py +0 -0
  168. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/logs.py +0 -0
  169. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/metrics.py +0 -0
  170. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/placement.py +0 -0
  171. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/pools.py +0 -0
  172. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/profiles.py +0 -0
  173. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/projects.py +0 -0
  174. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/repos/__init__.py +0 -0
  175. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/repos/base.py +0 -0
  176. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/repos/local.py +0 -0
  177. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/repos/remote.py +0 -0
  178. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/repos/virtual.py +0 -0
  179. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/resources.py +0 -0
  180. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/secrets.py +0 -0
  181. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/server.py +0 -0
  182. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/services.py +0 -0
  183. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/unix.py +0 -0
  184. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/models/users.py +0 -0
  185. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/__init__.py +0 -0
  186. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/api_client.py +0 -0
  187. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/configs/__init__.py +0 -0
  188. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/diff.py +0 -0
  189. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/profiles.py +0 -0
  190. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/repos.py +0 -0
  191. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/ssh/__init__.py +0 -0
  192. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/ssh/client.py +0 -0
  193. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/ssh/ports.py +0 -0
  194. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/core/services/ssh/tunnel.py +0 -0
  195. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/__init__.py +0 -0
  196. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/__init__.py +0 -0
  197. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/app.py +0 -0
  198. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/auth.py +0 -0
  199. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/const.py +0 -0
  200. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/deps.py +0 -0
  201. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/main.py +0 -0
  202. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/models.py +0 -0
  203. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/repo/__init__.py +0 -0
  204. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/repo/repo.py +0 -0
  205. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/repo/state_v1.py +0 -0
  206. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/resources/nginx/00-log-format.conf +0 -0
  207. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/resources/nginx/entrypoint.jinja2 +0 -0
  208. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +0 -0
  209. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/routers/__init__.py +0 -0
  210. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/routers/auth.py +0 -0
  211. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/routers/config.py +0 -0
  212. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/routers/registry.py +0 -0
  213. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/routers/stats.py +0 -0
  214. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/schemas/__init__.py +0 -0
  215. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/schemas/common.py +0 -0
  216. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/schemas/config.py +0 -0
  217. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/schemas/registry.py +0 -0
  218. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/schemas/stats.py +0 -0
  219. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/services/__init__.py +0 -0
  220. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/services/nginx.py +0 -0
  221. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/services/registry.py +0 -0
  222. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/services/server_client.py +0 -0
  223. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/services/stats.py +0 -0
  224. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/testing/__init__.py +0 -0
  225. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/gateway/testing/common.py +0 -0
  226. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/__init__.py +0 -0
  227. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/auth.py +0 -0
  228. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/deps.py +0 -0
  229. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/errors.py +0 -0
  230. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/repo.py +0 -0
  231. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/routers/__init__.py +0 -0
  232. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/routers/model_proxy.py +0 -0
  233. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/schemas/__init__.py +0 -0
  234. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/schemas/model_proxy.py +0 -0
  235. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/__init__.py +0 -0
  236. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/model_proxy/__init__.py +0 -0
  237. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/__init__.py +0 -0
  238. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/base.py +0 -0
  239. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/openai.py +0 -0
  240. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/model_proxy/clients/tgi.py +0 -0
  241. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/model_proxy/model_proxy.py +0 -0
  242. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/services/service_connection.py +0 -0
  243. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/testing/__init__.py +0 -0
  244. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/proxy/lib/testing/auth.py +0 -0
  245. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/__init__.py +0 -0
  246. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/__init__.py +0 -0
  247. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/__init__.py +0 -0
  248. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_fleets.py +0 -0
  249. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_gateways.py +0 -0
  250. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_instances.py +0 -0
  251. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_metrics.py +0 -0
  252. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_placement_groups.py +0 -0
  253. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_running_jobs.py +0 -0
  254. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_runs.py +0 -0
  255. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_terminating_jobs.py +0 -0
  256. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/background/tasks/process_volumes.py +0 -0
  257. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/db.py +0 -0
  258. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/deps.py +0 -0
  259. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/main.py +0 -0
  260. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/__init__.py +0 -0
  261. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/env.py +0 -0
  262. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/065588ec72b8_add_vultr_to_backendtype_enum.py +0 -0
  263. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/0e33559e16ed_update_instancestatus.py +0 -0
  264. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/112753bc17dd_remove_nullable_fields.py +0 -0
  265. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/14f2cb002fc2_add_jobmodel_removed_flag.py +0 -0
  266. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/1a48dfe44a40_rework_termination_handling.py +0 -0
  267. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/1e3fb39ef74b_add_remote_connection_details.py +0 -0
  268. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/23e01c56279a_make_blob_nullable.py +0 -0
  269. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/252d3743b641_.py +0 -0
  270. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/27d3e55759fa_add_pools.py +0 -0
  271. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/29826f417010_remove_instancemodel_retry_policy.py +0 -0
  272. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/29c08c6a8cb3_.py +0 -0
  273. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/3cf77fb8bcf1_store_repo_clone_url.py +0 -0
  274. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/3dbdce90d0e0_fix_code_uq_constraint.py +0 -0
  275. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/48ad3ecbaea2_do_not_delete_projects_and_runs.py +0 -0
  276. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/4ae1a5b0e7f1_add_run_list_index.py +0 -0
  277. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/4b4319398164_introduce_runs_processing.py +0 -0
  278. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/54a77e19c64c_add_manager_project_role.py +0 -0
  279. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/555138b1f77f_change_instancemodel_for_asynchronous_.py +0 -0
  280. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/58aa5162dcc3_add_gatewaymodel_configuration.py +0 -0
  281. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/5ad8debc8fe6_fixes_for_psql.py +0 -0
  282. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/5ec538b70e71_replace_instansestatus.py +0 -0
  283. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/686fb8341ea5_add_user_emails.py +0 -0
  284. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/710e5b3fac8f_add_encryption.py +0 -0
  285. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/7b24b1c8eba7_add_instancemodel_last_processed_at.py +0 -0
  286. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/803c7e9ed85d_add_jobmodel_job_runtime_data.py +0 -0
  287. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/82b32a135ea2_.py +0 -0
  288. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/866ec1d67184_replace_retrypolicy_limit_with_.py +0 -0
  289. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/91a12fff6c76_add_repocredsmodel.py +0 -0
  290. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/91ac5e543037_extend_repos_creds_column.py +0 -0
  291. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/98cd9c8b5927_add_volumemodel.py +0 -0
  292. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/99b4c8c954ea_add_termination_reason_message.py +0 -0
  293. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/9eea6af28e10_added_fail_reason_for_instancemodel.py +0 -0
  294. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/__init__.py +0 -0
  295. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/a060e2440936_.py +0 -0
  296. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/a7b46c073fa1_add_placementgroupmodel.py +0 -0
  297. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/afbc600ff2b2_add_created_at_to_usermodel_and_.py +0 -0
  298. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/b4d6ad60db08_add_instancemodel_unreachable.py +0 -0
  299. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/b88d55c2a07d_replace_instancestatus_ready.py +0 -0
  300. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/bfba43f6def2_.py +0 -0
  301. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/c00090eaef21_support_fleets.py +0 -0
  302. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/c154eece89da_add_fields_for_async_gateway_creation.py +0 -0
  303. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/c20626d03cfb_add_jobmetricspoint.py +0 -0
  304. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/c48df7985d57_add_instance_termination_retries.py +0 -0
  305. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/c83d45f9a971_replace_string_with_text.py +0 -0
  306. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/d0bb68e48b9f_add_project_owners_and_quotas.py +0 -0
  307. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/d3e8af4786fa_gateway_compute_flag_deleted.py +0 -0
  308. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/d6b11105f659_add_usermodel_active.py +0 -0
  309. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/da574e93fee0_add_jobmodel_volumes_detached_at.py +0 -0
  310. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/dfffd6a1165c_add_fields_for_gateways_behind_alb.py +0 -0
  311. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/e3b7db07727f_add_gatewaycomputemodel_app_updated_at.py +0 -0
  312. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/e6391ca6a264_separate_gateways_from_compute.py +0 -0
  313. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/ea60480f82bb_add_membermodel_member_num.py +0 -0
  314. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/ed0ca30e13bb_migrate_instancestatus_provisioning.py +0 -0
  315. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/fe72c4de8376_add_gateways.py +0 -0
  316. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/migrations/versions/ffa99edd1988_add_jobterminationreason_max_duration_.py +0 -0
  317. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/models.py +0 -0
  318. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/__init__.py +0 -0
  319. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/backends.py +0 -0
  320. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/fleets.py +0 -0
  321. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/gateways.py +0 -0
  322. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/instances.py +0 -0
  323. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/logs.py +0 -0
  324. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/metrics.py +0 -0
  325. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/pools.py +0 -0
  326. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/projects.py +0 -0
  327. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/repos.py +0 -0
  328. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/runs.py +0 -0
  329. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/secrets.py +0 -0
  330. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/server.py +0 -0
  331. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/users.py +0 -0
  332. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/routers/volumes.py +0 -0
  333. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/__init__.py +0 -0
  334. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/backends.py +0 -0
  335. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/common.py +0 -0
  336. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/fleets.py +0 -0
  337. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/gateways.py +0 -0
  338. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/instances.py +0 -0
  339. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/logs.py +0 -0
  340. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/pools.py +0 -0
  341. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/projects.py +0 -0
  342. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/repos.py +0 -0
  343. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/runs.py +0 -0
  344. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/secrets.py +0 -0
  345. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/users.py +0 -0
  346. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/schemas/volumes.py +0 -0
  347. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/security/__init__.py +0 -0
  348. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/security/permissions.py +0 -0
  349. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/__init__.py +0 -0
  350. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/__init__.py +0 -0
  351. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/__init__.py +0 -0
  352. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/aws.py +0 -0
  353. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/azure.py +0 -0
  354. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/base.py +0 -0
  355. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/cudo.py +0 -0
  356. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/datacrunch.py +0 -0
  357. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/gcp.py +0 -0
  358. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/kubernetes.py +0 -0
  359. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/lambdalabs.py +0 -0
  360. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/nebius.py +0 -0
  361. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/oci.py +0 -0
  362. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/runpod.py +0 -0
  363. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/tensordock.py +0 -0
  364. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/vastai.py +0 -0
  365. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/configurators/vultr.py +0 -0
  366. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/backends/handlers.py +0 -0
  367. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/config.py +0 -0
  368. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/docker.py +0 -0
  369. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/encryption/__init__.py +0 -0
  370. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/encryption/keys/__init__.py +0 -0
  371. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/encryption/keys/aes.py +0 -0
  372. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/encryption/keys/base.py +0 -0
  373. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/encryption/keys/identity.py +0 -0
  374. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/gateways/__init__.py +0 -0
  375. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/gateways/client.py +0 -0
  376. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/gateways/connection.py +0 -0
  377. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/gateways/pool.py +0 -0
  378. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/__init__.py +0 -0
  379. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/__init__.py +0 -0
  380. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/extensions/__init__.py +0 -0
  381. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/extensions/base.py +0 -0
  382. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/jobs/configurators/extensions/vscode.py +0 -0
  383. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/locking.py +0 -0
  384. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/logging.py +0 -0
  385. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/logs.py +0 -0
  386. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/metrics.py +0 -0
  387. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/offers.py +0 -0
  388. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/permissions.py +0 -0
  389. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/placement.py +0 -0
  390. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/pools.py +0 -0
  391. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/projects.py +0 -0
  392. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/__init__.py +0 -0
  393. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/auth.py +0 -0
  394. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/deps.py +0 -0
  395. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/routers/__init__.py +0 -0
  396. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/routers/service_proxy.py +0 -0
  397. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/proxy/services/__init__.py +0 -0
  398. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/repos.py +0 -0
  399. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/runner/__init__.py +0 -0
  400. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/runner/client.py +0 -0
  401. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/runner/ssh.py +0 -0
  402. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/services/__init__.py +0 -0
  403. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/services/autoscalers.py +0 -0
  404. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/services/options.py +0 -0
  405. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/storage.py +0 -0
  406. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/users.py +0 -0
  407. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/services/volumes.py +0 -0
  408. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/settings.py +0 -0
  409. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/00a6e1fb461ed2929fb9.png +0 -0
  410. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/0cae4d9f0a36034984a7.png +0 -0
  411. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/391de232cc0e30cae513.png +0 -0
  412. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/4e0eead8c1a73689ef9d.svg +0 -0
  413. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/544afa2f63428c2235b0.png +0 -0
  414. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/54a4f50f74c6b9381530.svg +0 -0
  415. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/68dd1360a7d2611e0132.svg +0 -0
  416. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/69544b4c81973b54a66f.png +0 -0
  417. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/77a8b02b17af19e39266.png +0 -0
  418. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/83a93a8871c219104367.svg +0 -0
  419. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/8f28bb8e9999e5e6a48b.svg +0 -0
  420. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/9124086961ab8c366bc4.svg +0 -0
  421. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/9a9ebaeb54b025dbac0a.svg +0 -0
  422. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/a3428392dc534f3b15c4.svg +0 -0
  423. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/ae22625574d69361f72c.png +0 -0
  424. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-144x144.png +0 -0
  425. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-192x192.png +0 -0
  426. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-256x256.png +0 -0
  427. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-36x36.png +0 -0
  428. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-384x384.png +0 -0
  429. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-48x48.png +0 -0
  430. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-512x512.png +0 -0
  431. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-72x72.png +0 -0
  432. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/android-chrome-96x96.png +0 -0
  433. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-1024x1024.png +0 -0
  434. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-114x114.png +0 -0
  435. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-120x120.png +0 -0
  436. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-144x144.png +0 -0
  437. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-152x152.png +0 -0
  438. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-167x167.png +0 -0
  439. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-180x180.png +0 -0
  440. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-57x57.png +0 -0
  441. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-60x60.png +0 -0
  442. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-72x72.png +0 -0
  443. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-76x76.png +0 -0
  444. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon-precomposed.png +0 -0
  445. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-icon.png +0 -0
  446. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1125x2436.png +0 -0
  447. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1136x640.png +0 -0
  448. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1170x2532.png +0 -0
  449. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1179x2556.png +0 -0
  450. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2208.png +0 -0
  451. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2688.png +0 -0
  452. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1284x2778.png +0 -0
  453. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1290x2796.png +0 -0
  454. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1334x750.png +0 -0
  455. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1488x2266.png +0 -0
  456. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1536x2048.png +0 -0
  457. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1620x2160.png +0 -0
  458. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1640x2160.png +0 -0
  459. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2224.png +0 -0
  460. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2388.png +0 -0
  461. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-1792x828.png +0 -0
  462. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x1536.png +0 -0
  463. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x2732.png +0 -0
  464. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1620.png +0 -0
  465. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1640.png +0 -0
  466. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2208x1242.png +0 -0
  467. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2224x1668.png +0 -0
  468. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2266x1488.png +0 -0
  469. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2388x1668.png +0 -0
  470. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2436x1125.png +0 -0
  471. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2532x1170.png +0 -0
  472. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2556x1179.png +0 -0
  473. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2688x1242.png +0 -0
  474. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2732x2048.png +0 -0
  475. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2778x1284.png +0 -0
  476. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-2796x1290.png +0 -0
  477. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-640x1136.png +0 -0
  478. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-750x1334.png +0 -0
  479. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/apple-touch-startup-image-828x1792.png +0 -0
  480. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/browserconfig.xml +0 -0
  481. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/favicon-16x16.png +0 -0
  482. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/favicon-32x32.png +0 -0
  483. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/favicon-48x48.png +0 -0
  484. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/favicon.ico +0 -0
  485. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/manifest.webmanifest +0 -0
  486. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/mstile-144x144.png +0 -0
  487. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/mstile-150x150.png +0 -0
  488. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/mstile-310x150.png +0 -0
  489. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/mstile-310x310.png +0 -0
  490. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/mstile-70x70.png +0 -0
  491. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/yandex-browser-50x50.png +0 -0
  492. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/assets/yandex-browser-manifest.json +0 -0
  493. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/b7ae68f44193474fc578.png +0 -0
  494. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/d2f008c75b2b5b191f3f.png +0 -0
  495. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/d44c33e1b92e05c379fd.png +0 -0
  496. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/dd43ff0552815179d7ab.png +0 -0
  497. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/dd4e7166c0b9aac197d7.png +0 -0
  498. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/e30b27916930d43d2271.png +0 -0
  499. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/e467d7d60aae81ab198b.svg +0 -0
  500. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/eb9b344b73818fe2b71a.png +0 -0
  501. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/f517dd626eb964120de0.png +0 -0
  502. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/f958aecddee5d8e3222c.png +0 -0
  503. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/index.html +0 -0
  504. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/main-11ec5e4a00ea6ec833e3.js +0 -0
  505. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/main-11ec5e4a00ea6ec833e3.js.map +0 -0
  506. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/main-fc56d1f4af8e57522a1c.css +0 -0
  507. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/manifest.json +0 -0
  508. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/robots.txt +0 -0
  509. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/static/media/github.1f7102513534c83a9d8d735d2b8c12a2.svg +0 -0
  510. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/static/media/logo.f602feeb138844eda97c8cb641461448.svg +0 -0
  511. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/static/media/okta.12f178e6873a1100965f2a4dbd18fcec.svg +0 -0
  512. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/statics/static/media/theme.3994c817bb7dda191c1c9640dee0bf42.svg +0 -0
  513. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/testing/__init__.py +0 -0
  514. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/testing/common.py +0 -0
  515. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/testing/conf.py +0 -0
  516. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/utils/__init__.py +0 -0
  517. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/utils/common.py +0 -0
  518. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/utils/logging.py +0 -0
  519. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/server/utils/routers.py +0 -0
  520. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/settings.py +0 -0
  521. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/__init__.py +0 -0
  522. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/common.py +0 -0
  523. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/crypto.py +0 -0
  524. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/dxf.py +0 -0
  525. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/gpu.py +0 -0
  526. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/hash.py +0 -0
  527. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/ignore.py +0 -0
  528. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/interpolator.py +0 -0
  529. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/logging.py +0 -0
  530. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/network.py +0 -0
  531. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/path.py +0 -0
  532. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/random_names.py +0 -0
  533. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/_internal/utils/ssh.py +0 -0
  534. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/__init__.py +0 -0
  535. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/_public/__init__.py +0 -0
  536. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/_public/backends.py +0 -0
  537. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/_public/pools.py +0 -0
  538. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/_public/repos.py +0 -0
  539. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/_public/resources.py +0 -0
  540. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/huggingface/__init__.py +0 -0
  541. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_backends.py +0 -0
  542. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_fleets.py +0 -0
  543. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_gateways.py +0 -0
  544. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_group.py +0 -0
  545. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_logs.py +0 -0
  546. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_metrics.py +0 -0
  547. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_pools.py +0 -0
  548. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_projects.py +0 -0
  549. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_repos.py +0 -0
  550. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_secrets.py +0 -0
  551. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_users.py +0 -0
  552. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/_volumes.py +0 -0
  553. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/server/utils.py +0 -0
  554. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/api/utils.py +0 -0
  555. {dstack-0.18.39 → dstack-0.18.40}/src/dstack/core/__init__.py +0 -0
  556. {dstack-0.18.39 → dstack-0.18.40}/src/dstack.egg-info/SOURCES.txt +0 -0
  557. {dstack-0.18.39 → dstack-0.18.40}/src/dstack.egg-info/dependency_links.txt +0 -0
  558. {dstack-0.18.39 → dstack-0.18.40}/src/dstack.egg-info/entry_points.txt +0 -0
  559. {dstack-0.18.39 → dstack-0.18.40}/src/dstack.egg-info/requires.txt +0 -0
  560. {dstack-0.18.39 → dstack-0.18.40}/src/dstack.egg-info/top_level.txt +0 -0
  561. {dstack-0.18.39 → dstack-0.18.40}/src/tests/__init__.py +0 -0
  562. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/__init__.py +0 -0
  563. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/__init__.py +0 -0
  564. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/commands/__init__.py +0 -0
  565. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/commands/test_config.py +0 -0
  566. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/commands/test_dstack.py +0 -0
  567. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/common.py +0 -0
  568. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/services/__init__.py +0 -0
  569. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/services/configurators/__init__.py +0 -0
  570. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/services/configurators/test_fleet.py +0 -0
  571. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/services/configurators/test_profile.py +0 -0
  572. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/cli/services/configurators/test_run.py +0 -0
  573. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/__init__.py +0 -0
  574. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/__init__.py +0 -0
  575. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/aws/__init__.py +0 -0
  576. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/aws/test_resources.py +0 -0
  577. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/azure/__init__.py +0 -0
  578. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/azure/test_compute.py +0 -0
  579. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/azure/test_resources.py +0 -0
  580. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/gcp/__init__.py +0 -0
  581. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/gcp/test_resources.py +0 -0
  582. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/kubernetes/__init__.py +0 -0
  583. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/kubernetes/test_compute.py +0 -0
  584. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/oci/__init__.py +0 -0
  585. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/backends/oci/test_resources.py +0 -0
  586. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/__init__.py +0 -0
  587. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/repos/__init__.py +0 -0
  588. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/repos/test_remote.py +0 -0
  589. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/test_configurations.py +0 -0
  590. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/test_instances.py +0 -0
  591. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/test_resources.py +0 -0
  592. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/test_runs.py +0 -0
  593. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/test_unix.py +0 -0
  594. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/models/test_volumes.py +0 -0
  595. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/services/__init__.py +0 -0
  596. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/services/ssh/__init__.py +0 -0
  597. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/services/ssh/test_client.py +0 -0
  598. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/core/services/ssh/test_tunnel.py +0 -0
  599. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/__init__.py +0 -0
  600. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/__init__.py +0 -0
  601. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/conftest.py +0 -0
  602. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/repo/__init__.py +0 -0
  603. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/repo/test_repo.py +0 -0
  604. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/repo/test_state_v1.py +0 -0
  605. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/routers/__init__.py +0 -0
  606. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/routers/test_registry.py +0 -0
  607. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/routers/test_stats.py +0 -0
  608. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/services/__init__.py +0 -0
  609. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/services/test_stats.py +0 -0
  610. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/gateway/test_app.py +0 -0
  611. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/lib/__init__.py +0 -0
  612. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/lib/routers/__init__.py +0 -0
  613. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/proxy/lib/routers/test_model_proxy.py +0 -0
  614. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/__init__.py +0 -0
  615. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/__init__.py +0 -0
  616. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/__init__.py +0 -0
  617. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_fleets.py +0 -0
  618. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_gateways.py +0 -0
  619. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_instances.py +0 -0
  620. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_metrics.py +0 -0
  621. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_placement_groups.py +0 -0
  622. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_running_jobs.py +0 -0
  623. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_runs.py +0 -0
  624. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_submitted_volumes.py +0 -0
  625. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/background/tasks/test_process_terminating_jobs.py +0 -0
  626. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/conftest.py +0 -0
  627. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/__init__.py +0 -0
  628. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_backends.py +0 -0
  629. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_fleets.py +0 -0
  630. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_gateways.py +0 -0
  631. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_instances.py +0 -0
  632. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_logs.py +0 -0
  633. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_metrics.py +0 -0
  634. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_pools.py +0 -0
  635. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_projects.py +0 -0
  636. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_repos.py +0 -0
  637. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_server.py +0 -0
  638. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_users.py +0 -0
  639. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/routers/test_volumes.py +0 -0
  640. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/__init__.py +0 -0
  641. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/encryption/__init__.py +0 -0
  642. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/encryption/keys/__init__.py +0 -0
  643. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/encryption/keys/test_aes.py +0 -0
  644. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/encryption/test_encryption.py +0 -0
  645. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/proxy/__init__.py +0 -0
  646. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/proxy/routers/__init__.py +0 -0
  647. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/runner/__init__.py +0 -0
  648. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/services/__init__.py +0 -0
  649. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/services/test_autoscalers.py +0 -0
  650. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_config.py +0 -0
  651. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_docker.py +0 -0
  652. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_fleets.py +0 -0
  653. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_logs.py +0 -0
  654. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_pools.py +0 -0
  655. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_repos.py +0 -0
  656. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/services/test_runs.py +0 -0
  657. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/test_app.py +0 -0
  658. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/test_migrations.py +0 -0
  659. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/utils/__init__.py +0 -0
  660. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/utils/test_common.py +0 -0
  661. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/server/utils/test_routers.py +0 -0
  662. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/__init__.py +0 -0
  663. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/test_common.py +0 -0
  664. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/test_gpu.py +0 -0
  665. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/test_interpolator.py +0 -0
  666. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/test_network.py +0 -0
  667. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/test_path.py +0 -0
  668. {dstack-0.18.39 → dstack-0.18.40}/src/tests/_internal/utils/test_ssh.py +0 -0
  669. {dstack-0.18.39 → dstack-0.18.40}/src/tests/api/__init__.py +0 -0
  670. {dstack-0.18.39 → dstack-0.18.40}/src/tests/api/test_utils.py +0 -0
  671. {dstack-0.18.39 → dstack-0.18.40}/src/tests/conftest.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dstack
3
- Version: 0.18.39
3
+ Version: 0.18.40
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Home-page: https://dstack.ai
6
6
  Author: Andrey Cheptsov
@@ -48,17 +48,16 @@ for AI workloads both in the cloud and on-prem, speeding up the development, tra
48
48
 
49
49
  #### Accelerators
50
50
 
51
- `dstack` supports `NVIDIA GPU`, `AMD GPU`, and `Google Cloud TPU` out of the box.
51
+ `dstack` supports `NVIDIA`, `AMD`, `Google TPU`, and `Intel Gaudi` accelerators out of the box.
52
52
 
53
53
  ## Major news ✨
54
54
 
55
- - [2025/01] [dstack 0.18.35: Vultr backend](https://github.com/dstackai/dstack/releases/tag/0.18.35)
56
- - [2024/12] [dstack 0.18.33: TPU v6e support](https://github.com/dstackai/dstack/releases/tag/0.18.33)
55
+ - [2025/01] [dstack 0.18.38: Intel Gaudi](https://github.com/dstackai/dstack/releases/tag/0.18.38)
56
+ - [2025/01] [dstack 0.18.35: Vultr](https://github.com/dstackai/dstack/releases/tag/0.18.35)
57
+ - [2024/12] [dstack 0.18.32: TPU v6e](https://github.com/dstackai/dstack/releases/tag/0.18.32)
57
58
  - [2024/12] [dstack 0.18.30: AWS Capacity Reservations and Capacity Blocks](https://github.com/dstackai/dstack/releases/tag/0.18.30)
58
- - [2024/11] [dstack 0.18.23: Gateway is optional](https://github.com/dstackai/dstack/releases/tag/0.18.23)
59
59
  - [2024/10] [dstack 0.18.21: Instance volumes](https://github.com/dstackai/dstack/releases/tag/0.18.21)
60
- - [2024/10] [dstack 0.18.18: Hardware metrics](https://github.com/dstackai/dstack/releases/tag/0.18.18)
61
- - [2024/10] [dstack 0.18.17: AMD support with SSH fleets, AWS EFA](https://github.com/dstackai/dstack/releases/tag/0.18.17)
60
+ - [2024/10] [dstack 0.18.18: Hardware metrics monitoring](https://github.com/dstackai/dstack/releases/tag/0.18.18)
62
61
 
63
62
  ## Installation
64
63
 
@@ -21,17 +21,16 @@ for AI workloads both in the cloud and on-prem, speeding up the development, tra
21
21
 
22
22
  #### Accelerators
23
23
 
24
- `dstack` supports `NVIDIA GPU`, `AMD GPU`, and `Google Cloud TPU` out of the box.
24
+ `dstack` supports `NVIDIA`, `AMD`, `Google TPU`, and `Intel Gaudi` accelerators out of the box.
25
25
 
26
26
  ## Major news ✨
27
27
 
28
- - [2025/01] [dstack 0.18.35: Vultr backend](https://github.com/dstackai/dstack/releases/tag/0.18.35)
29
- - [2024/12] [dstack 0.18.33: TPU v6e support](https://github.com/dstackai/dstack/releases/tag/0.18.33)
28
+ - [2025/01] [dstack 0.18.38: Intel Gaudi](https://github.com/dstackai/dstack/releases/tag/0.18.38)
29
+ - [2025/01] [dstack 0.18.35: Vultr](https://github.com/dstackai/dstack/releases/tag/0.18.35)
30
+ - [2024/12] [dstack 0.18.32: TPU v6e](https://github.com/dstackai/dstack/releases/tag/0.18.32)
30
31
  - [2024/12] [dstack 0.18.30: AWS Capacity Reservations and Capacity Blocks](https://github.com/dstackai/dstack/releases/tag/0.18.30)
31
- - [2024/11] [dstack 0.18.23: Gateway is optional](https://github.com/dstackai/dstack/releases/tag/0.18.23)
32
32
  - [2024/10] [dstack 0.18.21: Instance volumes](https://github.com/dstackai/dstack/releases/tag/0.18.21)
33
- - [2024/10] [dstack 0.18.18: Hardware metrics](https://github.com/dstackai/dstack/releases/tag/0.18.18)
34
- - [2024/10] [dstack 0.18.17: AMD support with SSH fleets, AWS EFA](https://github.com/dstackai/dstack/releases/tag/0.18.17)
33
+ - [2024/10] [dstack 0.18.18: Hardware metrics monitoring](https://github.com/dstackai/dstack/releases/tag/0.18.18)
35
34
 
36
35
  ## Installation
37
36
 
@@ -353,7 +353,7 @@ def _print_plan_header(plan: FleetPlan):
353
353
  f"${plan.max_offer_price:g} max[/]"
354
354
  )
355
355
  console.print()
356
- else:
356
+ elif fleet_type == "cloud":
357
357
  console.print(NO_OFFERS_WARNING)
358
358
 
359
359
 
@@ -22,6 +22,7 @@ from dstack._internal.core.models.gateways import (
22
22
  GatewayStatus,
23
23
  )
24
24
  from dstack._internal.core.models.repos.base import Repo
25
+ from dstack._internal.core.services.diff import diff_models
25
26
  from dstack._internal.utils.common import local_time
26
27
  from dstack.api._public import Client
27
28
 
@@ -56,7 +57,15 @@ class GatewayConfigurator(BaseApplyConfigurator):
56
57
  confirm_message += "Create the gateway?"
57
58
  else:
58
59
  action_message += f"Found gateway [code]{plan.spec.configuration.name}[/]."
59
- if plan.current_resource.configuration == plan.spec.configuration:
60
+ diff = diff_models(
61
+ plan.spec.configuration,
62
+ plan.current_resource.configuration,
63
+ )
64
+ changed_fields = list(diff.keys())
65
+ if (
66
+ plan.current_resource.configuration == plan.spec.configuration
67
+ or changed_fields == ["default"]
68
+ ):
60
69
  if command_args.yes and not command_args.force:
61
70
  # --force is required only with --yes,
62
71
  # otherwise we may ask for force apply interactively.
@@ -25,8 +25,7 @@ LIVE_TABLE_REFRESH_RATE_PER_SEC = 1
25
25
  LIVE_TABLE_PROVISION_INTERVAL_SECS = 2
26
26
  NO_OFFERS_WARNING = (
27
27
  "[warning]"
28
- "Could not find instance offers that match your requirements."
29
- " Please check the requirements table above or visit the troubleshooting guide:"
28
+ "No matching instance offers available. Possible reasons:"
30
29
  " https://dstack.ai/docs/guides/troubleshooting/#no-offers"
31
30
  "[/]\n"
32
31
  )
@@ -21,6 +21,7 @@ from dstack._internal.core.models.volumes import MountPoint, VolumeConfiguration
21
21
  CommandsList = List[str]
22
22
  ValidPort = conint(gt=0, le=65536)
23
23
  SERVICE_HTTPS_DEFAULT = True
24
+ STRIP_PREFIX_DEFAULT = True
24
25
 
25
26
 
26
27
  class RunConfigurationType(str, Enum):
@@ -130,6 +131,16 @@ class BaseRunConfiguration(CoreModel):
130
131
  description="Use image with NVIDIA CUDA Compiler (NVCC) included. Mutually exclusive with `image`"
131
132
  ),
132
133
  ]
134
+ single_branch: Annotated[
135
+ Optional[bool],
136
+ Field(
137
+ description=(
138
+ "Whether to clone and track only the current branch or all remote branches."
139
+ " Relevant only when using remote Git repos."
140
+ " Defaults to `false` for dev environments and to `true` for tasks and services"
141
+ )
142
+ ),
143
+ ] = None
133
144
  env: Annotated[
134
145
  Env,
135
146
  Field(description="The mapping or the list of environment variables"),
@@ -236,6 +247,16 @@ class ServiceConfigurationParams(CoreModel):
236
247
  ),
237
248
  ),
238
249
  ] = None
250
+ strip_prefix: Annotated[
251
+ bool,
252
+ Field(
253
+ description=(
254
+ "Strip the `/proxy/services/<project name>/<run name>/` path prefix"
255
+ " when forwarding requests to the service. Only takes effect"
256
+ " when running the service without a gateway"
257
+ )
258
+ ),
259
+ ] = STRIP_PREFIX_DEFAULT
239
260
  model: Annotated[
240
261
  Optional[Union[AnyModel, str]],
241
262
  Field(
@@ -184,6 +184,7 @@ class JobSpec(CoreModel):
184
184
  home_dir: Optional[str]
185
185
  image_name: str
186
186
  privileged: bool = False
187
+ single_branch: Optional[bool] = None
187
188
  max_duration: Optional[int]
188
189
  stop_duration: Optional[int] = None
189
190
  registry_auth: Optional[RegistryAuth]
@@ -136,6 +136,15 @@ class VolumeMountPoint(CoreModel):
136
136
  class InstanceMountPoint(CoreModel):
137
137
  instance_path: Annotated[str, Field(description="The absolute path on the instance (host)")]
138
138
  path: Annotated[str, Field(description="The absolute path in the container")]
139
+ optional: Annotated[
140
+ bool,
141
+ Field(
142
+ description=(
143
+ "Allow running without this volume"
144
+ " in backends that do not support instance volumes"
145
+ ),
146
+ ),
147
+ ] = False
139
148
 
140
149
  _validate_instance_path = validator("instance_path", allow_reuse=True)(
141
150
  _validate_mount_point_path
@@ -42,11 +42,14 @@ class URLReplacer:
42
42
  qs = {k: v[0] for k, v in urllib.parse.parse_qs(url.query).items()}
43
43
  if app_spec and app_spec.url_query_params is not None:
44
44
  qs.update({k.encode(): v.encode() for k, v in app_spec.url_query_params.items()})
45
+ path = url.path
46
+ if not path.startswith(self.path_prefix.removesuffix(b"/")):
47
+ path = concat_url_path(self.path_prefix, path)
45
48
 
46
49
  url = url._replace(
47
50
  scheme=("https" if self.secure else "http").encode(),
48
51
  netloc=(self.hostname if omit_port else f"{self.hostname}:{local_port}").encode(),
49
- path=concat_url_path(self.path_prefix, url.path),
52
+ path=path,
50
53
  query=urllib.parse.urlencode(qs).encode(),
51
54
  )
52
55
  return url.geturl()
@@ -56,6 +56,7 @@ class SSHAttach:
56
56
  ssh_port: int,
57
57
  container_ssh_port: int,
58
58
  user: str,
59
+ container_user: str,
59
60
  id_rsa_path: PathLike,
60
61
  ports_lock: PortsLock,
61
62
  run_name: str,
@@ -74,7 +75,7 @@ class SSHAttach:
74
75
  self.control_sock_path = FilePath(control_sock_path)
75
76
  self.identity_file = FilePath(id_rsa_path)
76
77
  self.tunnel = SSHTunnel(
77
- destination=run_name,
78
+ destination=f"root@{run_name}",
78
79
  identity=self.identity_file,
79
80
  forwarded_sockets=ports_to_forwarded_sockets(
80
81
  ports=self.ports,
@@ -91,7 +92,7 @@ class SSHAttach:
91
92
  self.host_config = {
92
93
  "HostName": hostname,
93
94
  "Port": ssh_port,
94
- "User": user,
95
+ "User": user if dockerized else container_user,
95
96
  "IdentityFile": self.identity_file,
96
97
  "IdentitiesOnly": "yes",
97
98
  "StrictHostKeyChecking": "no",
@@ -111,7 +112,7 @@ class SSHAttach:
111
112
  self.container_config = {
112
113
  "HostName": "localhost",
113
114
  "Port": container_ssh_port,
114
- "User": "root", # TODO(#1535): support non-root images properly
115
+ "User": container_user,
115
116
  "IdentityFile": self.identity_file,
116
117
  "IdentitiesOnly": "yes",
117
118
  "StrictHostKeyChecking": "no",
@@ -122,7 +123,7 @@ class SSHAttach:
122
123
  self.container_config = {
123
124
  "HostName": hostname,
124
125
  "Port": ssh_port,
125
- "User": user,
126
+ "User": container_user,
126
127
  "IdentityFile": self.identity_file,
127
128
  "IdentitiesOnly": "yes",
128
129
  "StrictHostKeyChecking": "no",
@@ -136,7 +137,7 @@ class SSHAttach:
136
137
  self.host_config = {
137
138
  "HostName": hostname,
138
139
  "Port": container_ssh_port,
139
- "User": "root", # TODO(#1535): support non-root images properly
140
+ "User": container_user,
140
141
  "IdentityFile": self.identity_file,
141
142
  "IdentitiesOnly": "yes",
142
143
  "StrictHostKeyChecking": "no",
@@ -32,6 +32,7 @@ class Service(ImmutableModel):
32
32
  https: Optional[bool] # only used on gateways
33
33
  auth: bool
34
34
  client_max_body_size: int # only enforced on gateways
35
+ strip_prefix: bool = True # only used in-server
35
36
  replicas: tuple[Replica, ...]
36
37
 
37
38
  @property
@@ -29,6 +29,7 @@ def make_service(
29
29
  domain: Optional[str] = None,
30
30
  https: Optional[bool] = None,
31
31
  auth: bool = False,
32
+ strip_prefix: bool = True,
32
33
  ) -> Service:
33
34
  return Service(
34
35
  project_name=project_name,
@@ -37,6 +38,7 @@ def make_service(
37
38
  https=https,
38
39
  auth=auth,
39
40
  client_max_body_size=2**20,
41
+ strip_prefix=strip_prefix,
40
42
  replicas=(
41
43
  Replica(
42
44
  id="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
@@ -7,7 +7,7 @@ from pathlib import Path
7
7
  from typing import Awaitable, Callable, List
8
8
 
9
9
  import sentry_sdk
10
- from fastapi import FastAPI, Request, status
10
+ from fastapi import FastAPI, Request, Response, status
11
11
  from fastapi.datastructures import URL
12
12
  from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse
13
13
  from fastapi.staticfiles import StaticFiles
@@ -215,10 +215,14 @@ def register_routes(app: FastAPI, ui: bool = True):
215
215
  @app.middleware("http")
216
216
  async def log_request(request: Request, call_next):
217
217
  start_time = time.time()
218
- response = await call_next(request)
218
+ response: Response = await call_next(request)
219
219
  process_time = time.time() - start_time
220
220
  logger.debug(
221
- "Processed request %s %s in %s", request.method, request.url, f"{process_time:0.6f}s"
221
+ "Processed request %s %s in %s. Status: %s",
222
+ request.method,
223
+ request.url,
224
+ f"{process_time:0.6f}s",
225
+ response.status_code,
222
226
  )
223
227
  return response
224
228
 
@@ -64,7 +64,7 @@ from dstack._internal.server.services.pools import (
64
64
  )
65
65
  from dstack._internal.server.services.runs import (
66
66
  check_can_attach_run_volumes,
67
- check_run_spec_has_instance_mounts,
67
+ check_run_spec_requires_instance_mounts,
68
68
  get_offer_volumes,
69
69
  get_run_volume_models,
70
70
  get_run_volumes,
@@ -418,7 +418,7 @@ async def _run_job_on_new_instance(
418
418
  master_job_provisioning_data=master_job_provisioning_data,
419
419
  volumes=volumes,
420
420
  privileged=job.job_spec.privileged,
421
- instance_mounts=check_run_spec_has_instance_mounts(run.run_spec),
421
+ instance_mounts=check_run_spec_requires_instance_mounts(run.run_spec),
422
422
  )
423
423
  # Limit number of offers tried to prevent long-running processing
424
424
  # in case all offers fail.
@@ -61,6 +61,7 @@ class SubmitBody(CoreModel):
61
61
  "entrypoint",
62
62
  "env",
63
63
  "gateway",
64
+ "single_branch",
64
65
  "max_duration",
65
66
  "working_dir",
66
67
  }
@@ -239,7 +239,6 @@ async def get_plan(
239
239
  user: UserModel,
240
240
  spec: FleetSpec,
241
241
  ) -> FleetPlan:
242
- # TODO: refactor offers logic into a separate module to avoid depending on runs
243
242
  current_fleet: Optional[Fleet] = None
244
243
  current_fleet_id: Optional[uuid.UUID] = None
245
244
  if spec.configuration.name is not None:
@@ -259,6 +258,7 @@ async def get_plan(
259
258
  requirements=_get_fleet_requirements(spec),
260
259
  )
261
260
  offers = [offer for _, offer in offers_with_backends]
261
+ _remove_fleet_spec_sensitive_info(spec)
262
262
  plan = FleetPlan(
263
263
  project_name=project.name,
264
264
  user=user.name,
@@ -63,6 +63,10 @@ class JobConfigurator(ABC):
63
63
  def _shell_commands(self) -> List[str]:
64
64
  pass
65
65
 
66
+ @abstractmethod
67
+ def _default_single_branch(self) -> bool:
68
+ pass
69
+
66
70
  @abstractmethod
67
71
  def _default_max_duration(self) -> Optional[int]:
68
72
  pass
@@ -104,6 +108,7 @@ class JobConfigurator(ABC):
104
108
  image_name=self._image_name(),
105
109
  user=await self._user(),
106
110
  privileged=self._privileged(),
111
+ single_branch=self._single_branch(),
107
112
  max_duration=self._max_duration(),
108
113
  stop_duration=self._stop_duration(),
109
114
  registry_auth=self._registry_auth(),
@@ -172,6 +177,11 @@ class JobConfigurator(ABC):
172
177
  def _privileged(self) -> bool:
173
178
  return self.run_spec.configuration.privileged
174
179
 
180
+ def _single_branch(self) -> bool:
181
+ if self.run_spec.configuration.single_branch is None:
182
+ return self._default_single_branch()
183
+ return self.run_spec.configuration.single_branch
184
+
175
185
  def _max_duration(self) -> Optional[int]:
176
186
  if self.run_spec.merged_profile.max_duration in [None, True]:
177
187
  return self._default_max_duration()
@@ -40,6 +40,9 @@ class DevEnvironmentJobConfigurator(JobConfigurator):
40
40
  commands += ["tail -f /dev/null"] # idle
41
41
  return commands
42
42
 
43
+ def _default_single_branch(self) -> bool:
44
+ return False
45
+
43
46
  def _default_max_duration(self) -> Optional[int]:
44
47
  return DEFAULT_MAX_DURATION_SECONDS
45
48
 
@@ -11,6 +11,9 @@ class ServiceJobConfigurator(JobConfigurator):
11
11
  def _shell_commands(self) -> List[str]:
12
12
  return self.run_spec.configuration.commands
13
13
 
14
+ def _default_single_branch(self) -> bool:
15
+ return True
16
+
14
17
  def _default_max_duration(self) -> Optional[int]:
15
18
  return None
16
19
 
@@ -25,6 +25,9 @@ class TaskJobConfigurator(JobConfigurator):
25
25
  def _shell_commands(self) -> List[str]:
26
26
  return self.run_spec.configuration.commands
27
27
 
28
+ def _default_single_branch(self) -> bool:
29
+ return True
30
+
28
31
  def _default_max_duration(self) -> Optional[int]:
29
32
  return DEFAULT_MAX_DURATION_SECONDS
30
33
 
@@ -98,6 +98,7 @@ class ServerProxyRepo(BaseProxyRepo):
98
98
  https=None,
99
99
  auth=run_spec.configuration.auth,
100
100
  client_max_body_size=DEFAULT_SERVICE_CLIENT_MAX_BODY_SIZE,
101
+ strip_prefix=run_spec.configuration.strip_prefix,
101
102
  replicas=tuple(replicas),
102
103
  )
103
104
 
@@ -12,6 +12,7 @@ from dstack._internal.proxy.lib.services.service_connection import (
12
12
  ServiceConnectionPool,
13
13
  get_service_replica_client,
14
14
  )
15
+ from dstack._internal.utils.common import concat_url_path
15
16
  from dstack._internal.utils.logging import get_logger
16
17
 
17
18
  logger = get_logger(__name__)
@@ -37,6 +38,9 @@ async def proxy(
37
38
 
38
39
  client = await get_service_replica_client(service, repo, service_conn_pool)
39
40
 
41
+ if not service.strip_prefix:
42
+ path = concat_url_path(request.scope.get("root_path", "/"), request.url.path)
43
+
40
44
  try:
41
45
  upstream_request = await build_upstream_request(request, path, client)
42
46
  except ClientDisconnect:
@@ -330,7 +330,7 @@ async def get_plan(
330
330
  multinode=jobs[0].job_spec.jobs_per_replica > 1,
331
331
  volumes=volumes,
332
332
  privileged=jobs[0].job_spec.privileged,
333
- instance_mounts=check_run_spec_has_instance_mounts(run_spec),
333
+ instance_mounts=check_run_spec_requires_instance_mounts(run_spec),
334
334
  )
335
335
 
336
336
  job_plans = []
@@ -897,9 +897,10 @@ def get_offer_mount_point_volume(
897
897
  raise ServerClientError("Failed to find an eligible volume for the mount point")
898
898
 
899
899
 
900
- def check_run_spec_has_instance_mounts(run_spec: RunSpec) -> bool:
900
+ def check_run_spec_requires_instance_mounts(run_spec: RunSpec) -> bool:
901
901
  return any(
902
- is_core_model_instance(mp, InstanceMountPoint) for mp in run_spec.configuration.volumes
902
+ is_core_model_instance(mp, InstanceMountPoint) and not mp.optional
903
+ for mp in run_spec.configuration.volumes
903
904
  )
904
905
 
905
906
 
@@ -967,7 +968,7 @@ def _validate_run_spec_and_set_defaults(run_spec: RunSpec):
967
968
  _UPDATABLE_SPEC_FIELDS = ["repo_code_hash", "configuration"]
968
969
  # Most service fields can be updated via replica redeployment.
969
970
  # TODO: Allow updating other fields when a rolling deployment is supported.
970
- _UPDATABLE_CONFIGURATION_FIELDS = ["replicas", "scaling"]
971
+ _UPDATABLE_CONFIGURATION_FIELDS = ["replicas", "scaling", "strip_prefix"]
971
972
 
972
973
 
973
974
  def _can_update_run_spec(current_run_spec: RunSpec, new_run_spec: RunSpec) -> bool:
@@ -324,11 +324,19 @@ class Run(ABC):
324
324
  if runtime_data is not None and runtime_data.ports is not None:
325
325
  container_ssh_port = runtime_data.ports.get(container_ssh_port, container_ssh_port)
326
326
 
327
+ # TODO: get login name from runner in case it's not specified in the run configuration
328
+ # (i.e. the default image user is used, and it is not root)
329
+ if job.job_spec.user is not None and job.job_spec.user.username is not None:
330
+ container_user = job.job_spec.user.username
331
+ else:
332
+ container_user = "root"
333
+
327
334
  self._ssh_attach = SSHAttach(
328
335
  hostname=provisioning_data.hostname,
329
336
  ssh_port=provisioning_data.ssh_port,
330
337
  container_ssh_port=container_ssh_port,
331
338
  user=provisioning_data.username,
339
+ container_user=container_user,
332
340
  id_rsa_path=ssh_identity_file,
333
341
  ports_lock=self._ports_lock,
334
342
  run_name=name,
@@ -133,9 +133,16 @@ class APIClient:
133
133
  else:
134
134
  raise ClientError(f"Failed to connect to dstack server {self._base_url}")
135
135
 
136
+ if 400 <= resp.status_code < 600:
137
+ logger.debug(
138
+ "Error requesting %s. Status: %s. Headers: %s. Body: %s",
139
+ resp.request.url,
140
+ resp.status_code,
141
+ resp.headers,
142
+ resp.content,
143
+ )
144
+
136
145
  if raise_for_status:
137
- if resp.status_code == 500:
138
- raise ClientError("Unexpected dstack server error")
139
146
  if resp.status_code == 400: # raise ServerClientError
140
147
  detail: List[Dict] = resp.json()["detail"]
141
148
  if len(detail) == 1 and detail[0]["code"] in _server_client_errors:
@@ -145,7 +152,16 @@ class APIClient:
145
152
  if resp.status_code == 422:
146
153
  formatted_error = pprint.pformat(resp.json())
147
154
  raise ClientError(f"Server validation error: \n{formatted_error}")
148
- resp.raise_for_status()
155
+ if resp.status_code == 403:
156
+ raise ClientError(
157
+ f"Access to {resp.request.url} is denied. Please check your access token"
158
+ )
159
+ if 400 <= resp.status_code < 600:
160
+ raise ClientError(
161
+ f"Unexpected error: status code {resp.status_code}"
162
+ f" when requesting {resp.request.url}."
163
+ " Check server logs or run with DSTACK_CLI_LOG_LEVEL=DEBUG to see more details"
164
+ )
149
165
  return resp
150
166
 
151
167
 
@@ -1,9 +1,14 @@
1
1
  from datetime import datetime
2
- from typing import List, Optional, Union
2
+ from typing import Any, List, Optional, Union
3
3
  from uuid import UUID
4
4
 
5
5
  from pydantic import parse_obj_as
6
6
 
7
+ from dstack._internal.core.models.common import is_core_model_instance
8
+ from dstack._internal.core.models.configurations import (
9
+ STRIP_PREFIX_DEFAULT,
10
+ ServiceConfiguration,
11
+ )
7
12
  from dstack._internal.core.models.pools import Instance
8
13
  from dstack._internal.core.models.profiles import Profile
9
14
  from dstack._internal.core.models.runs import (
@@ -14,6 +19,7 @@ from dstack._internal.core.models.runs import (
14
19
  RunPlan,
15
20
  RunSpec,
16
21
  )
22
+ from dstack._internal.core.models.volumes import InstanceMountPoint
17
23
  from dstack._internal.server.schemas.runs import (
18
24
  ApplyRunPlanRequest,
19
25
  CreateInstanceRequest,
@@ -117,34 +123,48 @@ class RunsAPIClient(APIClientGroup):
117
123
 
118
124
  def _get_run_spec_excludes(run_spec: RunSpec) -> Optional[dict]:
119
125
  spec_excludes: dict[str, set[str]] = {}
120
- configuration_excludes: set[str] = set()
126
+ configuration_excludes: dict[str, Any] = {}
121
127
  profile_excludes: set[str] = set()
122
128
  configuration = run_spec.configuration
123
129
  profile = run_spec.profile
124
130
 
125
131
  # client >= 0.18.18 / server <= 0.18.17 compatibility tweak
126
132
  if not configuration.privileged:
127
- configuration_excludes.add("privileged")
133
+ configuration_excludes["privileged"] = True
128
134
  # client >= 0.18.23 / server <= 0.18.22 compatibility tweak
129
135
  if configuration.type == "service" and configuration.gateway is None:
130
- configuration_excludes.add("gateway")
136
+ configuration_excludes["gateway"] = True
131
137
  # client >= 0.18.30 / server <= 0.18.29 compatibility tweak
132
138
  if run_spec.configuration.user is None:
133
- configuration_excludes.add("user")
139
+ configuration_excludes["user"] = True
134
140
  # client >= 0.18.30 / server <= 0.18.29 compatibility tweak
135
141
  if configuration.reservation is None:
136
- configuration_excludes.add("reservation")
142
+ configuration_excludes["reservation"] = True
137
143
  if profile is not None and profile.reservation is None:
138
144
  profile_excludes.add("reservation")
139
145
  if configuration.idle_duration is None:
140
- configuration_excludes.add("idle_duration")
146
+ configuration_excludes["idle_duration"] = True
141
147
  if profile is not None and profile.idle_duration is None:
142
148
  profile_excludes.add("idle_duration")
143
149
  # client >= 0.18.38 / server <= 0.18.37 compatibility tweak
144
150
  if configuration.stop_duration is None:
145
- configuration_excludes.add("stop_duration")
151
+ configuration_excludes["stop_duration"] = True
146
152
  if profile is not None and profile.stop_duration is None:
147
153
  profile_excludes.add("stop_duration")
154
+ # client >= 0.18.40 / server <= 0.18.39 compatibility tweak
155
+ if (
156
+ is_core_model_instance(configuration, ServiceConfiguration)
157
+ and configuration.strip_prefix == STRIP_PREFIX_DEFAULT
158
+ ):
159
+ configuration_excludes["strip_prefix"] = True
160
+ if configuration.single_branch is None:
161
+ configuration_excludes["single_branch"] = True
162
+ if all(
163
+ not is_core_model_instance(v, InstanceMountPoint) or not v.optional
164
+ for v in configuration.volumes
165
+ ):
166
+ configuration_excludes["volumes"] = {"__all__": {"optional"}}
167
+
148
168
  if configuration_excludes:
149
169
  spec_excludes["configuration"] = configuration_excludes
150
170
  if profile_excludes:
@@ -1,3 +1,3 @@
1
- __version__ = "0.18.39"
1
+ __version__ = "0.18.40"
2
2
  __is_release__ = True
3
3
  base_image = "0.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dstack
3
- Version: 0.18.39
3
+ Version: 0.18.40
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Home-page: https://dstack.ai
6
6
  Author: Andrey Cheptsov
@@ -48,17 +48,16 @@ for AI workloads both in the cloud and on-prem, speeding up the development, tra
48
48
 
49
49
  #### Accelerators
50
50
 
51
- `dstack` supports `NVIDIA GPU`, `AMD GPU`, and `Google Cloud TPU` out of the box.
51
+ `dstack` supports `NVIDIA`, `AMD`, `Google TPU`, and `Intel Gaudi` accelerators out of the box.
52
52
 
53
53
  ## Major news ✨
54
54
 
55
- - [2025/01] [dstack 0.18.35: Vultr backend](https://github.com/dstackai/dstack/releases/tag/0.18.35)
56
- - [2024/12] [dstack 0.18.33: TPU v6e support](https://github.com/dstackai/dstack/releases/tag/0.18.33)
55
+ - [2025/01] [dstack 0.18.38: Intel Gaudi](https://github.com/dstackai/dstack/releases/tag/0.18.38)
56
+ - [2025/01] [dstack 0.18.35: Vultr](https://github.com/dstackai/dstack/releases/tag/0.18.35)
57
+ - [2024/12] [dstack 0.18.32: TPU v6e](https://github.com/dstackai/dstack/releases/tag/0.18.32)
57
58
  - [2024/12] [dstack 0.18.30: AWS Capacity Reservations and Capacity Blocks](https://github.com/dstackai/dstack/releases/tag/0.18.30)
58
- - [2024/11] [dstack 0.18.23: Gateway is optional](https://github.com/dstackai/dstack/releases/tag/0.18.23)
59
59
  - [2024/10] [dstack 0.18.21: Instance volumes](https://github.com/dstackai/dstack/releases/tag/0.18.21)
60
- - [2024/10] [dstack 0.18.18: Hardware metrics](https://github.com/dstackai/dstack/releases/tag/0.18.18)
61
- - [2024/10] [dstack 0.18.17: AMD support with SSH fleets, AWS EFA](https://github.com/dstackai/dstack/releases/tag/0.18.17)
60
+ - [2024/10] [dstack 0.18.18: Hardware metrics monitoring](https://github.com/dstackai/dstack/releases/tag/0.18.18)
62
61
 
63
62
  ## Installation
64
63