dstack 0.19.11rc1__py3-none-any.whl → 0.19.11rc2__py3-none-any.whl

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.

File without changes
@@ -0,0 +1,18 @@
1
+ # ruff: noqa: F401
2
+ from dstack.plugins.builtin.rest_plugin._models import (
3
+ FleetSpecRequest,
4
+ FleetSpecResponse,
5
+ GatewaySpecRequest,
6
+ GatewaySpecResponse,
7
+ RunSpecRequest,
8
+ RunSpecResponse,
9
+ SpecApplyRequest,
10
+ SpecApplyResponse,
11
+ VolumeSpecRequest,
12
+ VolumeSpecResponse,
13
+ )
14
+ from dstack.plugins.builtin.rest_plugin._plugin import (
15
+ PLUGIN_SERVICE_URI_ENV_VAR_NAME,
16
+ CustomApplyPolicy,
17
+ RESTPlugin,
18
+ )
@@ -0,0 +1,48 @@
1
+ from typing import Generic, Optional, TypeVar
2
+
3
+ from pydantic import BaseModel, Field
4
+ from typing_extensions import Annotated
5
+
6
+ from dstack._internal.core.models.fleets import FleetSpec
7
+ from dstack._internal.core.models.gateways import GatewaySpec
8
+ from dstack._internal.core.models.runs import RunSpec
9
+ from dstack._internal.core.models.volumes import VolumeSpec
10
+
11
+ SpecType = TypeVar("SpecType", RunSpec, FleetSpec, VolumeSpec, GatewaySpec)
12
+
13
+
14
+ class SpecApplyRequest(BaseModel, Generic[SpecType]):
15
+ user: Annotated[str, Field(description="The name of the user making the apply request")]
16
+ project: Annotated[str, Field(description="The name of the project the request is for")]
17
+ spec: Annotated[SpecType, Field(description="The spec to be applied")]
18
+
19
+ # Override dict() to remove __orig_class__ attribute and avoid "TypeError: Object of type _GenericAlias is not JSON serializable"
20
+ # error. This issue doesn't happen though when running the code in pytest, only when running the server.
21
+ def dict(self, *args, **kwargs):
22
+ d = super().dict(*args, **kwargs)
23
+ d.pop("__orig_class__", None)
24
+ return d
25
+
26
+
27
+ RunSpecRequest = SpecApplyRequest[RunSpec]
28
+ FleetSpecRequest = SpecApplyRequest[FleetSpec]
29
+ VolumeSpecRequest = SpecApplyRequest[VolumeSpec]
30
+ GatewaySpecRequest = SpecApplyRequest[GatewaySpec]
31
+
32
+
33
+ class SpecApplyResponse(BaseModel, Generic[SpecType]):
34
+ spec: Annotated[
35
+ SpecType,
36
+ Field(
37
+ description="The spec to apply, original spec if error otherwise original or mutated by plugin service if approved"
38
+ ),
39
+ ]
40
+ error: Annotated[
41
+ Optional[str], Field(description="Error message if request is rejected", min_length=1)
42
+ ] = None
43
+
44
+
45
+ RunSpecResponse = SpecApplyResponse[RunSpec]
46
+ FleetSpecResponse = SpecApplyResponse[FleetSpec]
47
+ VolumeSpecResponse = SpecApplyResponse[VolumeSpec]
48
+ GatewaySpecResponse = SpecApplyResponse[GatewaySpec]
@@ -0,0 +1,127 @@
1
+ import json
2
+ import os
3
+ from typing import Type
4
+
5
+ import requests
6
+ from pydantic import ValidationError
7
+
8
+ from dstack._internal.core.errors import ServerClientError
9
+ from dstack._internal.core.models.fleets import FleetSpec
10
+ from dstack._internal.core.models.gateways import GatewaySpec
11
+ from dstack._internal.core.models.volumes import VolumeSpec
12
+ from dstack.plugins import ApplyPolicy, ApplySpec, Plugin, RunSpec, get_plugin_logger
13
+ from dstack.plugins.builtin.rest_plugin import (
14
+ FleetSpecRequest,
15
+ FleetSpecResponse,
16
+ GatewaySpecRequest,
17
+ GatewaySpecResponse,
18
+ RunSpecRequest,
19
+ RunSpecResponse,
20
+ SpecApplyRequest,
21
+ SpecApplyResponse,
22
+ VolumeSpecRequest,
23
+ VolumeSpecResponse,
24
+ )
25
+
26
+ logger = get_plugin_logger(__name__)
27
+
28
+ PLUGIN_SERVICE_URI_ENV_VAR_NAME = "DSTACK_PLUGIN_SERVICE_URI"
29
+ PLUGIN_REQUEST_TIMEOUT_SEC = 8
30
+
31
+
32
+ class CustomApplyPolicy(ApplyPolicy):
33
+ def __init__(self):
34
+ self._plugin_service_uri = os.getenv(PLUGIN_SERVICE_URI_ENV_VAR_NAME)
35
+ logger.info(f"Found plugin service at {self._plugin_service_uri}")
36
+ if not self._plugin_service_uri:
37
+ logger.error(
38
+ f"Cannot create policy because {PLUGIN_SERVICE_URI_ENV_VAR_NAME} is not set"
39
+ )
40
+ raise ServerClientError(f"{PLUGIN_SERVICE_URI_ENV_VAR_NAME} is not set")
41
+
42
+ def _check_request_rejected(self, response: SpecApplyResponse):
43
+ if response.error is not None:
44
+ logger.error(f"Plugin service rejected apply request: {response.error}")
45
+ raise ServerClientError(f"Apply request rejected: {response.error}")
46
+
47
+ def _call_plugin_service(self, spec_request: SpecApplyRequest, endpoint: str) -> ApplySpec:
48
+ response = None
49
+ try:
50
+ response = requests.post(
51
+ f"{self._plugin_service_uri}{endpoint}",
52
+ json=spec_request.dict(),
53
+ headers={"accept": "application/json", "Content-Type": "application/json"},
54
+ timeout=PLUGIN_REQUEST_TIMEOUT_SEC,
55
+ )
56
+ response.raise_for_status()
57
+ spec_json = json.loads(response.text)
58
+ return spec_json
59
+ except requests.exceptions.ConnectionError as e:
60
+ logger.error(
61
+ f"Could not connect to plugin service at {self._plugin_service_uri}: %s", e
62
+ )
63
+ raise ServerClientError(
64
+ f"Could not connect to plugin service at {self._plugin_service_uri}"
65
+ )
66
+ except requests.RequestException as e:
67
+ logger.error("Request to the plugin service failed: %s", e)
68
+ raise ServerClientError("Request to the plugin service failed")
69
+
70
+ def _on_apply(
71
+ self,
72
+ request_cls: Type[SpecApplyRequest],
73
+ response_cls: Type[SpecApplyResponse],
74
+ endpoint: str,
75
+ user: str,
76
+ project: str,
77
+ spec: ApplySpec,
78
+ ) -> ApplySpec:
79
+ try:
80
+ spec_request = request_cls(user=user, project=project, spec=spec)
81
+ spec_json = self._call_plugin_service(spec_request, endpoint)
82
+ response = response_cls(**spec_json)
83
+ self._check_request_rejected(response)
84
+ return response.spec
85
+ except ValidationError:
86
+ logger.error(f"Plugin service returned invalid response:\n{spec_json}")
87
+ raise ServerClientError("Plugin service returned an invalid response")
88
+
89
+ def on_run_apply(self, user: str, project: str, spec: RunSpec) -> RunSpec:
90
+ return self._on_apply(
91
+ RunSpecRequest, RunSpecResponse, "/apply_policies/on_run_apply", user, project, spec
92
+ )
93
+
94
+ def on_fleet_apply(self, user: str, project: str, spec: FleetSpec) -> FleetSpec:
95
+ return self._on_apply(
96
+ FleetSpecRequest,
97
+ FleetSpecResponse,
98
+ "/apply_policies/on_fleet_apply",
99
+ user,
100
+ project,
101
+ spec,
102
+ )
103
+
104
+ def on_volume_apply(self, user: str, project: str, spec: VolumeSpec) -> VolumeSpec:
105
+ return self._on_apply(
106
+ VolumeSpecRequest,
107
+ VolumeSpecResponse,
108
+ "/apply_policies/on_volume_apply",
109
+ user,
110
+ project,
111
+ spec,
112
+ )
113
+
114
+ def on_gateway_apply(self, user: str, project: str, spec: GatewaySpec) -> GatewaySpec:
115
+ return self._on_apply(
116
+ GatewaySpecRequest,
117
+ GatewaySpecResponse,
118
+ "/apply_policies/on_gateway_apply",
119
+ user,
120
+ project,
121
+ spec,
122
+ )
123
+
124
+
125
+ class RESTPlugin(Plugin):
126
+ def get_apply_policies(self) -> list[ApplyPolicy]:
127
+ return [CustomApplyPolicy()]
dstack/version.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.19.11rc1"
1
+ __version__ = "0.19.11rc2"
2
2
  __is_release__ = True
3
3
  base_image = "0.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dstack
3
- Version: 0.19.11rc1
3
+ Version: 0.19.11rc2
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Project-URL: Homepage, https://dstack.ai
6
6
  Project-URL: Source, https://github.com/dstackai/dstack
@@ -22,7 +22,6 @@ Requires-Dist: cursor
22
22
  Requires-Dist: filelock
23
23
  Requires-Dist: gitpython
24
24
  Requires-Dist: gpuhunt==0.1.6
25
- Requires-Dist: humanize>=4.12.3
26
25
  Requires-Dist: jsonschema
27
26
  Requires-Dist: packaging
28
27
  Requires-Dist: paramiko>=3.2.0
@@ -1,5 +1,5 @@
1
1
  dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- dstack/version.py,sha256=GxG1ziHLEcRXoddW7khMHK2u0fShzLeWrp1qMzeZKMQ,68
2
+ dstack/version.py,sha256=IwrQj83vfz3Q3lIltKTGrhKlC1D7da7-iXWp5LG38Nw,68
3
3
  dstack/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  dstack/_internal/compat.py,sha256=bF9U9fTMfL8UVhCouedoUSTYFl7UAOiU0WXrnRoByxw,40
5
5
  dstack/_internal/settings.py,sha256=GOqfcLEONWC1hGU36IYPuOhJXP_qC3Y6d2SQge_NdpY,953
@@ -40,7 +40,7 @@ dstack/_internal/cli/utils/fleet.py,sha256=ch-LN1X9boSm-rFLW4mAJRmz0XliLhH0LvKD2
40
40
  dstack/_internal/cli/utils/gateway.py,sha256=qMYa1NTAT_O98x2_mSyWDRbiHj5fqt6xUXFh9NIUwAM,1502
41
41
  dstack/_internal/cli/utils/rich.py,sha256=Gx1MJU929kMKsbdo9qF7XHARNta2426Ssb-xMLVhwbQ,5710
42
42
  dstack/_internal/cli/utils/run.py,sha256=nCQwAU3VDS8ec2oWNjRKi5xIGdwwKI_YNr8vgGyDPzQ,9202
43
- dstack/_internal/cli/utils/updates.py,sha256=sAPYYptkFzQnGaRjv7FV7HOj-Be3IXGe63xj-sVEpv4,2566
43
+ dstack/_internal/cli/utils/updates.py,sha256=pGr5keEmHojnbY0ayjWL4GWTz4ParY6fP85tHpJ11pI,3043
44
44
  dstack/_internal/cli/utils/volume.py,sha256=mU9I06dVMFbpjfkefxrZNoSWadKLoib3U14rHudNQN4,1975
45
45
  dstack/_internal/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  dstack/_internal/core/consts.py,sha256=c1Yd5UY6Qx7KeuYgloXWncWhMsYj6TqwlElda7NtB98,254
@@ -51,7 +51,7 @@ dstack/_internal/core/backends/models.py,sha256=aKQOrDEStouuwY4MacSen7SkoyAa6HR6
51
51
  dstack/_internal/core/backends/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  dstack/_internal/core/backends/aws/auth.py,sha256=BAe3HAedoAO42Fbv7YhpODKWlyil8M0PuRJsL-_u_kw,978
53
53
  dstack/_internal/core/backends/aws/backend.py,sha256=pjROH-S9pgrSMm-Eox_ocL7cTU6mIMRxvURq7Vi-2J8,876
54
- dstack/_internal/core/backends/aws/compute.py,sha256=f__9FTpXaCLoypdw9VPZ6AswfmiNcf8MS3ftGztYmJA,35711
54
+ dstack/_internal/core/backends/aws/compute.py,sha256=GKxwfoDA_qVE1znwRGfvkPhvrl3XUDL9tAlFidB4SYs,36040
55
55
  dstack/_internal/core/backends/aws/configurator.py,sha256=gGynfTQW89hUt7acAjVnZnRtCbzhno7l4baCKnBEuQI,7499
56
56
  dstack/_internal/core/backends/aws/models.py,sha256=EUCHXHmZnshe3rwI9UtjilwcUMu1Z7MO4Y4-nlZ_IcA,4404
57
57
  dstack/_internal/core/backends/aws/resources.py,sha256=Wht_USG8ps9HQBhAYfxDxjaob9kUnr7_WDCaXNzCeE0,22837
@@ -65,7 +65,7 @@ dstack/_internal/core/backends/azure/resources.py,sha256=cJWS2Yjxdg-XtjpdBxfVDZa
65
65
  dstack/_internal/core/backends/azure/utils.py,sha256=taHMJq6UHRzUXLUcO2P5VCKy3wJaye2bG-6QdkEPNdY,1741
66
66
  dstack/_internal/core/backends/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
67
  dstack/_internal/core/backends/base/backend.py,sha256=hdFMHED1RMV9GVfLSU0yGhGE-cXlbLvt1coDA885PMM,505
68
- dstack/_internal/core/backends/base/compute.py,sha256=XblmmEz4muUjcnlIudKEwoPSaqMBVZtbOcwgGs47Xvc,28625
68
+ dstack/_internal/core/backends/base/compute.py,sha256=D4rRxUHUZOkUfAhmDE6MaS4AyHEPdRVcnS4LxQ-DF9E,28719
69
69
  dstack/_internal/core/backends/base/configurator.py,sha256=OCv8N2oxcxy3In2zS1PKiCJ0a-COZwxGjBz2FYkQnfg,3807
70
70
  dstack/_internal/core/backends/base/models.py,sha256=Ij0osOl-T-ABsKLoVg2eY81DMkwdWkevAnjXj2QnLXI,532
71
71
  dstack/_internal/core/backends/base/offers.py,sha256=AzAAx5eSTaHv8CbWuGERTHS151x4oJuQn3tr_Bz9HKQ,6282
@@ -85,10 +85,10 @@ dstack/_internal/core/backends/dstack/models.py,sha256=Jbe0Syez43N5i97TlIc8l-5Vn
85
85
  dstack/_internal/core/backends/gcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  dstack/_internal/core/backends/gcp/auth.py,sha256=VWCn34hapaZ3E0OHCoiAVL97o3s64RF9w85CZ6xdtmk,2235
87
87
  dstack/_internal/core/backends/gcp/backend.py,sha256=OvTv1c7j4LTPCIEtkwD3-q6Eo1QET8xlM8CzbY0hLmI,572
88
- dstack/_internal/core/backends/gcp/compute.py,sha256=NRAb_2ThZ4lEzDhr5q6ecxMlALnJFGYpJsaWu6uJ_VI,41511
88
+ dstack/_internal/core/backends/gcp/compute.py,sha256=OObZgsOyQC-FvcA75xdO7MIoiFr9ncl5-Av6TtCOxdQ,42218
89
89
  dstack/_internal/core/backends/gcp/configurator.py,sha256=mvI7WMz8cC1YnN-0KFIIEqkfcEBehRJI0WgKnqILjv0,6730
90
90
  dstack/_internal/core/backends/gcp/models.py,sha256=biLA3rlFcoPatAZpKycuIl-8PdnNSAFiDCJjov65_zo,4612
91
- dstack/_internal/core/backends/gcp/resources.py,sha256=gLoRo9Z1--n55JTEDVaofUsBo-8h5Nfbhsb_2ydvmK8,16487
91
+ dstack/_internal/core/backends/gcp/resources.py,sha256=2jpg24NH4Ov4J4Of1F3DPkwEWkRxEi-x4ZTx8XSNGIQ,16926
92
92
  dstack/_internal/core/backends/gcp/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  dstack/_internal/core/backends/gcp/features/tcpx.py,sha256=8bDR5kwF5qke5EWNdBscdbZQnC7oVXKSls3WPcoXgZI,2902
94
94
  dstack/_internal/core/backends/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -105,7 +105,7 @@ dstack/_internal/core/backends/lambdalabs/configurator.py,sha256=JYtAFemQRi6tXTt
105
105
  dstack/_internal/core/backends/lambdalabs/models.py,sha256=c9dAYd0wjun2dvMLUZO4D09XvEskBRehjLDN_nwbSEU,1036
106
106
  dstack/_internal/core/backends/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
107
  dstack/_internal/core/backends/local/backend.py,sha256=KJuNXUXrg60NhLywnExD1EXH2gK0TL-kzNWUPRNZ_Zg,427
108
- dstack/_internal/core/backends/local/compute.py,sha256=ZEUvlXyPtuGZSCQn-iDctfmwSbk7lAV95PGrQfrl1so,3730
108
+ dstack/_internal/core/backends/local/compute.py,sha256=-FUD8Ii5VTBtygAV1U3k1j10MFdK1whGvrSeRwTk29Y,3788
109
109
  dstack/_internal/core/backends/nebius/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
110
  dstack/_internal/core/backends/nebius/backend.py,sha256=2XqZIbSR8VzlfOnuVklXlDxNmwAkQj7txQN8VXF1j2E,566
111
111
  dstack/_internal/core/backends/nebius/compute.py,sha256=OUNvDk9rU13NR0CADFqn7nQL8kxgSvL7kbNEV4cLzyQ,14761
@@ -264,7 +264,7 @@ dstack/_internal/server/background/tasks/process_placement_groups.py,sha256=gJ8U
264
264
  dstack/_internal/server/background/tasks/process_prometheus_metrics.py,sha256=9VoGFqdiXcVkCi_NV1VqQdqllDkB0bHIqOHKMIZK1Fg,5183
265
265
  dstack/_internal/server/background/tasks/process_running_jobs.py,sha256=jyuYOQfXIVGu5ugTennwSGXL_c6VDNJN96-Qrz7Hgic,36441
266
266
  dstack/_internal/server/background/tasks/process_runs.py,sha256=EI1W6HUyB-og3g8BDP_GsBrJjQ-Z3JvZHTuJf7CRKRM,17974
267
- dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=9Etgo9-Fdx5g9xk0OsJXcfVm2dssLTKLT0FLvWJO4kU,27397
267
+ dstack/_internal/server/background/tasks/process_submitted_jobs.py,sha256=tLLpdtLHN2xC6Ohc6f0we3oevw3pBt0_XrsufaFtIvE,27383
268
268
  dstack/_internal/server/background/tasks/process_terminating_jobs.py,sha256=0Z3Q409RwSxOL_pgK8JktBthjtESEUH3ahwTLsTdYPk,3800
269
269
  dstack/_internal/server/background/tasks/process_volumes.py,sha256=206rbT4ICeZtEmqh_94Rry_fgHfFLLaSEX9W-svwFk4,5089
270
270
  dstack/_internal/server/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -347,7 +347,7 @@ dstack/_internal/server/routers/logs.py,sha256=_Euk283LbhlwHibJTKM-7YcpbeQFtWBqM
347
347
  dstack/_internal/server/routers/metrics.py,sha256=VFgWhkOvxVFDLlRM_kXHYFylLcfCD6UjXInvcd7H4dY,2314
348
348
  dstack/_internal/server/routers/projects.py,sha256=0R-w_6WXUbNo6fREAexFUQ3RoOJF2D_Iz35elKjym14,2717
349
349
  dstack/_internal/server/routers/prometheus.py,sha256=UAcOE8dpGZe4Wd0EOIlFPMbjaNjzX8A7iHlooeRvsfo,944
350
- dstack/_internal/server/routers/repos.py,sha256=wXtfQBEwGtHIWg1-EMMigMAby42Exe7iFhwPKkg8JQ4,3723
350
+ dstack/_internal/server/routers/repos.py,sha256=Si27qslFefmvRBuR2khvuFyjpd88-Hys-pvIbi9YJK0,3943
351
351
  dstack/_internal/server/routers/runs.py,sha256=p44c_0bqwG1v5S_qX-HKbap1nmk1F2JVqaIXihjiUfY,5388
352
352
  dstack/_internal/server/routers/secrets.py,sha256=50_qJCTYRpnGSlLyS93gqoV17wWewOVmM65PcG1bT_Y,856
353
353
  dstack/_internal/server/routers/server.py,sha256=8pQmfyZj0nbebeOK9JuKhw9JmYuIYfJnY0LuYynWnGY,346
@@ -380,7 +380,7 @@ dstack/_internal/server/services/metrics.py,sha256=jKLy1jSCVR_crqVu_CmsOMbvMkucW
380
380
  dstack/_internal/server/services/offers.py,sha256=4hhqLzmo14_IY84FSDG59Sib1DrmTAOk-_q8M4aYoLU,7737
381
381
  dstack/_internal/server/services/permissions.py,sha256=l7Ngdelmn65vjw13NcOdaC6lBYMRuSw6FbHzYwdK3nE,1005
382
382
  dstack/_internal/server/services/placement.py,sha256=U-7z4kJ6ZyrCXzkDychWoOhniz19ooFwiNI2InoTLls,2420
383
- dstack/_internal/server/services/plugins.py,sha256=e5ESJVw5EaxkmxLXdvZdIGaFNxy8k5QOiPQD2zN9w84,2650
383
+ dstack/_internal/server/services/plugins.py,sha256=6UeOF65IA7OzLTBiUmZO0g-07aMRh_J2npEfcpz6C0Q,3750
384
384
  dstack/_internal/server/services/projects.py,sha256=Je1iWZ-ArmyFxK1yMUzod5WRXyiIDxtuVp6pHcdctTQ,14988
385
385
  dstack/_internal/server/services/prometheus.py,sha256=xq5G-Q2BJup9lS2F6__0wUVTs-k1Gr3dYclGzo2WoWo,12474
386
386
  dstack/_internal/server/services/repos.py,sha256=f9ztN7jz_2gvD9hXF5sJwWDVyG2-NHRfjIdSukowPh8,9342
@@ -400,7 +400,7 @@ dstack/_internal/server/services/gateways/__init__.py,sha256=Up8uFsEQDBE0yOXn7n5
400
400
  dstack/_internal/server/services/gateways/client.py,sha256=XIJX3fGBbZ_AG8qZMTSE8KAB_ojq5YJFa0OXoD_dofg,7493
401
401
  dstack/_internal/server/services/gateways/connection.py,sha256=ot3lV85XdmCT45vBWeyj57nLPcLPNm316zu3jMyeWjA,5625
402
402
  dstack/_internal/server/services/gateways/pool.py,sha256=0LclTl1tyx-doS78LeaAKjr-SMp98zuwh5f9s06JSd0,1914
403
- dstack/_internal/server/services/jobs/__init__.py,sha256=GU3vMC0SZKyvL564A7t_QRoDjf83-8GsUkguDWK5x6c,25578
403
+ dstack/_internal/server/services/jobs/__init__.py,sha256=hoQsjkUWdJ8xsO03WRwKOX-sHJuhVfsX-1rl26nQwR0,25554
404
404
  dstack/_internal/server/services/jobs/configurators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
405
405
  dstack/_internal/server/services/jobs/configurators/base.py,sha256=WLRIBM50P8mfvpotzYjK3Gtf5ScQsuijGieH_zaYqCg,11984
406
406
  dstack/_internal/server/services/jobs/configurators/dev.py,sha256=ufN6Sd8TwIsjQYNZE32fkAqJI7o2zjgoZThbrP-bd7U,2378
@@ -454,10 +454,10 @@ dstack/_internal/server/statics/e467d7d60aae81ab198b.svg,sha256=_XHc9mfQZgGkcy4h
454
454
  dstack/_internal/server/statics/eb9b344b73818fe2b71a.png,sha256=2H14eOCQRyZhFGJ1Kn2LH1j70kTF1Qop4vH-tiKqyPI,85
455
455
  dstack/_internal/server/statics/f517dd626eb964120de0.png,sha256=4QQuNa8SqmcZ67HK6739OHCyjnAJseU1bkcn454KRQs,159
456
456
  dstack/_internal/server/statics/f958aecddee5d8e3222c.png,sha256=8CoZkVNgRfOAe62X1dU-AZDvwh_nESKaQblEmaX2Xrs,87
457
- dstack/_internal/server/statics/index.html,sha256=UmT1blYXopnvIglSx7EM67YQYx-Wpx5jrXL37UvSJqM,10468
457
+ dstack/_internal/server/statics/index.html,sha256=WcJyCA-G5vPq0xyJH8UcyEdw-df77u9C_3S0EdfxvT8,10468
458
+ dstack/_internal/server/statics/main-5b9786c955b42bf93581.js,sha256=zhAnUUbO4YDnSGFJ77XNOIraIcw19ov7gokS2DLhy9E,6523313
459
+ dstack/_internal/server/statics/main-5b9786c955b42bf93581.js.map,sha256=6SX5ZigfpMVtB3xLBJb4IME1ifg1IwqsyMy8NKTSiq8,8561465
458
460
  dstack/_internal/server/statics/main-8f9c66f404e9c7e7e020.css,sha256=RC2sAxRMpIK3myvsxKEhLk4OsxTOt7DgWunCwyn-B34,1336694
459
- dstack/_internal/server/statics/main-b4803049eac16aea9a49.js,sha256=uk2mEKXEKDP5nWO6cjSGK0GUh63YbvSBCgHCiengeKk,6521276
460
- dstack/_internal/server/statics/main-b4803049eac16aea9a49.js.map,sha256=tDM8-Gh0SsJV87gQICQKhrvprc5eb33M4OCpLGa982c,8559017
461
461
  dstack/_internal/server/statics/manifest.json,sha256=430w2BoWVmYYVr14lDvUxx-ROPt3VjigzeMqfLeiSCM,340
462
462
  dstack/_internal/server/statics/robots.txt,sha256=kNJLw79pisHhc3OVAimMzKcq3x9WT6sF9IS4xI0crdI,67
463
463
  dstack/_internal/server/statics/assets/android-chrome-144x144.png,sha256=tB3V-95O-VVEoawN5V1XFoMQRSK0I6gthraV8bATGaw,23414
@@ -584,8 +584,12 @@ dstack/plugins/__init__.py,sha256=buT1pcyORLgVbl89ATkRWJPhvejriVz7sNBjvuZRCRE,40
584
584
  dstack/plugins/_base.py,sha256=-etiB-EozaJCg2wtmONfj8ic-K03qXvXyl_TIDp-kNE,2662
585
585
  dstack/plugins/_models.py,sha256=1Gw--mDQ1_0FFr9Zur9LE8UbMoWESUpTdHHt12AyIZo,341
586
586
  dstack/plugins/_utils.py,sha256=FqeWYb7zOrgZkO9Bd8caL5I81_TUEsysIzvxsULrmzk,392
587
- dstack-0.19.11rc1.dist-info/METADATA,sha256=ZU6h89CiVMvwc_lXF_Cv4LI2DPdA6_zvPr7rZF1iTJY,20512
588
- dstack-0.19.11rc1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
589
- dstack-0.19.11rc1.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
590
- dstack-0.19.11rc1.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
591
- dstack-0.19.11rc1.dist-info/RECORD,,
587
+ dstack/plugins/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
588
+ dstack/plugins/builtin/rest_plugin/__init__.py,sha256=lgTsq8Z6Km2F2UhPRChVB4vDM5ZpWtdk1iB1aa20ypA,440
589
+ dstack/plugins/builtin/rest_plugin/_models.py,sha256=9hgVuU6OGSxidar88XhQnNo9izYWeQvVH45ciErv-Es,1910
590
+ dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=LbtjnXqd-51pR19Cr5rYxoIyDKjSOG4hIpXmv1Mpfnc,4615
591
+ dstack-0.19.11rc2.dist-info/METADATA,sha256=gW5bm3zVUlCFv1GeJCmDDaskSOyWRTkro3-diWi_avE,20480
592
+ dstack-0.19.11rc2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
593
+ dstack-0.19.11rc2.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
594
+ dstack-0.19.11rc2.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
595
+ dstack-0.19.11rc2.dist-info/RECORD,,