dstack 0.19.9__py3-none-any.whl → 0.19.11__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.

Files changed (53) hide show
  1. dstack/_internal/cli/commands/config.py +1 -1
  2. dstack/_internal/cli/commands/metrics.py +25 -10
  3. dstack/_internal/cli/commands/offer.py +2 -0
  4. dstack/_internal/cli/commands/project.py +161 -0
  5. dstack/_internal/cli/commands/ps.py +9 -2
  6. dstack/_internal/cli/main.py +2 -0
  7. dstack/_internal/cli/services/configurators/run.py +1 -1
  8. dstack/_internal/cli/utils/updates.py +13 -1
  9. dstack/_internal/core/backends/aws/compute.py +21 -9
  10. dstack/_internal/core/backends/azure/compute.py +8 -3
  11. dstack/_internal/core/backends/base/compute.py +9 -4
  12. dstack/_internal/core/backends/gcp/compute.py +43 -20
  13. dstack/_internal/core/backends/gcp/resources.py +18 -2
  14. dstack/_internal/core/backends/local/compute.py +4 -2
  15. dstack/_internal/core/models/configurations.py +21 -4
  16. dstack/_internal/core/models/runs.py +2 -1
  17. dstack/_internal/proxy/gateway/resources/nginx/00-log-format.conf +11 -1
  18. dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +12 -6
  19. dstack/_internal/proxy/gateway/services/stats.py +17 -3
  20. dstack/_internal/server/background/tasks/process_metrics.py +23 -21
  21. dstack/_internal/server/background/tasks/process_submitted_jobs.py +24 -15
  22. dstack/_internal/server/migrations/versions/bca2fdf130bf_add_runmodel_priority.py +34 -0
  23. dstack/_internal/server/models.py +1 -0
  24. dstack/_internal/server/routers/repos.py +13 -4
  25. dstack/_internal/server/services/fleets.py +2 -2
  26. dstack/_internal/server/services/gateways/__init__.py +1 -1
  27. dstack/_internal/server/services/instances.py +6 -2
  28. dstack/_internal/server/services/jobs/__init__.py +4 -4
  29. dstack/_internal/server/services/jobs/configurators/base.py +18 -4
  30. dstack/_internal/server/services/jobs/configurators/extensions/cursor.py +3 -1
  31. dstack/_internal/server/services/jobs/configurators/extensions/vscode.py +3 -1
  32. dstack/_internal/server/services/plugins.py +64 -32
  33. dstack/_internal/server/services/runs.py +33 -20
  34. dstack/_internal/server/services/volumes.py +1 -1
  35. dstack/_internal/server/settings.py +1 -0
  36. dstack/_internal/server/statics/index.html +1 -1
  37. dstack/_internal/server/statics/{main-b4f65323f5df007e1664.js → main-5b9786c955b42bf93581.js} +8 -8
  38. dstack/_internal/server/statics/{main-b4f65323f5df007e1664.js.map → main-5b9786c955b42bf93581.js.map} +1 -1
  39. dstack/_internal/server/testing/common.py +2 -0
  40. dstack/_internal/server/utils/routers.py +3 -6
  41. dstack/_internal/settings.py +4 -0
  42. dstack/api/_public/runs.py +6 -3
  43. dstack/api/server/_runs.py +2 -0
  44. dstack/plugins/builtin/__init__.py +0 -0
  45. dstack/plugins/builtin/rest_plugin/__init__.py +18 -0
  46. dstack/plugins/builtin/rest_plugin/_models.py +48 -0
  47. dstack/plugins/builtin/rest_plugin/_plugin.py +127 -0
  48. dstack/version.py +2 -2
  49. {dstack-0.19.9.dist-info → dstack-0.19.11.dist-info}/METADATA +10 -6
  50. {dstack-0.19.9.dist-info → dstack-0.19.11.dist-info}/RECORD +53 -47
  51. {dstack-0.19.9.dist-info → dstack-0.19.11.dist-info}/WHEEL +0 -0
  52. {dstack-0.19.9.dist-info → dstack-0.19.11.dist-info}/entry_points.txt +0 -0
  53. {dstack-0.19.9.dist-info → dstack-0.19.11.dist-info}/licenses/LICENSE.md +0 -0
@@ -1,9 +1,11 @@
1
1
  import itertools
2
2
  from importlib import import_module
3
+ from typing import Dict
3
4
 
4
5
  from backports.entry_points_selectable import entry_points # backport for Python 3.9
5
6
 
6
7
  from dstack._internal.core.errors import ServerClientError
8
+ from dstack._internal.utils.common import run_async
7
9
  from dstack._internal.utils.logging import get_logger
8
10
  from dstack.plugins import ApplyPolicy, ApplySpec, Plugin
9
11
 
@@ -12,59 +14,89 @@ logger = get_logger(__name__)
12
14
 
13
15
  _PLUGINS: list[Plugin] = []
14
16
 
17
+ _BUILTIN_PLUGINS: Dict[str, str] = {"rest_plugin": "dstack.plugins.builtin.rest_plugin:RESTPlugin"}
15
18
 
16
- def load_plugins(enabled_plugins: list[str]):
17
- _PLUGINS.clear()
18
- plugins_entrypoints = entry_points(group="dstack.plugins")
19
- plugins_to_load = enabled_plugins.copy()
20
- for entrypoint in plugins_entrypoints:
21
- if entrypoint.name not in enabled_plugins:
22
- logger.info(
23
- ("Found not enabled plugin %s. Plugin will not be loaded."),
24
- entrypoint.name,
25
- )
26
- continue
19
+
20
+ class PluginEntrypoint:
21
+ def __init__(self, name: str, import_path: str, is_builtin: bool = False):
22
+ self.name = name
23
+ self.import_path = import_path
24
+ self.is_builtin = is_builtin
25
+
26
+ def load(self):
27
+ module_path, _, class_name = self.import_path.partition(":")
27
28
  try:
28
- module_path, _, class_name = entrypoint.value.partition(":")
29
29
  module = import_module(module_path)
30
+ plugin_class = getattr(module, class_name, None)
31
+ if plugin_class is None:
32
+ logger.warning(
33
+ ("Failed to load plugin %s: plugin class %s not found in module %s."),
34
+ self.name,
35
+ class_name,
36
+ module_path,
37
+ )
38
+ return None
39
+ if not issubclass(plugin_class, Plugin):
40
+ logger.warning(
41
+ ("Failed to load plugin %s: plugin class %s is not a subclass of Plugin."),
42
+ self.name,
43
+ class_name,
44
+ )
45
+ return None
46
+ return plugin_class()
30
47
  except ImportError:
31
48
  logger.warning(
32
49
  (
33
50
  "Failed to load plugin %s when importing %s."
34
51
  " Ensure the module is on the import path."
35
52
  ),
36
- entrypoint.name,
37
- entrypoint.value,
53
+ self.name,
54
+ self.import_path,
38
55
  )
39
- continue
40
- plugin_class = getattr(module, class_name, None)
41
- if plugin_class is None:
42
- logger.warning(
43
- ("Failed to load plugin %s: plugin class %s not found in module %s."),
56
+ return None
57
+
58
+
59
+ def load_plugins(enabled_plugins: list[str]):
60
+ _PLUGINS.clear()
61
+ entrypoints: dict[str, PluginEntrypoint] = {}
62
+ plugins_to_load = enabled_plugins.copy()
63
+ for entrypoint in entry_points(group="dstack.plugins"):
64
+ if entrypoint.name not in enabled_plugins:
65
+ logger.info(
66
+ ("Found not enabled plugin %s. Plugin will not be loaded."),
44
67
  entrypoint.name,
45
- class_name,
46
- module_path,
47
68
  )
48
69
  continue
49
- if not issubclass(plugin_class, Plugin):
50
- logger.warning(
51
- ("Failed to load plugin %s: plugin class %s is not a subclass of Plugin."),
52
- entrypoint.name,
53
- class_name,
70
+ else:
71
+ entrypoints[entrypoint.name] = PluginEntrypoint(
72
+ entrypoint.name, entrypoint.value, is_builtin=False
54
73
  )
55
- continue
56
- plugins_to_load.remove(entrypoint.name)
57
- _PLUGINS.append(plugin_class())
58
- logger.info("Loaded plugin %s", entrypoint.name)
74
+
75
+ for name, import_path in _BUILTIN_PLUGINS.items():
76
+ if name not in enabled_plugins:
77
+ logger.info(
78
+ ("Found not enabled builtin plugin %s. Plugin will not be loaded."),
79
+ name,
80
+ )
81
+ else:
82
+ entrypoints[name] = PluginEntrypoint(name, import_path, is_builtin=True)
83
+
84
+ for plugin_name, plugin_entrypoint in entrypoints.items():
85
+ plugin_instance = plugin_entrypoint.load()
86
+ if plugin_instance is not None:
87
+ _PLUGINS.append(plugin_instance)
88
+ plugins_to_load.remove(plugin_name)
89
+ logger.info("Loaded plugin %s", plugin_name)
90
+
59
91
  if plugins_to_load:
60
92
  logger.warning("Enabled plugins not found: %s", plugins_to_load)
61
93
 
62
94
 
63
- def apply_plugin_policies(user: str, project: str, spec: ApplySpec) -> ApplySpec:
95
+ async def apply_plugin_policies(user: str, project: str, spec: ApplySpec) -> ApplySpec:
64
96
  policies = _get_apply_policies()
65
97
  for policy in policies:
66
98
  try:
67
- spec = policy.on_apply(user=user, project=project, spec=spec)
99
+ spec = await run_async(policy.on_apply, user=user, project=project, spec=spec)
68
100
  except ValueError as e:
69
101
  msg = None
70
102
  if len(e.args) > 0:
@@ -16,7 +16,7 @@ from dstack._internal.core.errors import (
16
16
  ServerClientError,
17
17
  )
18
18
  from dstack._internal.core.models.common import ApplyAction
19
- from dstack._internal.core.models.configurations import AnyRunConfiguration
19
+ from dstack._internal.core.models.configurations import RUN_PRIORITY_DEFAULT, AnyRunConfiguration
20
20
  from dstack._internal.core.models.instances import (
21
21
  InstanceAvailability,
22
22
  InstanceOfferWithAvailability,
@@ -283,7 +283,7 @@ async def get_plan(
283
283
  ) -> RunPlan:
284
284
  # Spec must be copied by parsing to calculate merged_profile
285
285
  effective_run_spec = RunSpec.parse_obj(run_spec.dict())
286
- effective_run_spec = apply_plugin_policies(
286
+ effective_run_spec = await apply_plugin_policies(
287
287
  user=user.name,
288
288
  project=project.name,
289
289
  spec=effective_run_spec,
@@ -382,7 +382,7 @@ async def apply_plan(
382
382
  force: bool,
383
383
  ) -> Run:
384
384
  run_spec = plan.run_spec
385
- run_spec = apply_plugin_policies(
385
+ run_spec = await apply_plugin_policies(
386
386
  user=user.name,
387
387
  project=project.name,
388
388
  spec=run_spec,
@@ -434,7 +434,12 @@ async def apply_plan(
434
434
  # FIXME: potentially long write transaction
435
435
  # Avoid getting run_model after update
436
436
  await session.execute(
437
- update(RunModel).where(RunModel.id == current_resource.id).values(run_spec=run_spec.json())
437
+ update(RunModel)
438
+ .where(RunModel.id == current_resource.id)
439
+ .values(
440
+ run_spec=run_spec.json(),
441
+ priority=run_spec.configuration.priority,
442
+ )
438
443
  )
439
444
  run = await get_run_by_name(
440
445
  session=session,
@@ -495,6 +500,7 @@ async def submit_run(
495
500
  status=RunStatus.SUBMITTED,
496
501
  run_spec=run_spec.json(),
497
502
  last_processed_at=submitted_at,
503
+ priority=run_spec.configuration.priority,
498
504
  )
499
505
  session.add(run_model)
500
506
 
@@ -721,15 +727,15 @@ async def _get_pool_offers(
721
727
  pool_instances = [i for i in pool_instances if i.id not in detaching_instances_ids]
722
728
  multinode = job.job_spec.jobs_per_replica > 1
723
729
 
724
- if not multinode:
725
- shared_instances_with_offers = get_shared_pool_instances_with_offers(
726
- pool_instances=pool_instances,
727
- profile=run_spec.merged_profile,
728
- requirements=job.job_spec.requirements,
729
- volumes=volumes,
730
- )
731
- for _, offer in shared_instances_with_offers:
732
- pool_offers.append(offer)
730
+ shared_instances_with_offers = get_shared_pool_instances_with_offers(
731
+ pool_instances=pool_instances,
732
+ profile=run_spec.merged_profile,
733
+ requirements=job.job_spec.requirements,
734
+ volumes=volumes,
735
+ multinode=multinode,
736
+ )
737
+ for _, offer in shared_instances_with_offers:
738
+ pool_offers.append(offer)
733
739
 
734
740
  nonshared_instances = filter_pool_instances(
735
741
  pool_instances=pool_instances,
@@ -852,6 +858,13 @@ def _get_job_submission_cost(job_submission: JobSubmission) -> float:
852
858
 
853
859
 
854
860
  def _validate_run_spec_and_set_defaults(run_spec: RunSpec):
861
+ # This function may set defaults for null run_spec values,
862
+ # although most defaults are resolved when building job_spec
863
+ # so that we can keep both the original user-supplied value (null in run_spec)
864
+ # and the default in job_spec.
865
+ # If a property is stored in job_spec - resolve the default there.
866
+ # Server defaults are preferable over client defaults so that
867
+ # the defaults depend on the server version, not the client version.
855
868
  if run_spec.run_name is not None:
856
869
  validate_dstack_resource_name(run_spec.run_name)
857
870
  for mount_point in run_spec.configuration.volumes:
@@ -875,11 +888,14 @@ def _validate_run_spec_and_set_defaults(run_spec: RunSpec):
875
888
  raise ServerClientError(
876
889
  f"Maximum utilization_policy.time_window is {settings.SERVER_METRICS_RUNNING_TTL_SECONDS}s"
877
890
  )
891
+ if run_spec.configuration.priority is None:
892
+ run_spec.configuration.priority = RUN_PRIORITY_DEFAULT
878
893
  set_resources_defaults(run_spec.configuration.resources)
879
894
 
880
895
 
881
896
  _UPDATABLE_SPEC_FIELDS = ["repo_code_hash", "configuration"]
882
- _CONF_TYPE_TO_UPDATABLE_FIELDS = {
897
+ _CONF_UPDATABLE_FIELDS = ["priority"]
898
+ _TYPE_SPECIFIC_CONF_UPDATABLE_FIELDS = {
883
899
  "dev-environment": ["inactivity_duration"],
884
900
  # Most service fields can be updated via replica redeployment.
885
901
  # TODO: Allow updating other fields when rolling deployment is supported.
@@ -915,12 +931,9 @@ def _check_can_update_configuration(
915
931
  raise ServerClientError(
916
932
  f"Configuration type changed from {current.type} to {new.type}, cannot update"
917
933
  )
918
- updatable_fields = _CONF_TYPE_TO_UPDATABLE_FIELDS.get(new.type)
919
- if updatable_fields is None:
920
- raise ServerClientError(
921
- f"Can only update {', '.join(_CONF_TYPE_TO_UPDATABLE_FIELDS)} configurations."
922
- f" Not {new.type}"
923
- )
934
+ updatable_fields = _CONF_UPDATABLE_FIELDS + _TYPE_SPECIFIC_CONF_UPDATABLE_FIELDS.get(
935
+ new.type, []
936
+ )
924
937
  diff = diff_models(current, new)
925
938
  changed_fields = list(diff.keys())
926
939
  for key in changed_fields:
@@ -205,7 +205,7 @@ async def create_volume(
205
205
  user: UserModel,
206
206
  configuration: VolumeConfiguration,
207
207
  ) -> Volume:
208
- spec = apply_plugin_policies(
208
+ spec = await apply_plugin_policies(
209
209
  user=user.name,
210
210
  project=project.name,
211
211
  # Create pseudo spec until the volume API is updated to accept spec
@@ -85,6 +85,7 @@ DEFAULT_SERVICE_CLIENT_MAX_BODY_SIZE = int(
85
85
  USER_PROJECT_DEFAULT_QUOTA = int(os.getenv("DSTACK_USER_PROJECT_DEFAULT_QUOTA", 10))
86
86
  FORBID_SERVICES_WITHOUT_GATEWAY = os.getenv("DSTACK_FORBID_SERVICES_WITHOUT_GATEWAY") is not None
87
87
 
88
+ SERVER_CODE_UPLOAD_LIMIT = int(os.getenv("DSTACK_SERVER_CODE_UPLOAD_LIMIT", 2 * 2**20))
88
89
 
89
90
  # Development settings
90
91
 
@@ -1,3 +1,3 @@
1
1
  <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><title>dstack</title><meta name="description" content="Get GPUs at the best prices and availability from a wide range of providers. No cloud account of your own is required.
2
2
  "/><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet"><meta name="og:title" content="dstack"><meta name="og:type" content="article"><meta name="og:image" content="/splash_thumbnail.png"><meta name="og:description" content="Get GPUs at the best prices and availability from a wide range of providers. No cloud account of your own is required.
3
- "><link rel="icon" type="image/x-icon" href="/assets/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon-48x48.png"><link rel="manifest" href="/assets/manifest.webmanifest"><meta name="mobile-web-app-capable" content="yes"><meta name="theme-color" content="#fff"><meta name="application-name" content="dstackai"><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="dstackai"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-640x1136.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1136x640.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-750x1334.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1334x750.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1125x2436.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2436x1125.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1170x2532.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2532x1170.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1179x2556.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2556x1179.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-828x1792.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1792x828.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2688.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2688x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2208.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2208x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1284x2778.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2778x1284.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1290x2796.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2796x1290.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1488x2266.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2266x1488.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1536x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2048x1536.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1620x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1620.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1640x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1640.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2388.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2388x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2224.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2224x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-2048x2732.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2732x2048.png"><meta name="msapplication-TileColor" content="#fff"><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"><meta name="msapplication-config" content="/assets/browserconfig.xml"><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"><script defer="defer" src="/main-b4f65323f5df007e1664.js"></script><link href="/main-8f9c66f404e9c7e7e020.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div class="b-page-header" id="header"></div><div id="root"></div></body></html>
3
+ "><link rel="icon" type="image/x-icon" href="/assets/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"><link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon-48x48.png"><link rel="manifest" href="/assets/manifest.webmanifest"><meta name="mobile-web-app-capable" content="yes"><meta name="theme-color" content="#fff"><meta name="application-name" content="dstackai"><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="apple-mobile-web-app-title" content="dstackai"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-640x1136.png"><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1136x640.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-750x1334.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1334x750.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1125x2436.png"><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2436x1125.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1170x2532.png"><link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2532x1170.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1179x2556.png"><link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2556x1179.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-828x1792.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-1792x828.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2688.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2688x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1242x2208.png"><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2208x1242.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1284x2778.png"><link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2778x1284.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1290x2796.png"><link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2796x1290.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1488x2266.png"><link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2266x1488.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1536x2048.png"><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2048x1536.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1620x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1620.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1640x2160.png"><link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2160x1640.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2388.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2388x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-1668x2224.png"><link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2224x1668.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/assets/apple-touch-startup-image-2048x2732.png"><link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/assets/apple-touch-startup-image-2732x2048.png"><meta name="msapplication-TileColor" content="#fff"><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"><meta name="msapplication-config" content="/assets/browserconfig.xml"><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"><script defer="defer" src="/main-5b9786c955b42bf93581.js"></script><link href="/main-8f9c66f404e9c7e7e020.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div class="b-page-header" id="header"></div><div id="root"></div></body></html>
@@ -119408,7 +119408,7 @@ var src_getThemeMode=function(){var _window;return null!==(_window=window)&&void
119408
119408
  ;// ./src/App/types.ts
119409
119409
  var src_ToolsTabs=/*#__PURE__*/function(ToolsTabs){return ToolsTabs.INFO="info",ToolsTabs.TUTORIAL="tutorial",ToolsTabs}({});
119410
119410
  ;// ./src/App/slice.ts
119411
- function src_slice_ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function src_slice_objectSpread(e){for(var t,r=1;r<arguments.length;r++)t=null==arguments[r]?{}:arguments[r],r%2?src_slice_ownKeys(Object(t),!0).forEach(function(r){src_defineProperty_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):src_slice_ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))});return e}var src_slice_getInitialState=function(){var authData=null,storageData=null,activeMode=src_getThemeMode();try{storageData=localStorage.getItem(src_AUTH_DATA_STORAGE_KEY)}catch(e){console.log(e)}try{var modeStorageData=localStorage.getItem(src_MODE_STORAGE_KEY);modeStorageData&&JSON.parse(modeStorageData)&&(activeMode=modeStorageData)}catch(e){console.log(e)}return src_applyMode(activeMode),storageData&&(authData=JSON.parse(storageData)),{authData:authData,userData:null,breadcrumbs:null,systemMode:activeMode,toolsPanelState:{isOpen:!1,tab:src_ToolsTabs.TUTORIAL},helpPanel:{content:{}},tutorialPanel:{billingCompleted:!1,configureCLICompleted:!1,discordCompleted:!1,tallyCompleted:!1,quickStartCompleted:!1}}},src_initialState=src_slice_getInitialState();var src_appSlice=src_createSlice({name:"app",initialState:src_initialState,reducers:{setAuthData:function(state,action){state.authData=action.payload;try{localStorage.setItem(src_AUTH_DATA_STORAGE_KEY,JSON.stringify(action.payload))}catch(e){console.log(e)}},setSystemMode:function(state,action){state.systemMode=action.payload,src_applyMode(action.payload);try{localStorage.setItem(src_MODE_STORAGE_KEY,action.payload)}catch(e){console.log(e)}},removeAuthData:function(state){state.authData=null;try{localStorage.removeItem(src_AUTH_DATA_STORAGE_KEY)}catch(e){console.log(e)}},setUserData:function(state,action){state.userData=action.payload},setBreadcrumb:function(state,action){state.breadcrumbs=action.payload},openHelpPanel:function(state,action){state.toolsPanelState={isOpen:!0,tab:src_ToolsTabs.INFO},state.helpPanel={content:action.payload}},openTutorialPanel:function(state){state.toolsPanelState={isOpen:!0,tab:src_ToolsTabs.TUTORIAL}},closeToolsPanel:function(state){state.toolsPanelState=src_slice_objectSpread(src_slice_objectSpread({},state.toolsPanelState),{},{isOpen:!1})},setToolsTab:function(state,action){state.toolsPanelState=src_slice_objectSpread(src_slice_objectSpread({},state.toolsPanelState),{},{tab:action.payload})},updateTutorialPanelState:function(state,action){state.tutorialPanel=src_slice_objectSpread(src_slice_objectSpread({},state.tutorialPanel),action.payload)}}});var src_appSlice$actions=src_appSlice.actions,src_setAuthData=src_appSlice$actions.setAuthData,src_setSystemMode=src_appSlice$actions.setSystemMode,src_removeAuthData=src_appSlice$actions.removeAuthData,src_setUserData=src_appSlice$actions.setUserData,src_setBreadcrumb=src_appSlice$actions.setBreadcrumb,src_openHelpPanel=src_appSlice$actions.openHelpPanel,src_closeToolsPanel=src_appSlice$actions.closeToolsPanel,src_setToolsTab=src_appSlice$actions.setToolsTab,src_openTutorialPanel=src_appSlice$actions.openTutorialPanel,src_updateTutorialPanelState=src_appSlice$actions.updateTutorialPanelState;var src_selectUserData=function(state){return state.app.userData};var src_selectAuthToken=function(state){var _state$app$authData;return null===(_state$app$authData=state.app.authData)||void 0===_state$app$authData?void 0:_state$app$authData.token};var src_slice_selectUserName=function(state){var _state$app$userData;return null===(_state$app$userData=state.app.userData)||void 0===_state$app$userData?void 0:_state$app$userData.username};var src_selectBreadcrumbs=function(state){return state.app.breadcrumbs};var src_selectToolsPanelState=function(state){return state.app.toolsPanelState};var src_selectHelpPanelContent=function(state){return state.app.helpPanel.content};var src_selectTutorialPanel=function(state){return state.app.tutorialPanel};var src_selectSystemMode=function(state){return state.app.systemMode};/* harmony default export */ const src_App_slice = (src_appSlice.reducer);
119411
+ function src_slice_ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function src_slice_objectSpread(e){for(var t,r=1;r<arguments.length;r++)t=null==arguments[r]?{}:arguments[r],r%2?src_slice_ownKeys(Object(t),!0).forEach(function(r){src_defineProperty_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):src_slice_ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))});return e}var src_slice_getInitialState=function(){var authData=null,storageData=null,activeMode=src_getThemeMode();try{storageData=localStorage.getItem(src_AUTH_DATA_STORAGE_KEY)}catch(e){console.log(e)}try{var modeStorageData=localStorage.getItem(src_MODE_STORAGE_KEY);modeStorageData&&(activeMode=modeStorageData)}catch(e){console.log(e)}return src_applyMode(activeMode),storageData&&(authData=JSON.parse(storageData)),{authData:authData,userData:null,breadcrumbs:null,systemMode:activeMode,toolsPanelState:{isOpen:!1,tab:src_ToolsTabs.TUTORIAL},helpPanel:{content:{}},tutorialPanel:{billingCompleted:!1,configureCLICompleted:!1,discordCompleted:!1,tallyCompleted:!1,quickStartCompleted:!1}}},src_initialState=src_slice_getInitialState();var src_appSlice=src_createSlice({name:"app",initialState:src_initialState,reducers:{setAuthData:function(state,action){state.authData=action.payload;try{localStorage.setItem(src_AUTH_DATA_STORAGE_KEY,JSON.stringify(action.payload))}catch(e){console.log(e)}},setSystemMode:function(state,action){state.systemMode=action.payload,src_applyMode(action.payload);try{localStorage.setItem(src_MODE_STORAGE_KEY,action.payload)}catch(e){console.log(e)}},removeAuthData:function(state){state.authData=null;try{localStorage.removeItem(src_AUTH_DATA_STORAGE_KEY)}catch(e){console.log(e)}},setUserData:function(state,action){state.userData=action.payload},setBreadcrumb:function(state,action){state.breadcrumbs=action.payload},openHelpPanel:function(state,action){state.toolsPanelState={isOpen:!0,tab:src_ToolsTabs.INFO},state.helpPanel={content:action.payload}},openTutorialPanel:function(state){state.toolsPanelState={isOpen:!0,tab:src_ToolsTabs.TUTORIAL}},closeToolsPanel:function(state){state.toolsPanelState=src_slice_objectSpread(src_slice_objectSpread({},state.toolsPanelState),{},{isOpen:!1})},setToolsTab:function(state,action){state.toolsPanelState=src_slice_objectSpread(src_slice_objectSpread({},state.toolsPanelState),{},{tab:action.payload})},updateTutorialPanelState:function(state,action){state.tutorialPanel=src_slice_objectSpread(src_slice_objectSpread({},state.tutorialPanel),action.payload)}}});var src_appSlice$actions=src_appSlice.actions,src_setAuthData=src_appSlice$actions.setAuthData,src_setSystemMode=src_appSlice$actions.setSystemMode,src_removeAuthData=src_appSlice$actions.removeAuthData,src_setUserData=src_appSlice$actions.setUserData,src_setBreadcrumb=src_appSlice$actions.setBreadcrumb,src_openHelpPanel=src_appSlice$actions.openHelpPanel,src_closeToolsPanel=src_appSlice$actions.closeToolsPanel,src_setToolsTab=src_appSlice$actions.setToolsTab,src_openTutorialPanel=src_appSlice$actions.openTutorialPanel,src_updateTutorialPanelState=src_appSlice$actions.updateTutorialPanelState;var src_selectUserData=function(state){return state.app.userData};var src_selectAuthToken=function(state){var _state$app$authData;return null===(_state$app$authData=state.app.authData)||void 0===_state$app$authData?void 0:_state$app$authData.token};var src_slice_selectUserName=function(state){var _state$app$userData;return null===(_state$app$userData=state.app.userData)||void 0===_state$app$userData?void 0:_state$app$userData.username};var src_selectBreadcrumbs=function(state){return state.app.breadcrumbs};var src_selectToolsPanelState=function(state){return state.app.toolsPanelState};var src_selectHelpPanelContent=function(state){return state.app.helpPanel.content};var src_selectTutorialPanel=function(state){return state.app.tutorialPanel};var src_selectSystemMode=function(state){return state.app.systemMode};/* harmony default export */ const src_App_slice = (src_appSlice.reducer);
119412
119412
  ;// ./src/hooks/useBreadcrumbs.ts
119413
119413
  var src_useBreadcrumbs_useBreadcrumbs=function(breadcrumbs){var dispatch=src_hooks_useAppDispatch();(0,src_react.useEffect)(function(){return dispatch(src_setBreadcrumb(breadcrumbs)),function(){dispatch(src_setBreadcrumb(null))}},[breadcrumbs])};
119414
119414
  ;// ./src/components/Notifications/slice.ts
@@ -125032,7 +125032,7 @@ var src_serverApi=src_rtk_query_react_esm_createApi({reducerPath:"serverApi",bas
125032
125032
  ;// ./src/layouts/AppLayout/TutorialPanel/constants.tsx
125033
125033
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
125034
125034
  // SPDX-License-Identifier: MIT-0
125035
- var src_constants_tutorialPanelI18nStrings={labelsTaskStatus:{pending:"Pending","in-progress":"In progress",success:"Success"},loadingText:"Loading",tutorialListTitle:"Take a tour",tutorialListDescription:"Follow the tutorials below to get up to speed with dstack Sky.",tutorialListDownloadLinkText:"Download PDF version",tutorialCompletedText:"Completed",labelExitTutorial:"dismiss tutorial",learnMoreLinkText:"Learn more",startTutorialButtonText:"Start",restartTutorialButtonText:"Restart",completionScreenTitle:"Congratulations! You completed it.",feedbackLinkText:"Feedback",dismissTutorialButtonText:"Dismiss",taskTitle:function(taskIndex,_taskTitle){return"Task ".concat(taskIndex+1,": ").concat(_taskTitle)},stepTitle:function(stepIndex,_stepTitle){return"Step ".concat(stepIndex+1,": ").concat(_stepTitle)},labelTotalSteps:function(totalStepCount){return"Total steps: ".concat(totalStepCount)},labelLearnMoreExternalIcon:"Opens in a new tab",labelTutorialListDownloadLink:"Download PDF version of this tutorial",labelLearnMoreLink:"Learn more about transcribe audio (opens new tab)"};var src_overlayI18nStrings={stepCounterText:function(stepIndex,totalStepCount){return"Step ".concat(stepIndex+1,"/").concat(totalStepCount)},taskTitle:function(taskIndex,_taskTitle2){return"Task ".concat(taskIndex+1,": ").concat(_taskTitle2)},labelHotspot:function(openState,stepIndex,totalStepCount){return openState?"close annotation for step ".concat(stepIndex+1," of ").concat(totalStepCount):"open annotation for step ".concat(stepIndex+1," of ").concat(totalStepCount)},nextButtonText:"Next",previousButtonText:"Previous",finishButtonText:"Finish",labelDismissAnnotation:"hide annotation"};var src_constants_HotspotIds=/*#__PURE__*/function(HotspotIds){return HotspotIds.ADD_TOP_UP_BALANCE="billing-top-up-balance",HotspotIds.PAYMENT_CONTINUE_BUTTON="billing-payment-continue-button",HotspotIds.CONFIGURE_CLI_COMMAND="configure-cli-command",HotspotIds}({});var src_BILLING_TUTORIAL={completed:!1,title:"Set up billing",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Top up your balance via a credit card to use GPU by dstack Sky.")),completedScreenDescription:"TBA",tasks:[{title:"Add payment method",steps:[{title:"Click Top up balance button",content:"Click Top up balance button",hotspotId:src_constants_HotspotIds.ADD_TOP_UP_BALANCE},{title:"Click continue",content:"Please, click continue",hotspotId:src_constants_HotspotIds.PAYMENT_CONTINUE_BUTTON}]}]};var src_CONFIGURE_CLI_TUTORIAL={completed:!1,title:"Set up the CLI",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Configure the CLI on your local machine to submit workload to dstack Sky.")),completedScreenDescription:"TBA",tasks:[{title:"Configure the CLI",steps:[{title:"Run the dstack config command",content:"Run this command on your local machine to configure the dstack CLI.",hotspotId:src_constants_HotspotIds.CONFIGURE_CLI_COMMAND}]}]};var src_JOIN_DISCORD_TUTORIAL={completed:!1,title:"Community",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Need help or want to chat with other users of dstack? Join our Discord server!")),completedScreenDescription:"TBA",tasks:[]};var src_QUICKSTART_TUTORIAL={completed:!1,title:"Quickstart",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Check out the quickstart guide to get started with dstack")),completedScreenDescription:"TBA",tasks:[]};var src_CREDITS_TUTORIAL={completed:!1,title:"Get free credits",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Tell us about your project and get some free credits to try dstack Sky!")),completedScreenDescription:"TBA",tasks:[]};
125035
+ var src_constants_tutorialPanelI18nStrings={labelsTaskStatus:{pending:"Pending","in-progress":"In progress",success:"Success"},loadingText:"Loading",tutorialListTitle:"Take a tour",tutorialListDescription:"Follow the tutorials below to get up to speed with dstack Sky.",tutorialListDownloadLinkText:"Download PDF version",tutorialCompletedText:"Completed",labelExitTutorial:"dismiss tutorial",learnMoreLinkText:"Learn more",startTutorialButtonText:"Start",restartTutorialButtonText:"Restart",completionScreenTitle:"Congratulations! You completed it.",feedbackLinkText:"Feedback",dismissTutorialButtonText:"Dismiss",taskTitle:function(taskIndex,_taskTitle){return"Task ".concat(taskIndex+1,": ").concat(_taskTitle)},stepTitle:function(stepIndex,_stepTitle){return"Step ".concat(stepIndex+1,": ").concat(_stepTitle)},labelTotalSteps:function(totalStepCount){return"Total steps: ".concat(totalStepCount)},labelLearnMoreExternalIcon:"Opens in a new tab",labelTutorialListDownloadLink:"Download PDF version of this tutorial",labelLearnMoreLink:"Learn more about transcribe audio (opens new tab)"};var src_overlayI18nStrings={stepCounterText:function(stepIndex,totalStepCount){return"Step ".concat(stepIndex+1,"/").concat(totalStepCount)},taskTitle:function(taskIndex,_taskTitle2){return"Task ".concat(taskIndex+1,": ").concat(_taskTitle2)},labelHotspot:function(openState,stepIndex,totalStepCount){return openState?"close annotation for step ".concat(stepIndex+1," of ").concat(totalStepCount):"open annotation for step ".concat(stepIndex+1," of ").concat(totalStepCount)},nextButtonText:"Next",previousButtonText:"Previous",finishButtonText:"Finish",labelDismissAnnotation:"hide annotation"};var src_constants_HotspotIds=/*#__PURE__*/function(HotspotIds){return HotspotIds.ADD_TOP_UP_BALANCE="billing-top-up-balance",HotspotIds.PAYMENT_CONTINUE_BUTTON="billing-payment-continue-button",HotspotIds.CONFIGURE_CLI_COMMAND="configure-cli-command",HotspotIds}({});var src_BILLING_TUTORIAL={completed:!1,title:"Set up billing",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Top up your balance via a credit card to use GPU by dstack Sky.")),completedScreenDescription:"TBA",tasks:[{title:"Add payment method",steps:[{title:"Click Top up balance button",content:"Click Top up balance button",hotspotId:src_constants_HotspotIds.ADD_TOP_UP_BALANCE},{title:"Click continue",content:"Please, click continue",hotspotId:src_constants_HotspotIds.PAYMENT_CONTINUE_BUTTON}]}]};var src_CONFIGURE_CLI_TUTORIAL={completed:!1,title:"Set up the CLI",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Configure the CLI on your local machine to submit workload to dstack Sky.")),completedScreenDescription:"TBA",tasks:[{title:"Configure the CLI",steps:[{title:"Run the dstack project add command",content:"Run this command on your local machine to configure the dstack CLI.",hotspotId:src_constants_HotspotIds.CONFIGURE_CLI_COMMAND}]}]};var src_JOIN_DISCORD_TUTORIAL={completed:!1,title:"Community",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Need help or want to chat with other users of dstack? Join our Discord server!")),completedScreenDescription:"TBA",tasks:[]};var src_QUICKSTART_TUTORIAL={completed:!1,title:"Quickstart",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Check out the quickstart guide to get started with dstack")),completedScreenDescription:"TBA",tasks:[]};var src_CREDITS_TUTORIAL={completed:!1,title:"Get free credits",description:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement(src_box_Box,{variant:"p",color:"text-body-secondary",padding:{top:"n"}},"Tell us about your project and get some free credits to try dstack Sky!")),completedScreenDescription:"TBA",tasks:[]};
125036
125036
  ;// ./src/consts.ts
125037
125037
  var src_consts_DATE_TIME_FORMAT="MM/dd/yyyy HH:mm";var src_DISCORD_URL="https://discord.gg/u8SmfwPpMd";var src_QUICK_START_URL="https://dstack.ai/docs/quickstart/";var src_TALLY_FORM_ID="3xYlYG";var src_DOCS_URL="https://dstack.ai/docs/";var src_DEFAULT_TABLE_PAGE_SIZE=20;
125038
125038
  ;// ./src/libs/run.ts
@@ -133973,7 +133973,7 @@ var src_SEARCHABLE_COLUMNS=["project_name","owner.username"];var src_ProjectList
133973
133973
  ;// ./src/pages/Project/Details/index.tsx
133974
133974
  var src_ProjectDetails=function(){var _params$projectName,params=src_dist_useParams(),paramProjectName=null!==(_params$projectName=params.projectName)&&void 0!==_params$projectName?_params$projectName:"";return/*#__PURE__*/src_react.createElement(src_ContentLayout,{header:/*#__PURE__*/src_react.createElement(src_DetailsHeader,{title:paramProjectName})},/*#__PURE__*/src_react.createElement(src_Outlet,null))};
133975
133975
  ;// ./src/pages/Project/hooks/useConfigProjectCliComand.ts
133976
- var src_useConfigProjectCliCommand=function(_ref){var projectName=_ref.projectName,currentUserToken=src_hooks_useAppSelector(src_selectAuthToken),cliCommand="dstack config --url ".concat(location.origin," --project ").concat(projectName," --token ").concat(currentUserToken);return[cliCommand,function(){src_copyToClipboard(cliCommand)}]};
133976
+ var src_useConfigProjectCliCommand=function(_ref){var projectName=_ref.projectName,currentUserToken=src_hooks_useAppSelector(src_selectAuthToken),cliCommand="dstack project add --name ".concat(projectName," --url ").concat(location.origin," --token ").concat(currentUserToken);return[cliCommand,function(){src_copyToClipboard(cliCommand)}]};
133977
133977
  ;// ./src/pages/Project/Members/UsersAutosuggest/index.tsx
133978
133978
  var src_UsersAutosuggest_excluded=["optionsFilter","onSelect"];var src_UserAutosuggest=function(_ref){var optionsFilter=_ref.optionsFilter,onSelectProp=_ref.onSelect,props=src_objectWithoutProperties_objectWithoutProperties(_ref,src_UsersAutosuggest_excluded),_useTranslation=src_useTranslation_useTranslation(),t=_useTranslation.t,_useState=(0,src_react.useState)(""),_useState2=src_slicedToArray_slicedToArray(_useState,2),value=_useState2[0],setValue=_useState2[1],_useGetUserListQuery=src_useGetUserListQuery(),usersData=_useGetUserListQuery.data,isUsersLoading=_useGetUserListQuery.isLoading,options=(0,src_react.useMemo)(function(){return usersData?usersData.map(function(user){return{value:user.username}}):[]},[usersData]),filteredOptions=optionsFilter?optionsFilter(options):options;return/*#__PURE__*/src_react.createElement(src_autosuggest,src_extends_extends({value:value,enteredTextLabel:function(text){return"".concat(t("users_autosuggest.entered_text")," ").concat(text)},onChange:function(_ref2){var detail=_ref2.detail;return setValue(detail.value)},options:filteredOptions,statusType:isUsersLoading?"loading":void 0,loadingText:t("users_autosuggest.loading"),placeholder:t("users_autosuggest.placeholder"),empty:t("users_autosuggest.no_match"),onSelect:function(args){onSelectProp&&args.detail.value&&onSelectProp(args),setValue("")}},props))};
133979
133979
  ;// ./src/pages/Project/Members/styles.module.scss
@@ -133990,7 +133990,7 @@ var src_useBackendsTable=function(projectName,backends){var _useTranslation=src_
133990
133990
  ;// ./src/pages/Project/Backends/hooks/index.ts
133991
133991
 
133992
133992
  ;// ./src/pages/Project/Backends/Table/constants.tsx
133993
- var src_BACKENDS_HELP_SKY={header:/*#__PURE__*/src_react.createElement("h2",null,"SKy Backends"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"Some text"))};var src_BACKENDS_HELP_ENTERPRISE={header:/*#__PURE__*/src_react.createElement("h2",null,"Enterprise Backends"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"Some text"))};
133993
+ var src_BACKENDS_HELP_SKY={header:/*#__PURE__*/src_react.createElement("h2",null,"Backends"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"To use ",/*#__PURE__*/src_react.createElement("code",null,"dstack")," with cloud providers, you have to configure backends."),/*#__PURE__*/src_react.createElement("h4",null,"Marketplace"),/*#__PURE__*/src_react.createElement("p",null,"By default, ",/*#__PURE__*/src_react.createElement("code",null,"dstack Sky")," includes a preset of backends that let you access compute from the "," ",/*#__PURE__*/src_react.createElement("code",null,"dstack")," marketplace and pay through your ",/*#__PURE__*/src_react.createElement("code",null,"dstack Sky")," user billing."),/*#__PURE__*/src_react.createElement("h4",null,"Your own cloud accounts"),/*#__PURE__*/src_react.createElement("p",null,"You can also configure custom backends to use your own cloud providers, either instead of or in addition to the default ones."),/*#__PURE__*/src_react.createElement("p",null,"See the ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/concepts/backends",target:"_blank"},"documentation")," for the list of supported backends."))};var src_BACKENDS_HELP_ENTERPRISE={header:/*#__PURE__*/src_react.createElement("h2",null,"Backends"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"To use ",/*#__PURE__*/src_react.createElement("code",null,"dstack")," with cloud providers, you have to configure backends."),/*#__PURE__*/src_react.createElement("p",null,"See the ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/concepts/backends",target:"_blank"},"documentation")," for the list of supported backends."))};
133994
133994
  ;// ./src/pages/Project/Backends/Table/styles.module.scss
133995
133995
  // extracted by mini-css-extract-plugin
133996
133996
  /* harmony default export */ const src_Table_styles_module = ({"cell":"biUJI","contextMenu":"A3asV","ellipsisCell":"kUgHm"});
@@ -134001,7 +134001,7 @@ var src_hooks_useColumnsDefinitions_useColumnsDefinitions=function(_ref){var loa
134001
134001
  ;// ./src/pages/Project/Backends/Table/index.tsx
134002
134002
  function src_Table_ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function src_Table_objectSpread(e){for(var t,r=1;r<arguments.length;r++)t=null==arguments[r]?{}:arguments[r],r%2?src_Table_ownKeys(Object(t),!0).forEach(function(r){src_defineProperty_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):src_Table_ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))});return e}var src_INFO= true?src_BACKENDS_HELP_ENTERPRISE:0;var src_BackendsTable=function(_ref){var backends=_ref.backends,editBackend=_ref.editBackend,deleteBackends=_ref.deleteBackends,onClickAddBackend=_ref.onClickAddBackend,isDisabledDelete=_ref.isDisabledDelete,_useTranslation=src_useTranslation_useTranslation(),t=_useTranslation.t,_useHelpPanel=src_useHelpPanel_useHelpPanel(),_useHelpPanel2=src_slicedToArray_slicedToArray(_useHelpPanel,1),openHelpPanel=_useHelpPanel2[0],renderEmptyMessage=function(){return/*#__PURE__*/src_react.createElement(src_ListEmptyMessage_ListEmptyMessage,{title:t("backend.empty_message_title"),message:t("backend.empty_message_text")},onClickAddBackend&&/*#__PURE__*/src_react.createElement(src_Button_Button,{onClick:onClickAddBackend},t("common.add")))},_useCollection=src_use_collection_useCollection(null!==backends&&void 0!==backends?backends:[],{filtering:{empty:renderEmptyMessage(),noMatch:renderEmptyMessage()},selection:{}}),items=_useCollection.items,collectionProps=_useCollection.collectionProps,selectedItems=collectionProps.selectedItems,isDisabledDeleteSelected=!(null!==selectedItems&&void 0!==selectedItems&&selectedItems.length)||isDisabledDelete,_useColumnsDefinition=src_hooks_useColumnsDefinitions_useColumnsDefinitions(src_Table_objectSpread({},editBackend?{onEditClick:function(backend){return editBackend(backend)}}:{})),columns=_useColumnsDefinition.columns;return/*#__PURE__*/src_react.createElement(src_table,src_extends_extends({},collectionProps,{columnDefinitions:columns,items:items,loadingText:t("common.loading"),selectionType:deleteBackends||editBackend?"multi":void 0,stickyHeader:!0,header:/*#__PURE__*/src_react.createElement(src_components_header_Header,{counter:function(){return null!==backends&&void 0!==backends&&backends.length?"(".concat(backends.length,")"):""}(),info:/*#__PURE__*/src_react.createElement(src_InfoLink_InfoLink,{onFollow:function(){return openHelpPanel(src_INFO)}}),actions:/*#__PURE__*/src_react.createElement(src_space_between_SpaceBetween,{size:"xs",direction:"horizontal"},deleteBackends&&/*#__PURE__*/src_react.createElement(src_ButtonWithConfirmation,{disabled:isDisabledDeleteSelected,formAction:"none",onClick:function(){null!==selectedItems&&void 0!==selectedItems&&selectedItems.length&&deleteBackends&&deleteBackends(selectedItems)},confirmTitle:t("backend.edit.delete_backends_confirm_title"),confirmContent:t("backend.edit.delete_backends_confirm_message")},t("common.delete")),onClickAddBackend&&/*#__PURE__*/src_react.createElement(src_Button_Button,{onClick:onClickAddBackend/*disabled={isDisabledAddBackendButton}*/},t("common.add")))},t("backend.page_title_other"))}))};
134003
134003
  ;// ./src/pages/Project/Gateways/Table/constants.tsx
134004
- var src_GATEWAYS_INFO={header:/*#__PURE__*/src_react.createElement("h2",null,"Gateways"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"Some text"))};
134004
+ var src_GATEWAYS_INFO={header:/*#__PURE__*/src_react.createElement("h2",null,"Gateways"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"Gateways manage the ingress traffic for running services."),/*#__PURE__*/src_react.createElement("p",null,"To learn more about gateways, see the ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/concepts/gateways",target:"_blank"},"documentation"),"."))};
134005
134005
  ;// ./src/pages/Project/Gateways/Table/styles.module.scss
134006
134006
  // extracted by mini-css-extract-plugin
134007
134007
  /* harmony default export */ const src_Gateways_Table_styles_module = ({"cell":"naCdG","contextMenu":"_TtVL","ellipsisCell":"FLA_c"});
@@ -134032,7 +134032,7 @@ var src_useGatewaysTable=function(projectName){var navigate=src_dist_useNavigate
134032
134032
  ;// ./src/pages/Project/Gateways/hooks/index.ts
134033
134033
 
134034
134034
  ;// ./src/pages/Project/Details/Settings/constants.tsx
134035
- var src_CLI_INFO={header:/*#__PURE__*/src_react.createElement("h2",null,"CLI"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"Some text"))};
134035
+ var src_CLI_INFO={header:/*#__PURE__*/src_react.createElement("h2",null,"CLI"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"To use this project with your CLI, add it using the",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/reference/cli/dstack/project/",target:"_blank"},/*#__PURE__*/src_react.createElement("code",null,"dstack project add"))," command."),/*#__PURE__*/src_react.createElement("p",null,"To learn how to install the CLI, refer to the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/cli/installation",target:"_blank"},"installation")," guide."))};
134036
134036
  ;// ./src/pages/Project/Details/Settings/styles.module.scss
134037
134037
  // extracted by mini-css-extract-plugin
134038
134038
  /* harmony default export */ const src_Settings_styles_module = ({"dangerSectionGrid":"U24Qs","dangerSectionField":"AKyqV","codeWrapper":"LmVNG","code":"Vntdh","copy":"Wtjre"});
@@ -134045,7 +134045,7 @@ var src_ProjectAdd=function(){var _useTranslation=src_useTranslation_useTranslat
134045
134045
  ;// ./src/pages/Project/index.tsx
134046
134046
  var src_Project=function(){return null};
134047
134047
  ;// ./src/pages/Project/Backends/YAMLForm/constants.tsx
134048
- var src_CONFIG_YAML_HELP_SKY={header:/*#__PURE__*/src_react.createElement("h2",null,"Backend config"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"The backend config is defined in the YAML format. It specifies the backend's ",/*#__PURE__*/src_react.createElement("code",null,"type")," and settings,"," ","such as ",/*#__PURE__*/src_react.createElement("code",null,"creds"),", ",/*#__PURE__*/src_react.createElement("code",null,"regions"),", and so on."),/*#__PURE__*/src_react.createElement("h4",null,"Marketplace"),/*#__PURE__*/src_react.createElement("p",null,"If you set ",/*#__PURE__*/src_react.createElement("code",null,"creds"),"'s ",/*#__PURE__*/src_react.createElement("code",null,"type")," to ",/*#__PURE__*/src_react.createElement("code",null,"dstack"),", you'll get compute from"," ",/*#__PURE__*/src_react.createElement("code",null,"dstack"),"'s marketplace and will pay for it via your ",/*#__PURE__*/src_react.createElement("code",null,"dstack Sky")," user billing. Example:"),/*#__PURE__*/src_react.createElement("p",null,/*#__PURE__*/src_react.createElement("pre",null,"type: aws","\n","creds:","\n"," ","type: dstack","\n")),/*#__PURE__*/src_react.createElement("p",null,"You can see all supported backend types at the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/reference/server/config.yml/#examples",target:"_blank"},"documentation"),"."),/*#__PURE__*/src_react.createElement("h4",null,"Your own cloud account"),/*#__PURE__*/src_react.createElement("p",null,"If you want to use your own cloud account, configure ",/*#__PURE__*/src_react.createElement("code",null,"creds")," and other settings according to the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/reference/server/config.yml/#examples",target:"_blank"},"documentation"),". Example:"),/*#__PURE__*/src_react.createElement("p",null,/*#__PURE__*/src_react.createElement("pre",null,"type: aws","\n","creds:","\n"," ","type: access_key","\n"," ","access_key: AIZKISCVKUK","\n"," ","secret_key: QSbmpqJIUBn1")))};var src_CONFIG_YAML_HELP_ENTERPRISE={header:/*#__PURE__*/src_react.createElement("h2",null,"Backend config"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"The backend config is defined in the YAML format. It specifies the backend's ",/*#__PURE__*/src_react.createElement("code",null,"type")," and settings, such as ",/*#__PURE__*/src_react.createElement("code",null,"creds"),", ",/*#__PURE__*/src_react.createElement("code",null,"regions"),", and so on."),/*#__PURE__*/src_react.createElement("p",null,"Example:"),/*#__PURE__*/src_react.createElement("p",null,/*#__PURE__*/src_react.createElement("pre",null,"type: aws","\n","creds:","\n"," ","type: access_key","\n"," ","access_key: AIZKISCVKUK","\n"," ","secret_key: QSbmpqJIUBn1")),/*#__PURE__*/src_react.createElement("p",null,"Each backend type may support different properties. See the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/reference/server/config.yml/#examples"},"reference page")," for more examples."))};
134048
+ var src_CONFIG_YAML_HELP_SKY={header:/*#__PURE__*/src_react.createElement("h2",null,"Backend config"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"The backend config is defined in the YAML format. It specifies the backend's ",/*#__PURE__*/src_react.createElement("code",null,"type")," and settings,"," ","such as ",/*#__PURE__*/src_react.createElement("code",null,"creds"),", ",/*#__PURE__*/src_react.createElement("code",null,"regions"),", and so on."),/*#__PURE__*/src_react.createElement("h4",null,"Marketplace"),/*#__PURE__*/src_react.createElement("p",null,"If you set ",/*#__PURE__*/src_react.createElement("code",null,"creds"),"'s ",/*#__PURE__*/src_react.createElement("code",null,"type")," to ",/*#__PURE__*/src_react.createElement("code",null,"dstack"),", you'll get compute from"," ",/*#__PURE__*/src_react.createElement("code",null,"dstack"),"'s marketplace and will pay for it via your ",/*#__PURE__*/src_react.createElement("code",null,"dstack Sky")," user billing. Example:"),/*#__PURE__*/src_react.createElement("p",null,/*#__PURE__*/src_react.createElement("pre",null,"type: aws","\n","creds:","\n"," ","type: dstack","\n")),/*#__PURE__*/src_react.createElement("p",null,"You can see all supported backend types at the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/concepts/backends",target:"_blank"},"documentation"),"."),/*#__PURE__*/src_react.createElement("h4",null,"Your own cloud account"),/*#__PURE__*/src_react.createElement("p",null,"If you want to use your own cloud account, configure ",/*#__PURE__*/src_react.createElement("code",null,"creds")," and other settings according to the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/concepts/backends",target:"_blank"},"documentation"),". Example:"),/*#__PURE__*/src_react.createElement("p",null,/*#__PURE__*/src_react.createElement("pre",null,"type: aws","\n","creds:","\n"," ","type: access_key","\n"," ","access_key: AIZKISCVKUK","\n"," ","secret_key: QSbmpqJIUBn1")))};var src_CONFIG_YAML_HELP_ENTERPRISE={header:/*#__PURE__*/src_react.createElement("h2",null,"Backend config"),body:/*#__PURE__*/src_react.createElement(src_react.Fragment,null,/*#__PURE__*/src_react.createElement("p",null,"The backend config is defined in the YAML format. It specifies the backend's ",/*#__PURE__*/src_react.createElement("code",null,"type")," and settings, such as ",/*#__PURE__*/src_react.createElement("code",null,"creds"),", ",/*#__PURE__*/src_react.createElement("code",null,"regions"),", and so on."),/*#__PURE__*/src_react.createElement("p",null,"Example:"),/*#__PURE__*/src_react.createElement("p",null,/*#__PURE__*/src_react.createElement("pre",null,"type: aws","\n","creds:","\n"," ","type: access_key","\n"," ","access_key: AIZKISCVKUK","\n"," ","secret_key: QSbmpqJIUBn1")),/*#__PURE__*/src_react.createElement("p",null,"Each backend type may support different properties. See the"," ",/*#__PURE__*/src_react.createElement("a",{href:"https://dstack.ai/docs/concepts/backends",target:"_blank"},"documentaiton")," for more examples."))};
134049
134049
  ;// ./src/pages/Project/Backends/YAMLForm/index.tsx
134050
134050
  var src_YAMLForm_INFO= true?src_CONFIG_YAML_HELP_ENTERPRISE:0;var src_YAMLForm=function(_ref){var initialValues=_ref.initialValues,onCancel=_ref.onCancel,loading=_ref.loading,onSubmitProp=_ref.onSubmit,onApplyProp=_ref.onApply,_useTranslation=src_useTranslation_useTranslation(),t=_useTranslation.t,_useHelpPanel=src_useHelpPanel_useHelpPanel(),_useHelpPanel2=src_slicedToArray_slicedToArray(_useHelpPanel,1),openHelpPanel=_useHelpPanel2[0],_useNotifications=src_useNotifications_useNotifications(),_useNotifications2=src_slicedToArray_slicedToArray(_useNotifications,1),pushNotification=_useNotifications2[0],_useState=(0,src_react.useState)(!1),_useState2=src_slicedToArray_slicedToArray(_useState,2),isApplying=_useState2[0],setIsApplying=_useState2[1],_useForm=src_index_esm_useForm({defaultValues:initialValues}),handleSubmit=_useForm.handleSubmit,control=_useForm.control,setError=_useForm.setError,clearErrors=_useForm.clearErrors;return/*#__PURE__*/src_react.createElement("form",{onSubmit:handleSubmit(function(data){clearErrors();var submitCallback=isApplying&&onApplyProp?onApplyProp:onSubmitProp;submitCallback(data).finally(function(){return setIsApplying(!1)}).catch(function(errorResponse){var errorRequestData=null===errorResponse||void 0===errorResponse?void 0:errorResponse.data;if(src_isResponseServerError(errorRequestData))errorRequestData.detail.forEach(function(error){src_isResponseServerFormFieldError(error)?setError(error.loc.join("."),{type:"custom",message:error.msg}):pushNotification({type:"error",content:t("common.server_error",{error:error.msg})})});else{var _errorResponse$error;pushNotification({type:"error",content:t("common.server_error",{error:null!==(_errorResponse$error=null===errorResponse||void 0===errorResponse?void 0:errorResponse.error)&&void 0!==_errorResponse$error?_errorResponse$error:errorResponse})})}})})},/*#__PURE__*/src_react.createElement(src_form_Form,{actions:/*#__PURE__*/src_react.createElement(src_space_between_SpaceBetween,{direction:"horizontal",size:"xs"},/*#__PURE__*/src_react.createElement(src_Button_Button,{formAction:"none",disabled:loading,variant:"link",onClick:onCancel},t("common.cancel")),onApplyProp&&/*#__PURE__*/src_react.createElement(src_Button_Button,{loading:loading,disabled:loading,onClick:function(){return setIsApplying(!0)}},t("common.apply")),/*#__PURE__*/src_react.createElement(src_Button_Button,{loading:loading,disabled:loading,variant:"primary"},t("common.save")))},/*#__PURE__*/src_react.createElement(src_FormCodeEditor,{info:/*#__PURE__*/src_react.createElement(src_InfoLink_InfoLink,{onFollow:function(){return openHelpPanel(src_YAMLForm_INFO)}}),control:control,label:t("projects.edit.backend_config"),description:t("projects.edit.backend_config_description"),name:"config_yaml",language:"yaml",loading:loading,editorContentHeight:600})))};
134051
134051
  ;// ./src/pages/Project/Backends/Add/index.tsx
@@ -136477,4 +136477,4 @@ var src_container=document.getElementById("root"),src_src_theme={tokens:{fontFam
136477
136477
 
136478
136478
  /******/ })()
136479
136479
  ;
136480
- //# sourceMappingURL=main-b4f65323f5df007e1664.js.map
136480
+ //# sourceMappingURL=main-5b9786c955b42bf93581.js.map