skypilot-nightly 1.0.0.dev20250927__py3-none-any.whl → 1.0.0.dev20251001__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 skypilot-nightly might be problematic. Click here for more details.

Files changed (51) hide show
  1. sky/__init__.py +2 -2
  2. sky/backends/backend_utils.py +18 -10
  3. sky/backends/cloud_vm_ray_backend.py +2 -2
  4. sky/check.py +0 -29
  5. sky/client/cli/command.py +46 -25
  6. sky/client/cli/table_utils.py +58 -1
  7. sky/client/sdk.py +7 -18
  8. sky/core.py +15 -16
  9. sky/dashboard/out/404.html +1 -1
  10. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/{[pool]-07349868f7905d37.js → [pool]-509b2977a6373bf6.js} +1 -1
  11. sky/dashboard/out/_next/static/chunks/{webpack-7340bc0f0dd8ae74.js → webpack-4f0c389a4ce5fd9c.js} +1 -1
  12. sky/dashboard/out/_next/static/{UDSEoDB67vwFMZyCJ4HWU → m3YT2i5s6v4SsIdYc8WZa}/_buildManifest.js +1 -1
  13. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  14. sky/dashboard/out/clusters/[cluster].html +1 -1
  15. sky/dashboard/out/clusters.html +1 -1
  16. sky/dashboard/out/config.html +1 -1
  17. sky/dashboard/out/index.html +1 -1
  18. sky/dashboard/out/infra/[context].html +1 -1
  19. sky/dashboard/out/infra.html +1 -1
  20. sky/dashboard/out/jobs/[job].html +1 -1
  21. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  22. sky/dashboard/out/jobs.html +1 -1
  23. sky/dashboard/out/users.html +1 -1
  24. sky/dashboard/out/volumes.html +1 -1
  25. sky/dashboard/out/workspace/new.html +1 -1
  26. sky/dashboard/out/workspaces/[name].html +1 -1
  27. sky/dashboard/out/workspaces.html +1 -1
  28. sky/data/storage.py +11 -0
  29. sky/data/storage_utils.py +1 -45
  30. sky/jobs/client/sdk.py +3 -2
  31. sky/jobs/controller.py +15 -0
  32. sky/jobs/server/core.py +24 -2
  33. sky/jobs/server/server.py +1 -1
  34. sky/jobs/utils.py +2 -1
  35. sky/provision/kubernetes/instance.py +1 -1
  36. sky/schemas/api/responses.py +55 -0
  37. sky/server/common.py +2 -1
  38. sky/server/requests/serializers/decoders.py +8 -4
  39. sky/server/requests/serializers/encoders.py +6 -5
  40. sky/task.py +4 -0
  41. sky/utils/cluster_utils.py +23 -5
  42. sky/utils/command_runner.py +21 -5
  43. sky/utils/command_runner.pyi +11 -0
  44. sky/utils/volume.py +5 -0
  45. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/METADATA +37 -37
  46. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/RECORD +51 -51
  47. /sky/dashboard/out/_next/static/{UDSEoDB67vwFMZyCJ4HWU → m3YT2i5s6v4SsIdYc8WZa}/_ssgManifest.js +0 -0
  48. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/WHEEL +0 -0
  49. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/entry_points.txt +0 -0
  50. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/licenses/LICENSE +0 -0
  51. {skypilot_nightly-1.0.0.dev20250927.dist-info → skypilot_nightly-1.0.0.dev20251001.dist-info}/top_level.txt +0 -0
sky/__init__.py CHANGED
@@ -7,7 +7,7 @@ import urllib.request
7
7
  from sky.utils import directory_utils
8
8
 
9
9
  # Replaced with the current commit when building the wheels.
10
- _SKYPILOT_COMMIT_SHA = 'e42224b6d29bd960c0e0daa69add0fe2ad695142'
10
+ _SKYPILOT_COMMIT_SHA = '047e366ad4c073a5753b62cc5d4c3c4660b1476a'
11
11
 
12
12
 
13
13
  def _get_git_commit():
@@ -37,7 +37,7 @@ def _get_git_commit():
37
37
 
38
38
 
39
39
  __commit__ = _get_git_commit()
40
- __version__ = '1.0.0.dev20250927'
40
+ __version__ = '1.0.0.dev20251001'
41
41
  __root_dir__ = directory_utils.get_sky_dir()
42
42
 
43
43
 
@@ -723,11 +723,15 @@ def write_cluster_config(
723
723
  'is not supported by this cloud. Remove the config or set: '
724
724
  '`remote_identity: LOCAL_CREDENTIALS`.')
725
725
  if isinstance(cloud, clouds.Kubernetes):
726
- if skypilot_config.get_effective_region_config(
726
+ allowed_contexts = skypilot_config.get_workspace_cloud(
727
+ 'kubernetes').get('allowed_contexts', None)
728
+ if allowed_contexts is None:
729
+ allowed_contexts = skypilot_config.get_effective_region_config(
727
730
  cloud='kubernetes',
728
731
  region=None,
729
732
  keys=('allowed_contexts',),
730
- default_value=None) is None:
733
+ default_value=None)
734
+ if allowed_contexts is None:
731
735
  excluded_clouds.add(cloud)
732
736
  else:
733
737
  excluded_clouds.add(cloud)
@@ -2613,7 +2617,7 @@ def refresh_cluster_record(
2613
2617
  cluster_name: str,
2614
2618
  *,
2615
2619
  force_refresh_statuses: Optional[Set[status_lib.ClusterStatus]] = None,
2616
- acquire_per_cluster_status_lock: bool = True,
2620
+ cluster_lock_already_held: bool = False,
2617
2621
  cluster_status_lock_timeout: int = CLUSTER_STATUS_LOCK_TIMEOUT_SECONDS,
2618
2622
  include_user_info: bool = True,
2619
2623
  summary_response: bool = False) -> Optional[Dict[str, Any]]:
@@ -2633,9 +2637,13 @@ def refresh_cluster_record(
2633
2637
  _CLUSTER_STATUS_CACHE_DURATION_SECONDS old, and one of:
2634
2638
  1. the cluster is a spot cluster, or
2635
2639
  2. cluster autostop is set and the cluster is not STOPPED.
2636
- acquire_per_cluster_status_lock: Whether to acquire the per-cluster lock
2637
- before updating the status. Even if this is True, the lock may not be
2638
- acquired if the status does not need to be refreshed.
2640
+ cluster_lock_already_held: Whether the caller is already holding the
2641
+ per-cluster lock. You MUST NOT set this to True if the caller does not
2642
+ already hold the lock. If True, we will not acquire the lock before
2643
+ updating the status. Failing to hold the lock while updating the
2644
+ status can lead to correctness issues - e.g. an launch in-progress may
2645
+ appear to be DOWN incorrectly. Even if this is set to False, the lock
2646
+ may not be acquired if the status does not need to be refreshed.
2639
2647
  cluster_status_lock_timeout: The timeout to acquire the per-cluster
2640
2648
  lock. If timeout, the function will use the cached status. If the
2641
2649
  value is <0, do not timeout (wait for the lock indefinitely). By
@@ -2686,7 +2694,7 @@ def refresh_cluster_record(
2686
2694
  if not _must_refresh_cluster_status(record, force_refresh_statuses):
2687
2695
  return record
2688
2696
 
2689
- if not acquire_per_cluster_status_lock:
2697
+ if cluster_lock_already_held:
2690
2698
  return _update_cluster_status(cluster_name, include_user_info,
2691
2699
  summary_response)
2692
2700
 
@@ -2740,7 +2748,7 @@ def refresh_cluster_status_handle(
2740
2748
  cluster_name: str,
2741
2749
  *,
2742
2750
  force_refresh_statuses: Optional[Set[status_lib.ClusterStatus]] = None,
2743
- acquire_per_cluster_status_lock: bool = True,
2751
+ cluster_lock_already_held: bool = False,
2744
2752
  cluster_status_lock_timeout: int = CLUSTER_STATUS_LOCK_TIMEOUT_SECONDS
2745
2753
  ) -> Tuple[Optional[status_lib.ClusterStatus],
2746
2754
  Optional[backends.ResourceHandle]]:
@@ -2753,7 +2761,7 @@ def refresh_cluster_status_handle(
2753
2761
  record = refresh_cluster_record(
2754
2762
  cluster_name,
2755
2763
  force_refresh_statuses=force_refresh_statuses,
2756
- acquire_per_cluster_status_lock=acquire_per_cluster_status_lock,
2764
+ cluster_lock_already_held=cluster_lock_already_held,
2757
2765
  cluster_status_lock_timeout=cluster_status_lock_timeout,
2758
2766
  include_user_info=False,
2759
2767
  summary_response=True)
@@ -3078,7 +3086,7 @@ def _refresh_cluster(
3078
3086
  record = refresh_cluster_record(
3079
3087
  cluster_name,
3080
3088
  force_refresh_statuses=force_refresh_statuses,
3081
- acquire_per_cluster_status_lock=True,
3089
+ cluster_lock_already_held=False,
3082
3090
  include_user_info=include_user_info,
3083
3091
  summary_response=summary_response)
3084
3092
  except (exceptions.ClusterStatusFetchingError,
@@ -5121,7 +5121,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5121
5121
  # observed in AWS. See also
5122
5122
  # _LAUNCH_DOUBLE_CHECK_WINDOW in backend_utils.py.
5123
5123
  force_refresh_statuses={status_lib.ClusterStatus.INIT},
5124
- acquire_per_cluster_status_lock=False))
5124
+ cluster_lock_already_held=True))
5125
5125
  cluster_status_fetched = True
5126
5126
  except exceptions.ClusterStatusFetchingError:
5127
5127
  logger.warning(
@@ -5725,7 +5725,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5725
5725
  record = backend_utils.refresh_cluster_record(
5726
5726
  cluster_name,
5727
5727
  force_refresh_statuses={status_lib.ClusterStatus.INIT},
5728
- acquire_per_cluster_status_lock=False,
5728
+ cluster_lock_already_held=True,
5729
5729
  include_user_info=False,
5730
5730
  summary_response=True,
5731
5731
  )
sky/check.py CHANGED
@@ -621,35 +621,6 @@ def _format_enabled_cloud(cloud_name: str,
621
621
  if cloud_name in [repr(sky_clouds.Kubernetes()), repr(sky_clouds.SSH())]:
622
622
  return (f'{title}' + _format_context_details(
623
623
  cloud_name, show_details=False, ctx2text=ctx2text))
624
-
625
- if cloud_name == repr(sky_clouds.Kubernetes()):
626
- # Get enabled contexts for Kubernetes
627
- existing_contexts = sky_clouds.Kubernetes.existing_allowed_contexts()
628
- if not existing_contexts:
629
- return _green_color(cloud_and_capabilities)
630
-
631
- # Check if allowed_contexts is explicitly set in config
632
- allowed_contexts = skypilot_config.get_effective_region_config(
633
- cloud='kubernetes',
634
- region=None,
635
- keys=('allowed_contexts',),
636
- default_value=None)
637
-
638
- # Format the context info with consistent styling
639
- if allowed_contexts is not None:
640
- contexts_formatted = []
641
- for i, context in enumerate(existing_contexts):
642
- symbol = (ux_utils.INDENT_LAST_SYMBOL
643
- if i == len(existing_contexts) -
644
- 1 else ux_utils.INDENT_SYMBOL)
645
- contexts_formatted.append(f'\n {symbol}{context}')
646
- context_info = f' Allowed contexts:{"".join(contexts_formatted)}'
647
- else:
648
- context_info = f' Active context: {existing_contexts[0]}'
649
-
650
- return (f'{_green_color(cloud_and_capabilities)}\n'
651
- f' {colorama.Style.DIM}{context_info}'
652
- f'{colorama.Style.RESET_ALL}')
653
624
  return _green_color(cloud_and_capabilities)
654
625
 
655
626
 
sky/client/cli/command.py CHANGED
@@ -60,7 +60,6 @@ from sky.adaptors import common as adaptors_common
60
60
  from sky.client import sdk
61
61
  from sky.client.cli import flags
62
62
  from sky.client.cli import table_utils
63
- from sky.data import storage_utils
64
63
  from sky.provision.kubernetes import constants as kubernetes_constants
65
64
  from sky.provision.kubernetes import utils as kubernetes_utils
66
65
  from sky.schemas.api import responses
@@ -88,6 +87,7 @@ from sky.utils import status_lib
88
87
  from sky.utils import subprocess_utils
89
88
  from sky.utils import timeline
90
89
  from sky.utils import ux_utils
90
+ from sky.utils import volume as volume_utils
91
91
  from sky.utils import yaml_utils
92
92
  from sky.utils.cli_utils import status_utils
93
93
  from sky.volumes import utils as volumes_utils
@@ -1322,7 +1322,7 @@ def exec(
1322
1322
 
1323
1323
 
1324
1324
  def _handle_jobs_queue_request(
1325
- request_id: server_common.RequestId[List[Dict[str, Any]]],
1325
+ request_id: server_common.RequestId[List[responses.ManagedJobRecord]],
1326
1326
  show_all: bool,
1327
1327
  show_user: bool,
1328
1328
  max_num_jobs_to_show: Optional[int],
@@ -1395,10 +1395,10 @@ def _handle_jobs_queue_request(
1395
1395
  msg += ('Failed to query managed jobs: '
1396
1396
  f'{common_utils.format_exception(e, use_bracket=True)}')
1397
1397
  else:
1398
- msg = managed_jobs.format_job_table(managed_jobs_,
1399
- show_all=show_all,
1400
- show_user=show_user,
1401
- max_jobs=max_num_jobs_to_show)
1398
+ msg = table_utils.format_job_table(managed_jobs_,
1399
+ show_all=show_all,
1400
+ show_user=show_user,
1401
+ max_jobs=max_num_jobs_to_show)
1402
1402
  return num_in_progress_jobs, msg
1403
1403
 
1404
1404
 
@@ -1513,9 +1513,9 @@ def _status_kubernetes(show_all: bool):
1513
1513
  click.echo(f'\n{colorama.Fore.CYAN}{colorama.Style.BRIGHT}'
1514
1514
  f'Managed jobs'
1515
1515
  f'{colorama.Style.RESET_ALL}')
1516
- msg = managed_jobs.format_job_table(all_jobs,
1517
- show_all=show_all,
1518
- show_user=False)
1516
+ msg = table_utils.format_job_table(all_jobs,
1517
+ show_all=show_all,
1518
+ show_user=False)
1519
1519
  click.echo(msg)
1520
1520
  if any(['sky-serve-controller' in c.cluster_name for c in all_clusters]):
1521
1521
  # TODO: Parse serve controllers and show services separately.
@@ -2963,9 +2963,9 @@ def _hint_or_raise_for_down_jobs_controller(controller_name: str,
2963
2963
  'jobs (output of `sky jobs queue`) will be lost.')
2964
2964
  click.echo(msg)
2965
2965
  if managed_jobs_:
2966
- job_table = managed_jobs.format_job_table(managed_jobs_,
2967
- show_all=False,
2968
- show_user=True)
2966
+ job_table = table_utils.format_job_table(managed_jobs_,
2967
+ show_all=False,
2968
+ show_user=True)
2969
2969
  msg = controller.value.decline_down_for_dirty_controller_hint
2970
2970
  # Add prefix to each line to align with the bullet point.
2971
2971
  msg += '\n'.join(
@@ -4027,8 +4027,7 @@ def storage_ls(verbose: bool):
4027
4027
  """List storage objects managed by SkyPilot."""
4028
4028
  request_id = sdk.storage_ls()
4029
4029
  storages = sdk.stream_and_get(request_id)
4030
- storage_table = storage_utils.format_storage_table(storages,
4031
- show_all=verbose)
4030
+ storage_table = table_utils.format_storage_table(storages, show_all=verbose)
4032
4031
  click.echo(storage_table)
4033
4032
 
4034
4033
 
@@ -4123,13 +4122,15 @@ def volumes():
4123
4122
  @click.option('--infra',
4124
4123
  required=False,
4125
4124
  type=str,
4126
- help='Infra. Format: k8s, k8s/context-name. '
4125
+ help='Infrastructure to use. '
4126
+ 'Format: cloud, cloud/region, cloud/region/zone, or '
4127
+ 'k8s/context-name.'
4128
+ 'Examples: k8s, k8s/my-context, runpod/US/US-CA-2. '
4127
4129
  'Override the infra defined in the YAML.')
4128
- @click.option(
4129
- '--type',
4130
- required=False,
4131
- type=str,
4132
- help='Volume type. Format: pvc. Override the type defined in the YAML.')
4130
+ @click.option('--type',
4131
+ required=False,
4132
+ type=click.Choice(volume_utils.VolumeType.supported_types()),
4133
+ help='Volume type. Override the type defined in the YAML.')
4133
4134
  @click.option('--size',
4134
4135
  required=False,
4135
4136
  type=str,
@@ -4160,7 +4161,7 @@ def volumes_apply(
4160
4161
  sky volumes apply volume.yaml
4161
4162
  \b
4162
4163
  # Apply a volume from a command.
4163
- sky volumes apply --name pvc1 --infra k8s --type pvc --size 100Gi
4164
+ sky volumes apply --name pvc1 --infra k8s --type k8s-pvc --size 100Gi
4164
4165
  """
4165
4166
  # pylint: disable=import-outside-toplevel
4166
4167
  from sky.volumes import volume as volume_lib
@@ -4497,10 +4498,30 @@ def jobs_launch(
4497
4498
  job_id_handle = _async_call_or_wait(request_id, async_call,
4498
4499
  'sky.jobs.launch')
4499
4500
 
4500
- if not async_call and not detach_run:
4501
- job_ids = job_id_handle[0]
4502
- if isinstance(job_ids, int) or len(job_ids) == 1:
4503
- job_id = job_ids if isinstance(job_ids, int) else job_ids[0]
4501
+ if async_call:
4502
+ return
4503
+
4504
+ job_ids = [job_id_handle[0]] if isinstance(job_id_handle[0],
4505
+ int) else job_id_handle[0]
4506
+ if pool:
4507
+ # Display the worker assignment for the jobs.
4508
+ logger.debug(f'Getting service records for pool: {pool}')
4509
+ records_request_id = managed_jobs.pool_status(pool_names=pool)
4510
+ service_records = _async_call_or_wait(records_request_id, async_call,
4511
+ 'sky.jobs.pool_status')
4512
+ logger.debug(f'Pool status: {service_records}')
4513
+ replica_infos = service_records[0]['replica_info']
4514
+ for replica_info in replica_infos:
4515
+ job_id = replica_info.get('used_by', None)
4516
+ if job_id in job_ids:
4517
+ worker_id = replica_info['replica_id']
4518
+ version = replica_info['version']
4519
+ logger.info(f'Job ID: {job_id} assigned to pool {pool} '
4520
+ f'(worker: {worker_id}, version: {version})')
4521
+
4522
+ if not detach_run:
4523
+ if len(job_ids) == 1:
4524
+ job_id = job_ids[0]
4504
4525
  returncode = managed_jobs.tail_logs(name=None,
4505
4526
  job_id=job_id,
4506
4527
  follow=True,
@@ -1,7 +1,10 @@
1
1
  """Utilities for formatting tables for CLI output."""
2
- from typing import List
2
+ from typing import List, Optional
3
3
 
4
+ from sky.jobs import utils as managed_jobs
4
5
  from sky.schemas.api import responses
6
+ from sky.skylet import constants
7
+ from sky.utils import common_utils
5
8
  from sky.utils import log_utils
6
9
 
7
10
 
@@ -32,3 +35,57 @@ def format_job_queue(jobs: List[responses.ClusterJobRecord]):
32
35
  job.metadata.get('git_commit', '-'),
33
36
  ])
34
37
  return job_table
38
+
39
+
40
+ def format_storage_table(storages: List[responses.StorageRecord],
41
+ show_all: bool = False) -> str:
42
+ """Format the storage table for display.
43
+
44
+ Args:
45
+ storage_table (dict): The storage table.
46
+
47
+ Returns:
48
+ str: The formatted storage table.
49
+ """
50
+ storage_table = log_utils.create_table([
51
+ 'NAME',
52
+ 'UPDATED',
53
+ 'STORE',
54
+ 'COMMAND',
55
+ 'STATUS',
56
+ ])
57
+
58
+ for row in storages:
59
+ launched_at = row.launched_at
60
+ if show_all:
61
+ command = row.last_use
62
+ else:
63
+ command = common_utils.truncate_long_string(
64
+ row.last_use, constants.LAST_USE_TRUNC_LENGTH)
65
+ storage_table.add_row([
66
+ # NAME
67
+ row.name,
68
+ # LAUNCHED
69
+ log_utils.readable_time_duration(launched_at),
70
+ # CLOUDS
71
+ ', '.join([s.value for s in row.store]),
72
+ # COMMAND,
73
+ command,
74
+ # STATUS
75
+ row.status.value,
76
+ ])
77
+ if storages:
78
+ return str(storage_table)
79
+ else:
80
+ return 'No existing storage.'
81
+
82
+
83
+ def format_job_table(jobs: List[responses.ManagedJobRecord],
84
+ show_all: bool,
85
+ show_user: bool,
86
+ max_jobs: Optional[int] = None):
87
+ jobs = [job.model_dump() for job in jobs]
88
+ return managed_jobs.format_job_table(jobs,
89
+ show_all=show_all,
90
+ show_user=show_user,
91
+ max_jobs=max_jobs)
sky/client/sdk.py CHANGED
@@ -1618,26 +1618,15 @@ def cost_report(
1618
1618
  @usage_lib.entrypoint
1619
1619
  @server_common.check_server_healthy_or_start
1620
1620
  @annotations.client_api
1621
- def storage_ls() -> server_common.RequestId[List[Dict[str, Any]]]:
1621
+ def storage_ls() -> server_common.RequestId[List[responses.StorageRecord]]:
1622
1622
  """Gets the storages.
1623
1623
 
1624
1624
  Returns:
1625
1625
  The request ID of the storage list request.
1626
1626
 
1627
1627
  Request Returns:
1628
- storage_records (List[Dict[str, Any]]): A list of dicts, with each dict
1629
- containing the information of a storage.
1630
-
1631
- .. code-block:: python
1632
-
1633
- {
1634
- 'name': (str) storage name,
1635
- 'launched_at': (int) timestamp of creation,
1636
- 'store': (List[sky.StoreType]) storage type,
1637
- 'last_use': (int) timestamp of last use,
1638
- 'status': (sky.StorageStatus) storage status,
1639
- }
1640
- ]
1628
+ storage_records (List[responses.StorageRecord]):
1629
+ A list of storage records.
1641
1630
  """
1642
1631
  response = server_common.make_authenticated_request('GET', '/storage/ls')
1643
1632
  return server_common.get_request_id(response)
@@ -1912,10 +1901,10 @@ def kubernetes_node_info(
1912
1901
  @usage_lib.entrypoint
1913
1902
  @server_common.check_server_healthy_or_start
1914
1903
  @annotations.client_api
1915
- def status_kubernetes() -> server_common.RequestId[Tuple[
1916
- List['kubernetes_utils.KubernetesSkyPilotClusterInfoPayload'],
1917
- List['kubernetes_utils.KubernetesSkyPilotClusterInfoPayload'], List[Dict[
1918
- str, Any]], Optional[str]]]:
1904
+ def status_kubernetes() -> server_common.RequestId[
1905
+ Tuple[List['kubernetes_utils.KubernetesSkyPilotClusterInfoPayload'],
1906
+ List['kubernetes_utils.KubernetesSkyPilotClusterInfoPayload'],
1907
+ List[responses.ManagedJobRecord], Optional[str]]]:
1919
1908
  """Gets all SkyPilot clusters and jobs in the Kubernetes cluster.
1920
1909
 
1921
1910
  Managed jobs and services are also included in the clusters returned.
sky/core.py CHANGED
@@ -195,7 +195,7 @@ def status(
195
195
  def status_kubernetes(
196
196
  ) -> Tuple[List['kubernetes_utils.KubernetesSkyPilotClusterInfoPayload'],
197
197
  List['kubernetes_utils.KubernetesSkyPilotClusterInfoPayload'],
198
- List[Dict[str, Any]], Optional[str]]:
198
+ List[responses.ManagedJobRecord], Optional[str]]:
199
199
  """Gets all SkyPilot clusters and jobs in the Kubernetes cluster.
200
200
 
201
201
  Managed jobs and services are also included in the clusters returned.
@@ -270,6 +270,7 @@ all_clusters, unmanaged_clusters, all_jobs, context
270
270
  kubernetes_utils.KubernetesSkyPilotClusterInfoPayload.from_cluster(c)
271
271
  for c in unmanaged_clusters
272
272
  ]
273
+ all_jobs = [responses.ManagedJobRecord(**job) for job in all_jobs]
273
274
  return all_clusters, unmanaged_clusters, all_jobs, context
274
275
 
275
276
 
@@ -1130,25 +1131,25 @@ def job_status(cluster_name: str,
1130
1131
  # = Storage Management =
1131
1132
  # ======================
1132
1133
  @usage_lib.entrypoint
1133
- def storage_ls() -> List[Dict[str, Any]]:
1134
+ def storage_ls() -> List[responses.StorageRecord]:
1134
1135
  # NOTE(dev): Keep the docstring consistent between the Python API and CLI.
1135
1136
  """Gets the storages.
1136
1137
 
1137
1138
  Returns:
1138
- [
1139
- {
1140
- 'name': str,
1141
- 'launched_at': int timestamp of creation,
1142
- 'store': List[sky.StoreType],
1143
- 'last_use': int timestamp of last use,
1144
- 'status': sky.StorageStatus,
1145
- }
1146
- ]
1139
+ List[responses.StorageRecord]: A list of storage records.
1147
1140
  """
1148
1141
  storages = global_user_state.get_storage()
1142
+ storage_records = []
1149
1143
  for storage in storages:
1150
- storage['store'] = list(storage.pop('handle').sky_stores.keys())
1151
- return storages
1144
+ storage_records.append(
1145
+ responses.StorageRecord(
1146
+ name=storage['name'],
1147
+ launched_at=storage['launched_at'],
1148
+ store=list(storage.pop('handle').sky_stores.keys()),
1149
+ last_use=storage['last_use'],
1150
+ status=storage['status'],
1151
+ ))
1152
+ return storage_records
1152
1153
 
1153
1154
 
1154
1155
  @usage_lib.entrypoint
@@ -1164,9 +1165,7 @@ def storage_delete(name: str) -> None:
1164
1165
  if handle is None:
1165
1166
  raise ValueError(f'Storage name {name!r} not found.')
1166
1167
  else:
1167
- storage_object = data.Storage(name=handle.storage_name,
1168
- source=handle.source,
1169
- sync_on_reconstruction=False)
1168
+ storage_object = data.Storage.from_handle(handle)
1170
1169
  storage_object.delete()
1171
1170
 
1172
1171
 
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-7340bc0f0dd8ae74.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/UDSEoDB67vwFMZyCJ4HWU/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"UDSEoDB67vwFMZyCJ4HWU","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/4614e06482d7309e.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/4614e06482d7309e.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-4f0c389a4ce5fd9c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-cf60a09ccd051a10.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-f15ccb73239a3bf1.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-ce361c6959bc2001.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/m3YT2i5s6v4SsIdYc8WZa/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"m3YT2i5s6v4SsIdYc8WZa","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -13,4 +13,4 @@
13
13
  *
14
14
  * This source code is licensed under the ISC license.
15
15
  * See the LICENSE file in the root directory of this source tree.
16
- */let u=(0,s(60998).Z)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);var h=s(70282),x=s(27325),m=s(45895),f=s(6639),p=s(68969),g=s(6378),N=s(36989),j=s(51214),b=s(99307),y=s(84303),v=s(1125),w=s(68764),E=s(30803);function _(){let e=(0,a.useRouter)(),{pool:t}=e.query,[s,l]=(0,n.useState)(null),[i,_]=(0,n.useState)(!1),[L,k]=(0,n.useState)(!0),[I,C]=(0,n.useState)(null),[R,A]=(0,n.useState)(1),[S,T]=(0,n.useState)(10),[D,O]=(0,n.useState)(!1),[P,M]=(0,n.useState)({key:null,direction:"ascending"}),[F,W]=(0,n.useState)(!1),[U,Y]=(0,n.useState)(!1),[Z,G]=(0,n.useState)(!1),H=n.useCallback(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t){e?_(!0):k(!0),C(null);try{let{pools:e=[]}=await g.default.get(p.vs,[{}])||{},s=e.find(e=>e.name===t);s?l(s):(C("Pool ".concat(t," not found")),l(null))}catch(e){console.error("Error fetching pool data:",e),C("Failed to fetch pool data: ".concat(e.message)),l(null)}finally{e?_(!1):k(!1)}}},[t,_,k,C,l]);(0,n.useEffect)(()=>{H()},[t,H]);let z=e=>{let t="ascending";P.key===e&&"ascending"===P.direction&&(t="descending"),M({key:e,direction:t})},B=e=>P.key===e?"ascending"===P.direction?" ↑":" ↓":"",q=async()=>{try{if(s&&s.pool_yaml){let e=(0,y._q)(s.pool_yaml);await navigator.clipboard.writeText(e),Y(!0),setTimeout(()=>Y(!1),2e3)}}catch(e){console.error("Failed to copy Pool YAML to clipboard:",e)}},K=async()=>{try{s&&s.entrypoint&&(await navigator.clipboard.writeText(s.entrypoint),G(!0),setTimeout(()=>G(!1),2e3))}catch(e){console.error("Failed to copy entrypoint to clipboard:",e)}},{filteredWorkers:V,totalPages:J,paginatedWorkers:X}=(0,n.useMemo)(()=>{if(!s||!s.replica_info)return{filteredWorkers:[],totalPages:0,paginatedWorkers:[]};let e=D?s.replica_info:s.replica_info.filter(e=>!e.status||!e.status.includes("FAILED"));P.key&&(e=[...e].sort((e,t)=>{let s=e[P.key],r=t[P.key];return("launched_at"===P.key&&(s=s||0,r=r||0),"string"==typeof s&&(s=s.toLowerCase()),"string"==typeof r&&(r=r.toLowerCase()),s<r)?"ascending"===P.direction?-1:1:s>r?"ascending"===P.direction?1:-1:0}));let t=Math.ceil(e.length/S),r=(R-1)*S,n=r+S,a=e.slice(r,n);return{filteredWorkers:e,totalPages:t,paginatedWorkers:a}},[s,D,R,S,P]);return((0,n.useEffect)(()=>{A(1)},[D,P]),!e.isReady||L)?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c(),{children:(0,r.jsxs)("title",{children:["Pool ",t," | SkyPilot Dashboard"]})}),(0,r.jsx)("div",{className:"min-h-screen flex items-center justify-center",children:(0,r.jsxs)("div",{className:"flex flex-col items-center",children:[(0,r.jsx)(d.Z,{size:32,className:"mb-3"}),(0,r.jsx)("span",{className:"text-gray-600",children:"Loading pool details..."})]})})]}):I||!s?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c(),{children:(0,r.jsxs)("title",{children:["Pool ",t," | SkyPilot Dashboard"]})}),(0,r.jsx)("div",{className:"bg-white shadow rounded-lg p-6",children:(0,r.jsxs)("div",{className:"text-center text-red-600",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold mb-2",children:"Error"}),(0,r.jsx)("p",{children:I||"Pool ".concat(t," not found")}),(0,r.jsx)("button",{onClick:()=>{g.default.invalidate(p.vs,[{}]),H(!0)},className:"mt-4 bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600",children:"Retry"})]})})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c(),{children:(0,r.jsxs)("title",{children:["Pool ",t," | SkyPilot Dashboard"]})}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4 h-5",children:[(0,r.jsxs)("div",{className:"text-base flex items-center",children:[(0,r.jsx)(o(),{href:"/jobs",className:"text-sky-blue hover:underline",children:"Pools"}),(0,r.jsx)("span",{className:"mx-2 text-gray-500",children:"›"}),(0,r.jsx)(o(),{href:"/jobs/pools/".concat(t),className:"text-sky-blue hover:underline",children:t})]}),(0,r.jsxs)("div",{className:"text-sm flex items-center",children:[i&&(0,r.jsxs)("div",{className:"flex items-center mr-4",children:[(0,r.jsx)(d.Z,{size:15,className:"mt-0"}),(0,r.jsx)("span",{className:"ml-2 text-gray-500",children:"Loading..."})]}),(0,r.jsxs)("button",{onClick:()=>{g.default.invalidate(p.vs,[{}]),H(!0)},disabled:i,className:"text-sky-blue hover:text-sky-blue-bright font-medium inline-flex items-center",children:[(0,r.jsx)(u,{className:"w-4 h-4 mr-1.5 ".concat(i?"animate-spin":"")}),(0,r.jsx)("span",{children:"Refresh"})]})]})]}),(0,r.jsxs)("div",{className:"w-full flex flex-col space-y-6",children:[(0,r.jsx)("div",{className:"mb-6",children:(0,r.jsxs)("div",{className:"rounded-lg border bg-card text-card-foreground shadow-sm",children:[(0,r.jsx)("div",{className:"flex items-center justify-between px-4 pt-4",children:(0,r.jsx)("h3",{className:"text-lg font-semibold",children:"Details"})}),(0,r.jsxs)("div",{className:"p-4",children:[(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-6",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Jobs"}),(0,r.jsx)("div",{className:"text-base mt-1",children:(0,r.jsx)(N.x9,{jobCounts:(0,N.sY)(s),getStatusStyle:b.Cl})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Workers"}),(0,r.jsx)("div",{className:"text-base mt-1",children:(e=>{if(!e||!e.replica_info||0===e.replica_info.length)return"0 (target: 0)";let t=e.replica_info.filter(e=>"READY"===e.status).length,s=e.target_num_replicas||0;return"".concat(t," (target: ").concat(s,")")})(s)})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Worker Details"}),(0,r.jsx)("div",{className:"text-base mt-1",children:(0,r.jsx)(N.Kl,{replicaInfo:s.replica_info})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Worker Resources"}),(0,r.jsx)("div",{className:"text-base mt-1",children:s.requested_resources_str||"-"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Policy"}),(0,r.jsx)("div",{className:"text-base mt-1",children:s.policy||"-"})]})]}),s.entrypoint&&(0,r.jsxs)("div",{className:"pt-4 mt-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Entrypoint"}),(0,r.jsx)(N.WH,{content:Z?"Copied!":"Copy command",className:"text-muted-foreground",children:(0,r.jsx)("button",{onClick:K,className:"flex items-center text-gray-500 hover:text-gray-700 transition-colors duration-200 p-1 ml-2",children:Z?(0,r.jsx)(h.Z,{className:"w-4 h-4 text-green-600"}):(0,r.jsx)(x.Z,{className:"w-4 h-4"})})})]}),(0,r.jsx)("div",{className:"mt-3",children:(0,r.jsx)("div",{className:"bg-gray-50 border border-gray-200 rounded-md p-3",children:(0,r.jsx)("code",{className:"text-sm text-gray-800 font-mono break-all",children:s.entrypoint})})})]}),s.pool_yaml&&s.pool_yaml.trim()&&(0,r.jsxs)("div",{className:"pt-4 mt-4",children:[(0,r.jsxs)("div",{className:"flex items-center mb-2",children:[(0,r.jsxs)("button",{onClick:()=>{W(!F)},className:"flex items-center text-left focus:outline-none text-gray-700 hover:text-gray-900 transition-colors duration-200",children:[F?(0,r.jsx)(m.Z,{className:"w-4 h-4 mr-1"}):(0,r.jsx)(f.Z,{className:"w-4 h-4 mr-1"}),(0,r.jsx)("span",{className:"text-base",children:"Show Pool YAML"})]}),(0,r.jsx)(N.WH,{content:U?"Copied!":"Copy YAML",className:"text-muted-foreground",children:(0,r.jsx)("button",{onClick:q,className:"flex items-center text-gray-500 hover:text-gray-700 transition-colors duration-200 p-1 ml-2",children:U?(0,r.jsx)(h.Z,{className:"w-4 h-4 text-green-600"}):(0,r.jsx)(x.Z,{className:"w-4 h-4"})})})]}),F&&(0,r.jsx)("div",{className:"bg-gray-50 border border-gray-200 rounded-md p-3 max-h-96 overflow-y-auto",children:(0,r.jsx)(v.C,{className:"whitespace-pre-wrap",children:(0,y._q)(s.pool_yaml)})})]})]})]})}),(0,r.jsxs)("div",{className:"mb-8",children:[(0,r.jsxs)("div",{className:"rounded-lg border bg-card text-card-foreground shadow-sm",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between p-4",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold",children:"Pool Workers"}),(0,r.jsx)("div",{className:"flex items-center space-x-2",children:(0,r.jsxs)("label",{className:"flex items-center space-x-3 text-sm cursor-pointer",children:[(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("input",{type:"checkbox",checked:D,onChange:e=>O(e.target.checked),className:"sr-only"}),(0,r.jsx)("div",{className:"w-11 h-6 rounded-full transition-colors duration-200 ease-in-out ".concat(D?"bg-blue-600":"bg-gray-300"),children:(0,r.jsx)("div",{className:"w-5 h-5 bg-white rounded-full shadow transform transition-transform duration-200 ease-in-out translate-y-0.5 ".concat(D?"translate-x-5":"translate-x-0.5")})})]}),(0,r.jsx)("span",{className:"text-gray-700",children:"Show history"})]})})]}),(0,r.jsxs)(w.iA,{children:[(0,r.jsx)(w.xD,{children:(0,r.jsxs)(w.SC,{children:[(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("replica_id"),children:["ID",B("replica_id")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("launched_at"),children:["Launched",B("launched_at")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("cloud"),children:["Infra",B("cloud")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("resources_str"),children:["Resources",B("resources_str")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("status"),children:["Status",B("status")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("used_by"),children:["Used By",B("used_by")]})]})}),(0,r.jsx)(w.RM,{children:X.length>0?X.map((e,t)=>(0,r.jsxs)(w.SC,{children:[(0,r.jsx)(w.pj,{children:e.replica_id}),(0,r.jsx)(w.pj,{children:e.launched_at&&e.launched_at>0?(0,r.jsx)(N.Zg,{date:new Date(1e3*e.launched_at)}):"-"}),(0,r.jsx)(w.pj,{children:(()=>{try{let t=e.cloud&&""!==e.cloud.trim()&&"undefined"!==e.cloud,s=e.region&&"undefined"!==e.region&&null!==e.region&&""!==e.region.trim();if(!t&&!s)return"-";let n=t?e.cloud:"Unknown",a=s?e.region:null;if(!a)return(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n});let l="".concat(n," (").concat(a,")"),c=j.MO.NAME_TRUNCATE_LENGTH,i=l.indexOf("(");if(-1===i)return(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n});if(a.length<=c)return(0,r.jsxs)("span",{children:[(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n}),(0,r.jsxs)("span",{children:[" (",a,")"]})]});let d="".concat(a.substring(0,Math.floor((c-3)/2)),"...").concat(a.substring(a.length-Math.ceil((c-3)/2)));return(0,r.jsx)(N.Md,{content:l,className:"text-sm text-muted-foreground",children:(0,r.jsxs)("span",{children:[(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n}),(0,r.jsxs)("span",{children:[" (",d,")"]})]})})}catch(e){return"-"}})()}),(0,r.jsx)(w.pj,{children:(()=>{try{return e.resources_str}catch(e){return"Error: ".concat(e.message)}})()}),(0,r.jsx)(w.pj,{children:(0,r.jsx)(b.OE,{status:e.status})}),(0,r.jsx)(w.pj,{children:e.used_by?(0,r.jsxs)(o(),{href:"/jobs/".concat(e.used_by),className:"text-blue-600 hover:text-blue-800 hover:underline",children:["Job ID: ",e.used_by]}):"-"})]},e.replica_id)):(0,r.jsx)(w.SC,{children:(0,r.jsx)(w.pj,{colSpan:6,className:"text-center py-8 text-gray-500",children:D?"No workers found in this pool":"No non-failed workers found in this pool"})})})]})]}),V.length>0&&(0,r.jsx)("div",{className:"flex justify-end items-center py-2 px-4 text-sm text-gray-700",children:(0,r.jsxs)("div",{className:"flex items-center space-x-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)("span",{className:"mr-2",children:"Rows per page:"}),(0,r.jsxs)("div",{className:"relative inline-block",children:[(0,r.jsxs)("select",{value:S,onChange:e=>{T(parseInt(e.target.value,10)),A(1)},className:"py-1 pl-2 pr-6 appearance-none outline-none cursor-pointer border-none bg-transparent",style:{minWidth:"40px"},children:[(0,r.jsx)("option",{value:5,children:"5"}),(0,r.jsx)("option",{value:10,children:"10"}),(0,r.jsx)("option",{value:20,children:"20"}),(0,r.jsx)("option",{value:50,children:"50"})]}),(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-4 w-4 text-gray-500 absolute right-0 top-1/2 transform -translate-y-1/2 pointer-events-none",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]})]}),(0,r.jsxs)("div",{children:[(R-1)*S+1," –"," ",Math.min(R*S,V.length)," ","of ",V.length]}),(0,r.jsx)(E.z,{variant:"ghost",size:"icon",onClick:()=>{A(e=>Math.max(e-1,1))},disabled:1===R,className:"text-gray-500 h-8 w-8 p-0",children:(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"chevron-left",children:(0,r.jsx)("path",{d:"M15 18l-6-6 6-6"})})}),(0,r.jsx)(E.z,{variant:"ghost",size:"icon",onClick:()=>{A(e=>Math.min(e+1,J))},disabled:R===J,className:"text-gray-500 h-8 w-8 p-0",children:(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"chevron-right",children:(0,r.jsx)("path",{d:"M9 18l6-6-6-6"})})})]})})]})]})]})]})}},12003:function(e,t,s){"use strict";s.d(t,{j:function(){return l}});var r=s(90512);let n=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,a=r.W,l=(e,t)=>s=>{var r;if((null==t?void 0:t.variants)==null)return a(e,null==s?void 0:s.class,null==s?void 0:s.className);let{variants:l,defaultVariants:c}=t,i=Object.keys(l).map(e=>{let t=null==s?void 0:s[e],r=null==c?void 0:c[e];if(null===t)return null;let a=n(t)||n(r);return l[e][a]}),o=s&&Object.entries(s).reduce((e,t)=>{let[s,r]=t;return void 0===r||(e[s]=r),e},{});return a(e,i,null==t?void 0:null===(r=t.compoundVariants)||void 0===r?void 0:r.reduce((e,t)=>{let{class:s,className:r,...n}=t;return Object.entries(n).every(e=>{let[t,s]=e;return Array.isArray(s)?s.includes({...c,...o}[t]):({...c,...o})[t]===s})?[...e,s,r]:e},[]),null==s?void 0:s.class,null==s?void 0:s.className)}}},function(e){e.O(0,[616,6130,5739,1272,754,6989,3850,8969,2888,9774,179],function(){return e(e.s=38808)}),_N_E=e.O()}]);
16
+ */let u=(0,s(60998).Z)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);var h=s(70282),x=s(27325),m=s(45895),f=s(6639),p=s(68969),g=s(6378),N=s(36989),j=s(51214),b=s(99307),y=s(84303),v=s(1125),w=s(68764),E=s(30803);function _(){let e=(0,a.useRouter)(),{pool:t}=e.query,[s,l]=(0,n.useState)(null),[i,_]=(0,n.useState)(!1),[L,k]=(0,n.useState)(!0),[I,C]=(0,n.useState)(null),[R,A]=(0,n.useState)(1),[S,T]=(0,n.useState)(10),[D,O]=(0,n.useState)(!1),[P,M]=(0,n.useState)({key:null,direction:"ascending"}),[F,W]=(0,n.useState)(!1),[U,Y]=(0,n.useState)(!1),[Z,G]=(0,n.useState)(!1),H=n.useCallback(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(t){e?_(!0):k(!0),C(null);try{let{pools:e=[]}=await g.default.get(p.vs,[{}])||{},s=e.find(e=>e.name===t);s?l(s):(C("Pool ".concat(t," not found")),l(null))}catch(e){console.error("Error fetching pool data:",e),C("Failed to fetch pool data: ".concat(e.message)),l(null)}finally{e?_(!1):k(!1)}}},[t,_,k,C,l]);(0,n.useEffect)(()=>{H()},[t,H]);let z=e=>{let t="ascending";P.key===e&&"ascending"===P.direction&&(t="descending"),M({key:e,direction:t})},B=e=>P.key===e?"ascending"===P.direction?" ↑":" ↓":"",q=async()=>{try{if(s&&s.pool_yaml){let e=(0,y._q)(s.pool_yaml);await navigator.clipboard.writeText(e),Y(!0),setTimeout(()=>Y(!1),2e3)}}catch(e){console.error("Failed to copy Pool YAML to clipboard:",e)}},K=async()=>{try{s&&s.entrypoint&&(await navigator.clipboard.writeText(s.entrypoint),G(!0),setTimeout(()=>G(!1),2e3))}catch(e){console.error("Failed to copy entrypoint to clipboard:",e)}},{filteredWorkers:V,totalPages:J,paginatedWorkers:X}=(0,n.useMemo)(()=>{if(!s||!s.replica_info)return{filteredWorkers:[],totalPages:0,paginatedWorkers:[]};let e=D?s.replica_info:s.replica_info.filter(e=>!e.status||!e.status.includes("FAILED"));P.key&&(e=[...e].sort((e,t)=>{let s=e[P.key],r=t[P.key];return("launched_at"===P.key&&(s=s||0,r=r||0),"string"==typeof s&&(s=s.toLowerCase()),"string"==typeof r&&(r=r.toLowerCase()),s<r)?"ascending"===P.direction?-1:1:s>r?"ascending"===P.direction?1:-1:0}));let t=Math.ceil(e.length/S),r=(R-1)*S,n=r+S,a=e.slice(r,n);return{filteredWorkers:e,totalPages:t,paginatedWorkers:a}},[s,D,R,S,P]);return((0,n.useEffect)(()=>{A(1)},[D,P]),!e.isReady||L)?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c(),{children:(0,r.jsxs)("title",{children:["Pool ",t," | SkyPilot Dashboard"]})}),(0,r.jsx)("div",{className:"min-h-screen flex items-center justify-center",children:(0,r.jsxs)("div",{className:"flex flex-col items-center",children:[(0,r.jsx)(d.Z,{size:32,className:"mb-3"}),(0,r.jsx)("span",{className:"text-gray-600",children:"Loading pool details..."})]})})]}):I||!s?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c(),{children:(0,r.jsxs)("title",{children:["Pool ",t," | SkyPilot Dashboard"]})}),(0,r.jsx)("div",{className:"bg-white shadow rounded-lg p-6",children:(0,r.jsxs)("div",{className:"text-center text-red-600",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold mb-2",children:"Error"}),(0,r.jsx)("p",{children:I||"Pool ".concat(t," not found")}),(0,r.jsx)("button",{onClick:()=>{g.default.invalidate(p.vs,[{}]),H(!0)},className:"mt-4 bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600",children:"Retry"})]})})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c(),{children:(0,r.jsxs)("title",{children:["Pool ",t," | SkyPilot Dashboard"]})}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4 h-5",children:[(0,r.jsxs)("div",{className:"text-base flex items-center",children:[(0,r.jsx)(o(),{href:"/jobs",className:"text-sky-blue hover:underline",children:"Pools"}),(0,r.jsx)("span",{className:"mx-2 text-gray-500",children:"›"}),(0,r.jsx)(o(),{href:"/jobs/pools/".concat(t),className:"text-sky-blue hover:underline",children:t})]}),(0,r.jsxs)("div",{className:"text-sm flex items-center",children:[i&&(0,r.jsxs)("div",{className:"flex items-center mr-4",children:[(0,r.jsx)(d.Z,{size:15,className:"mt-0"}),(0,r.jsx)("span",{className:"ml-2 text-gray-500",children:"Loading..."})]}),(0,r.jsxs)("button",{onClick:()=>{g.default.invalidate(p.vs,[{}]),H(!0)},disabled:i,className:"text-sky-blue hover:text-sky-blue-bright font-medium inline-flex items-center",children:[(0,r.jsx)(u,{className:"w-4 h-4 mr-1.5 ".concat(i?"animate-spin":"")}),(0,r.jsx)("span",{children:"Refresh"})]})]})]}),(0,r.jsxs)("div",{className:"w-full flex flex-col space-y-6",children:[(0,r.jsx)("div",{className:"mb-6",children:(0,r.jsxs)("div",{className:"rounded-lg border bg-card text-card-foreground shadow-sm",children:[(0,r.jsx)("div",{className:"flex items-center justify-between px-4 pt-4",children:(0,r.jsx)("h3",{className:"text-lg font-semibold",children:"Details"})}),(0,r.jsxs)("div",{className:"p-4",children:[(0,r.jsxs)("div",{className:"grid grid-cols-2 gap-6",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Jobs"}),(0,r.jsx)("div",{className:"text-base mt-1",children:(0,r.jsx)(N.x9,{jobCounts:(0,N.sY)(s),getStatusStyle:b.Cl})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Workers"}),(0,r.jsx)("div",{className:"text-base mt-1",children:(e=>{if(!e||!e.replica_info||0===e.replica_info.length)return"0 (target: 0)";let t=e.replica_info.filter(e=>"READY"===e.status).length,s=e.target_num_replicas||0;return"".concat(t," (target: ").concat(s,")")})(s)})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Worker Details"}),(0,r.jsx)("div",{className:"text-base mt-1",children:(0,r.jsx)(N.Kl,{replicaInfo:s.replica_info})})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Worker Resources"}),(0,r.jsx)("div",{className:"text-base mt-1",children:s.requested_resources_str||"-"})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Policy"}),(0,r.jsx)("div",{className:"text-base mt-1",children:s.policy||"-"})]})]}),s.entrypoint&&(0,r.jsxs)("div",{className:"pt-4 mt-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)("div",{className:"text-gray-600 font-medium text-base",children:"Entrypoint"}),(0,r.jsx)(N.WH,{content:Z?"Copied!":"Copy command",className:"text-muted-foreground",children:(0,r.jsx)("button",{onClick:K,className:"flex items-center text-gray-500 hover:text-gray-700 transition-colors duration-200 p-1 ml-2",children:Z?(0,r.jsx)(h.Z,{className:"w-4 h-4 text-green-600"}):(0,r.jsx)(x.Z,{className:"w-4 h-4"})})})]}),(0,r.jsx)("div",{className:"mt-3",children:(0,r.jsx)("div",{className:"bg-gray-50 border border-gray-200 rounded-md p-3",children:(0,r.jsx)("code",{className:"text-sm text-gray-800 font-mono break-all",children:s.entrypoint})})})]}),s.pool_yaml&&s.pool_yaml.trim()&&(0,r.jsxs)("div",{className:"pt-4 mt-4",children:[(0,r.jsxs)("div",{className:"flex items-center mb-2",children:[(0,r.jsxs)("button",{onClick:()=>{W(!F)},className:"flex items-center text-left focus:outline-none text-gray-700 hover:text-gray-900 transition-colors duration-200",children:[F?(0,r.jsx)(m.Z,{className:"w-4 h-4 mr-1"}):(0,r.jsx)(f.Z,{className:"w-4 h-4 mr-1"}),(0,r.jsx)("span",{className:"text-base",children:"Show Pool YAML"})]}),(0,r.jsx)(N.WH,{content:U?"Copied!":"Copy YAML",className:"text-muted-foreground",children:(0,r.jsx)("button",{onClick:q,className:"flex items-center text-gray-500 hover:text-gray-700 transition-colors duration-200 p-1 ml-2",children:U?(0,r.jsx)(h.Z,{className:"w-4 h-4 text-green-600"}):(0,r.jsx)(x.Z,{className:"w-4 h-4"})})})]}),F&&(0,r.jsx)("div",{className:"bg-gray-50 border border-gray-200 rounded-md p-3 max-h-96 overflow-y-auto",children:(0,r.jsx)(v.C,{className:"whitespace-pre-wrap",children:(0,y._q)(s.pool_yaml)})})]})]})]})}),(0,r.jsxs)("div",{className:"mb-8",children:[(0,r.jsxs)("div",{className:"rounded-lg border bg-card text-card-foreground shadow-sm",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between p-4",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold",children:"Pool Workers"}),(0,r.jsx)("div",{className:"flex items-center space-x-2",children:(0,r.jsxs)("label",{className:"flex items-center space-x-3 text-sm cursor-pointer",children:[(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("input",{type:"checkbox",checked:D,onChange:e=>O(e.target.checked),className:"sr-only"}),(0,r.jsx)("div",{className:"w-11 h-6 rounded-full transition-colors duration-200 ease-in-out ".concat(D?"bg-blue-600":"bg-gray-300"),children:(0,r.jsx)("div",{className:"w-5 h-5 bg-white rounded-full shadow transform transition-transform duration-200 ease-in-out translate-y-0.5 ".concat(D?"translate-x-5":"translate-x-0.5")})})]}),(0,r.jsx)("span",{className:"text-gray-700",children:"Show history"})]})})]}),(0,r.jsxs)(w.iA,{children:[(0,r.jsx)(w.xD,{children:(0,r.jsxs)(w.SC,{children:[(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("replica_id"),children:["ID",B("replica_id")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("launched_at"),children:["Launched",B("launched_at")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("cloud"),children:["Infra",B("cloud")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("resources_str"),children:["Resources",B("resources_str")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("status"),children:["Status",B("status")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("version"),children:["Pool Version",B("version")]}),(0,r.jsxs)(w.ss,{className:"sortable whitespace-nowrap",onClick:()=>z("used_by"),children:["Used By",B("used_by")]})]})}),(0,r.jsx)(w.RM,{children:X.length>0?X.map((e,t)=>(0,r.jsxs)(w.SC,{children:[(0,r.jsx)(w.pj,{children:e.replica_id}),(0,r.jsx)(w.pj,{children:e.launched_at&&e.launched_at>0?(0,r.jsx)(N.Zg,{date:new Date(1e3*e.launched_at)}):"-"}),(0,r.jsx)(w.pj,{children:(()=>{try{let t=e.cloud&&""!==e.cloud.trim()&&"undefined"!==e.cloud,s=e.region&&"undefined"!==e.region&&null!==e.region&&""!==e.region.trim();if(!t&&!s)return"-";let n=t?e.cloud:"Unknown",a=s?e.region:null;if(!a)return(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n});let l="".concat(n," (").concat(a,")"),c=j.MO.NAME_TRUNCATE_LENGTH,i=l.indexOf("(");if(-1===i)return(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n});if(a.length<=c)return(0,r.jsxs)("span",{children:[(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n}),(0,r.jsxs)("span",{children:[" (",a,")"]})]});let d="".concat(a.substring(0,Math.floor((c-3)/2)),"...").concat(a.substring(a.length-Math.ceil((c-3)/2)));return(0,r.jsx)(N.Md,{content:l,className:"text-sm text-muted-foreground",children:(0,r.jsxs)("span",{children:[(0,r.jsx)(o(),{href:"/infra",className:"text-blue-600 hover:underline",children:n}),(0,r.jsxs)("span",{children:[" (",d,")"]})]})})}catch(e){return"-"}})()}),(0,r.jsx)(w.pj,{children:(()=>{try{return e.resources_str}catch(e){return"Error: ".concat(e.message)}})()}),(0,r.jsx)(w.pj,{children:(0,r.jsx)(b.OE,{status:e.status})}),(0,r.jsx)(w.pj,{children:e.version||"-"}),(0,r.jsx)(w.pj,{children:e.used_by?(0,r.jsxs)(o(),{href:"/jobs/".concat(e.used_by),className:"text-blue-600 hover:text-blue-800 hover:underline",children:["Job ID: ",e.used_by]}):"-"})]},e.replica_id)):(0,r.jsx)(w.SC,{children:(0,r.jsx)(w.pj,{colSpan:7,className:"text-center py-8 text-gray-500",children:D?"No workers found in this pool":"No non-failed workers found in this pool"})})})]})]}),V.length>0&&(0,r.jsx)("div",{className:"flex justify-end items-center py-2 px-4 text-sm text-gray-700",children:(0,r.jsxs)("div",{className:"flex items-center space-x-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)("span",{className:"mr-2",children:"Rows per page:"}),(0,r.jsxs)("div",{className:"relative inline-block",children:[(0,r.jsxs)("select",{value:S,onChange:e=>{T(parseInt(e.target.value,10)),A(1)},className:"py-1 pl-2 pr-6 appearance-none outline-none cursor-pointer border-none bg-transparent",style:{minWidth:"40px"},children:[(0,r.jsx)("option",{value:5,children:"5"}),(0,r.jsx)("option",{value:10,children:"10"}),(0,r.jsx)("option",{value:20,children:"20"}),(0,r.jsx)("option",{value:50,children:"50"})]}),(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",className:"h-4 w-4 text-gray-500 absolute right-0 top-1/2 transform -translate-y-1/2 pointer-events-none",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]})]}),(0,r.jsxs)("div",{children:[(R-1)*S+1," –"," ",Math.min(R*S,V.length)," ","of ",V.length]}),(0,r.jsx)(E.z,{variant:"ghost",size:"icon",onClick:()=>{A(e=>Math.max(e-1,1))},disabled:1===R,className:"text-gray-500 h-8 w-8 p-0",children:(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"chevron-left",children:(0,r.jsx)("path",{d:"M15 18l-6-6 6-6"})})}),(0,r.jsx)(E.z,{variant:"ghost",size:"icon",onClick:()=>{A(e=>Math.min(e+1,J))},disabled:R===J,className:"text-gray-500 h-8 w-8 p-0",children:(0,r.jsx)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:"chevron-right",children:(0,r.jsx)("path",{d:"M9 18l6-6-6-6"})})})]})})]})]})]})]})}},12003:function(e,t,s){"use strict";s.d(t,{j:function(){return l}});var r=s(90512);let n=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,a=r.W,l=(e,t)=>s=>{var r;if((null==t?void 0:t.variants)==null)return a(e,null==s?void 0:s.class,null==s?void 0:s.className);let{variants:l,defaultVariants:c}=t,i=Object.keys(l).map(e=>{let t=null==s?void 0:s[e],r=null==c?void 0:c[e];if(null===t)return null;let a=n(t)||n(r);return l[e][a]}),o=s&&Object.entries(s).reduce((e,t)=>{let[s,r]=t;return void 0===r||(e[s]=r),e},{});return a(e,i,null==t?void 0:null===(r=t.compoundVariants)||void 0===r?void 0:r.reduce((e,t)=>{let{class:s,className:r,...n}=t;return Object.entries(n).every(e=>{let[t,s]=e;return Array.isArray(s)?s.includes({...c,...o}[t]):({...c,...o})[t]===s})?[...e,s,r]:e},[]),null==s?void 0:s.class,null==s?void 0:s.className)}}},function(e){e.O(0,[616,6130,5739,1272,754,6989,3850,8969,2888,9774,179],function(){return e(e.s=38808)}),_N_E=e.O()}]);
@@ -1 +1 @@
1
- !function(){"use strict";var e,t,n,r,c,o,u,a,i,f={},d={};function s(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}},r=!0;try{f[e](n,n.exports,s),r=!1}finally{r&&delete d[e]}return n.exports}s.m=f,e=[],s.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var u=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],a=!0,i=0;i<n.length;i++)u>=c&&Object.keys(s.O).every(function(e){return s.O[e](n[i])})?n.splice(i--,1):(a=!1,c<u&&(u=c));if(a){e.splice(o--,1);var f=r();void 0!==f&&(t=f)}}return t},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},s.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);s.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var u=2&r&&e;"object"==typeof u&&!~t.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},s.d(c,o),c},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return 2350===e?"static/chunks/2350.fab69e61bac57b23.js":7325===e?"static/chunks/7325.b4bc99ce0892dcd5.js":3937===e?"static/chunks/3937.210053269f121201.js":9025===e?"static/chunks/9025.c12318fb6a1a9093.js":3294===e?"static/chunks/3294.93d9336bdc032b3a.js":649===e?"static/chunks/649.b9d7f7d10c1b8c53.js":7669===e?"static/chunks/7669.1f5d9a402bf5cc42.js":4045===e?"static/chunks/4045.b30465273dc5e468.js":4725===e?"static/chunks/4725.10f7a9a5d3ea8208.js":3785===e?"static/chunks/3785.0fa442e16dd3f00e.js":5339===e?"static/chunks/5339.4a881570243431a5.js":"static/chunks/"+e+"-"+({616:"3d59f75e2ccf9321",1121:"d0782b9251f0fcd3",1141:"159df2d4c441a9d1",1272:"1ef0bf0237faccdb",1836:"37fede578e2da5f8",3015:"88c7c8d69b0b6dba",3850:"ff4a9a69d978632b",4676:"9da7fdbde90b5549",5739:"d67458fcb1386c92",6130:"2be46d70a38f1e82",6135:"4b4d5e824b7f9d3c",6601:"06114c982db410b6",6856:"5fdc9b851a18acdb",6989:"01359c57e018caa4",6990:"f6818c84ed8f1c86",7411:"b15471acd2cba716",8969:"d8bc3a2b9cf839a9",9037:"d0c00018a5ba198c"})[e]+".js"},s.miniCssF=function(e){},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},c="_N_E:",s.l=function(e,t,n,o){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,a,i=document.getElementsByTagName("script"),f=0;f<i.length;f++){var d=i[f];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==c+n){u=d;break}}u||(a=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,s.nc&&u.setAttribute("nonce",s.nc),u.setAttribute("data-webpack",c+n),u.src=s.tu(e)),r[e]=[t];var b=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var c=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),c&&c.forEach(function(e){return e(n)}),t)return t(n)},l=setTimeout(b.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=b.bind(null,u.onerror),u.onload=b.bind(null,u.onload),a&&document.head.appendChild(u)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=function(){return void 0===o&&(o={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},s.tu=function(e){return s.tt().createScriptURL(e)},s.p="/dashboard/_next/",u={2272:0},s.f.j=function(e,t){var n=s.o(u,e)?u[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(2272!=e){var r=new Promise(function(t,r){n=u[e]=[t,r]});t.push(n[2]=r);var c=s.p+s.u(e),o=Error();s.l(c,function(t){if(s.o(u,e)&&(0!==(n=u[e])&&(u[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+e,e)}else u[e]=0}},s.O.j=function(e){return 0===u[e]},a=function(e,t){var n,r,c=t[0],o=t[1],a=t[2],i=0;if(c.some(function(e){return 0!==u[e]})){for(n in o)s.o(o,n)&&(s.m[n]=o[n]);if(a)var f=a(s)}for(e&&e(t);i<c.length;i++)r=c[i],s.o(u,r)&&u[r]&&u[r][0](),u[r]=0;return s.O(f)},(i=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(a.bind(null,0)),i.push=a.bind(null,i.push.bind(i)),s.nc=void 0}();
1
+ !function(){"use strict";var e,t,n,r,c,o,u,a,i,f={},d={};function s(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}},r=!0;try{f[e](n,n.exports,s),r=!1}finally{r&&delete d[e]}return n.exports}s.m=f,e=[],s.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var u=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],a=!0,i=0;i<n.length;i++)u>=c&&Object.keys(s.O).every(function(e){return s.O[e](n[i])})?n.splice(i--,1):(a=!1,c<u&&(u=c));if(a){e.splice(o--,1);var f=r();void 0!==f&&(t=f)}}return t},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},s.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);s.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var u=2&r&&e;"object"==typeof u&&!~t.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},s.d(c,o),c},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return 2350===e?"static/chunks/2350.fab69e61bac57b23.js":7325===e?"static/chunks/7325.b4bc99ce0892dcd5.js":3937===e?"static/chunks/3937.210053269f121201.js":9025===e?"static/chunks/9025.c12318fb6a1a9093.js":3294===e?"static/chunks/3294.93d9336bdc032b3a.js":649===e?"static/chunks/649.b9d7f7d10c1b8c53.js":4045===e?"static/chunks/4045.b30465273dc5e468.js":4725===e?"static/chunks/4725.10f7a9a5d3ea8208.js":7669===e?"static/chunks/7669.1f5d9a402bf5cc42.js":3785===e?"static/chunks/3785.0fa442e16dd3f00e.js":5339===e?"static/chunks/5339.4a881570243431a5.js":"static/chunks/"+e+"-"+({616:"3d59f75e2ccf9321",1121:"d0782b9251f0fcd3",1141:"159df2d4c441a9d1",1272:"1ef0bf0237faccdb",1836:"37fede578e2da5f8",3015:"88c7c8d69b0b6dba",3850:"ff4a9a69d978632b",4676:"9da7fdbde90b5549",5739:"d67458fcb1386c92",6130:"2be46d70a38f1e82",6135:"4b4d5e824b7f9d3c",6601:"06114c982db410b6",6856:"5fdc9b851a18acdb",6989:"01359c57e018caa4",6990:"f6818c84ed8f1c86",7411:"b15471acd2cba716",8969:"d8bc3a2b9cf839a9",9037:"d0c00018a5ba198c"})[e]+".js"},s.miniCssF=function(e){},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},c="_N_E:",s.l=function(e,t,n,o){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,a,i=document.getElementsByTagName("script"),f=0;f<i.length;f++){var d=i[f];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==c+n){u=d;break}}u||(a=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,s.nc&&u.setAttribute("nonce",s.nc),u.setAttribute("data-webpack",c+n),u.src=s.tu(e)),r[e]=[t];var b=function(t,n){u.onerror=u.onload=null,clearTimeout(l);var c=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),c&&c.forEach(function(e){return e(n)}),t)return t(n)},l=setTimeout(b.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=b.bind(null,u.onerror),u.onload=b.bind(null,u.onload),a&&document.head.appendChild(u)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=function(){return void 0===o&&(o={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},s.tu=function(e){return s.tt().createScriptURL(e)},s.p="/dashboard/_next/",u={2272:0},s.f.j=function(e,t){var n=s.o(u,e)?u[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(2272!=e){var r=new Promise(function(t,r){n=u[e]=[t,r]});t.push(n[2]=r);var c=s.p+s.u(e),o=Error();s.l(c,function(t){if(s.o(u,e)&&(0!==(n=u[e])&&(u[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+e,e)}else u[e]=0}},s.O.j=function(e){return 0===u[e]},a=function(e,t){var n,r,c=t[0],o=t[1],a=t[2],i=0;if(c.some(function(e){return 0!==u[e]})){for(n in o)s.o(o,n)&&(s.m[n]=o[n]);if(a)var f=a(s)}for(e&&e(t);i<c.length;i++)r=c[i],s.o(u,r)&&u[r]&&u[r][0](),u[r]=0;return s.O(f)},(i=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(a.bind(null,0)),i.push=a.bind(null,i.push.bind(i)),s.nc=void 0}();
@@ -1 +1 @@
1
- self.__BUILD_MANIFEST=function(s,c,a,t,e,f,u,n,b,o,j,i,r,d){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-444f1804401f04ea.js"],"/_error":["static/chunks/pages/_error-c66a4e8afc46f17b.js"],"/clusters":["static/chunks/pages/clusters-469814d711d63b1b.js"],"/clusters/[cluster]":[s,c,a,f,u,"static/chunks/4676-9da7fdbde90b5549.js",o,t,e,n,j,b,i,"static/chunks/6856-5fdc9b851a18acdb.js",r,d,"static/chunks/9037-d0c00018a5ba198c.js","static/chunks/pages/clusters/[cluster]-e052384df65ef200.js"],"/clusters/[cluster]/[job]":[s,c,a,f,t,e,b,"static/chunks/pages/clusters/[cluster]/[job]-ad77b12fc736dca3.js"],"/config":["static/chunks/pages/config-dfb9bf07b13045f4.js"],"/infra":["static/chunks/pages/infra-aabba60d57826e0f.js"],"/infra/[context]":["static/chunks/pages/infra/[context]-6563820e094f68ca.js"],"/jobs":["static/chunks/pages/jobs-1f70d9faa564804f.js"],"/jobs/pools/[pool]":[s,c,a,u,o,t,e,n,"static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js"],"/jobs/[job]":[s,c,a,f,u,o,t,e,n,b,"static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js"],"/users":["static/chunks/pages/users-018bf31cda52e11b.js"],"/volumes":["static/chunks/pages/volumes-739726d6b823f532.js"],"/workspace/new":["static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js"],"/workspaces":["static/chunks/pages/workspaces-7528cc0ef8c522c5.js"],"/workspaces/[name]":[s,c,a,f,u,"static/chunks/1836-37fede578e2da5f8.js",t,e,n,j,b,i,r,d,"static/chunks/1141-159df2d4c441a9d1.js","static/chunks/pages/workspaces/[name]-af76bb06dbb3954f.js"],sortedPages:["/","/_app","/_error","/clusters","/clusters/[cluster]","/clusters/[cluster]/[job]","/config","/infra","/infra/[context]","/jobs","/jobs/pools/[pool]","/jobs/[job]","/users","/volumes","/workspace/new","/workspaces","/workspaces/[name]"]}}("static/chunks/616-3d59f75e2ccf9321.js","static/chunks/6130-2be46d70a38f1e82.js","static/chunks/5739-d67458fcb1386c92.js","static/chunks/6989-01359c57e018caa4.js","static/chunks/3850-ff4a9a69d978632b.js","static/chunks/7411-b15471acd2cba716.js","static/chunks/1272-1ef0bf0237faccdb.js","static/chunks/8969-d8bc3a2b9cf839a9.js","static/chunks/6135-4b4d5e824b7f9d3c.js","static/chunks/754-d0da8ab45f9509e9.js","static/chunks/6990-f6818c84ed8f1c86.js","static/chunks/1121-d0782b9251f0fcd3.js","static/chunks/6601-06114c982db410b6.js","static/chunks/3015-88c7c8d69b0b6dba.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
1
+ self.__BUILD_MANIFEST=function(s,c,a,t,e,f,b,u,n,o,j,i,r,k){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-444f1804401f04ea.js"],"/_error":["static/chunks/pages/_error-c66a4e8afc46f17b.js"],"/clusters":["static/chunks/pages/clusters-469814d711d63b1b.js"],"/clusters/[cluster]":[s,c,a,f,b,"static/chunks/4676-9da7fdbde90b5549.js",o,t,e,u,j,n,i,"static/chunks/6856-5fdc9b851a18acdb.js",r,k,"static/chunks/9037-d0c00018a5ba198c.js","static/chunks/pages/clusters/[cluster]-e052384df65ef200.js"],"/clusters/[cluster]/[job]":[s,c,a,f,t,e,n,"static/chunks/pages/clusters/[cluster]/[job]-ad77b12fc736dca3.js"],"/config":["static/chunks/pages/config-dfb9bf07b13045f4.js"],"/infra":["static/chunks/pages/infra-aabba60d57826e0f.js"],"/infra/[context]":["static/chunks/pages/infra/[context]-6563820e094f68ca.js"],"/jobs":["static/chunks/pages/jobs-1f70d9faa564804f.js"],"/jobs/pools/[pool]":[s,c,a,b,o,t,e,u,"static/chunks/pages/jobs/pools/[pool]-509b2977a6373bf6.js"],"/jobs/[job]":[s,c,a,f,b,o,t,e,u,n,"static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js"],"/users":["static/chunks/pages/users-018bf31cda52e11b.js"],"/volumes":["static/chunks/pages/volumes-739726d6b823f532.js"],"/workspace/new":["static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js"],"/workspaces":["static/chunks/pages/workspaces-7528cc0ef8c522c5.js"],"/workspaces/[name]":[s,c,a,f,b,"static/chunks/1836-37fede578e2da5f8.js",t,e,u,j,n,i,r,k,"static/chunks/1141-159df2d4c441a9d1.js","static/chunks/pages/workspaces/[name]-af76bb06dbb3954f.js"],sortedPages:["/","/_app","/_error","/clusters","/clusters/[cluster]","/clusters/[cluster]/[job]","/config","/infra","/infra/[context]","/jobs","/jobs/pools/[pool]","/jobs/[job]","/users","/volumes","/workspace/new","/workspaces","/workspaces/[name]"]}}("static/chunks/616-3d59f75e2ccf9321.js","static/chunks/6130-2be46d70a38f1e82.js","static/chunks/5739-d67458fcb1386c92.js","static/chunks/6989-01359c57e018caa4.js","static/chunks/3850-ff4a9a69d978632b.js","static/chunks/7411-b15471acd2cba716.js","static/chunks/1272-1ef0bf0237faccdb.js","static/chunks/8969-d8bc3a2b9cf839a9.js","static/chunks/6135-4b4d5e824b7f9d3c.js","static/chunks/754-d0da8ab45f9509e9.js","static/chunks/6990-f6818c84ed8f1c86.js","static/chunks/1121-d0782b9251f0fcd3.js","static/chunks/6601-06114c982db410b6.js","static/chunks/3015-88c7c8d69b0b6dba.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();