skypilot-nightly 1.0.0.dev20250625__py3-none-any.whl → 1.0.0.dev20250627__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.
Files changed (85) hide show
  1. sky/__init__.py +2 -2
  2. sky/adaptors/kubernetes.py +1 -6
  3. sky/admin_policy.py +27 -17
  4. sky/client/cli/command.py +10 -5
  5. sky/client/sdk.py +91 -15
  6. sky/clouds/ssh.py +36 -0
  7. sky/core.py +20 -0
  8. sky/dashboard/out/404.html +1 -1
  9. sky/dashboard/out/_next/static/HudU4f4Xsy-cP51JvXSZ-/_buildManifest.js +1 -0
  10. sky/dashboard/out/_next/static/chunks/141-fa5a20cbf401b351.js +11 -0
  11. sky/dashboard/out/_next/static/chunks/25.76c246239df93d50.js +6 -0
  12. sky/dashboard/out/_next/static/chunks/43-36177d00f6956ab2.js +1 -0
  13. sky/dashboard/out/_next/static/chunks/430.ed51037d1a4a438b.js +1 -0
  14. sky/dashboard/out/_next/static/chunks/690.55f9eed3be903f56.js +16 -0
  15. sky/dashboard/out/_next/static/chunks/785.dc2686c3c1235554.js +1 -0
  16. sky/dashboard/out/_next/static/chunks/871-3db673be3ee3750b.js +6 -0
  17. sky/dashboard/out/_next/static/chunks/875.52c962183328b3f2.js +25 -0
  18. sky/dashboard/out/_next/static/chunks/973-81b2d057178adb76.js +1 -0
  19. sky/dashboard/out/_next/static/chunks/982.1b61658204416b0f.js +1 -0
  20. sky/dashboard/out/_next/static/chunks/984.e8bac186a24e5178.js +1 -0
  21. sky/dashboard/out/_next/static/chunks/990-0ad5ea1699e03ee8.js +1 -0
  22. sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-32ce4f49f2261f55.js → [cluster]-8040f2483897ed0c.js} +1 -1
  23. sky/dashboard/out/_next/static/chunks/pages/clusters-f119a5630a1efd61.js +1 -0
  24. sky/dashboard/out/_next/static/chunks/pages/config-6b255eae088da6a3.js +1 -0
  25. sky/dashboard/out/_next/static/chunks/pages/infra/[context]-b302aea4d65766bf.js +1 -0
  26. sky/dashboard/out/_next/static/chunks/pages/infra-ee8cc4d449945d19.js +1 -0
  27. sky/dashboard/out/_next/static/chunks/pages/{jobs-26da173e20af16e4.js → jobs-0a5695ff3075d94a.js} +1 -1
  28. sky/dashboard/out/_next/static/chunks/pages/{users-ce29e7420385563d.js → users-4978cbb093e141e7.js} +1 -1
  29. sky/dashboard/out/_next/static/chunks/pages/workspace/new-5b59bce9eb208d84.js +1 -0
  30. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-cb7e720b739de53a.js +1 -0
  31. sky/dashboard/out/_next/static/chunks/pages/{workspaces-862b120406461b10.js → workspaces-50e230828730cfb3.js} +1 -1
  32. sky/dashboard/out/_next/static/chunks/webpack-08fdb9e6070127fc.js +1 -0
  33. sky/dashboard/out/_next/static/css/52082cf558ec9705.css +3 -0
  34. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  35. sky/dashboard/out/clusters/[cluster].html +1 -1
  36. sky/dashboard/out/clusters.html +1 -1
  37. sky/dashboard/out/config.html +1 -1
  38. sky/dashboard/out/index.html +1 -1
  39. sky/dashboard/out/infra/[context].html +1 -1
  40. sky/dashboard/out/infra.html +1 -1
  41. sky/dashboard/out/jobs/[job].html +1 -1
  42. sky/dashboard/out/jobs.html +1 -1
  43. sky/dashboard/out/users.html +1 -1
  44. sky/dashboard/out/volumes.html +1 -1
  45. sky/dashboard/out/workspace/new.html +1 -1
  46. sky/dashboard/out/workspaces/[name].html +1 -1
  47. sky/dashboard/out/workspaces.html +1 -1
  48. sky/provision/kubernetes/utils.py +18 -2
  49. sky/server/rest.py +3 -2
  50. sky/server/server.py +4 -27
  51. sky/skylet/constants.py +5 -0
  52. sky/skypilot_config.py +3 -0
  53. sky/ssh_node_pools/__init__.py +1 -0
  54. sky/ssh_node_pools/core.py +133 -0
  55. sky/ssh_node_pools/server.py +232 -0
  56. sky/utils/kubernetes/deploy_remote_cluster.py +12 -185
  57. sky/utils/kubernetes/ssh_utils.py +221 -0
  58. {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250627.dist-info}/METADATA +1 -1
  59. {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250627.dist-info}/RECORD +65 -60
  60. sky/dashboard/out/_next/static/ZWdSYkqVe3WjnFR8ocqoG/_buildManifest.js +0 -1
  61. sky/dashboard/out/_next/static/chunks/211.692afc57e812ae1a.js +0 -1
  62. sky/dashboard/out/_next/static/chunks/310.2671028c20e892c7.js +0 -16
  63. sky/dashboard/out/_next/static/chunks/37-1f1e94f5a561202a.js +0 -6
  64. sky/dashboard/out/_next/static/chunks/42.bc85e5b1a4debf22.js +0 -6
  65. sky/dashboard/out/_next/static/chunks/443.b2242d0efcdf5f47.js +0 -1
  66. sky/dashboard/out/_next/static/chunks/513.309df9e18a9ff005.js +0 -1
  67. sky/dashboard/out/_next/static/chunks/66-66ae330df2d3c1c7.js +0 -1
  68. sky/dashboard/out/_next/static/chunks/682.00e56a220dd26fe1.js +0 -6
  69. sky/dashboard/out/_next/static/chunks/843-07d25a7e64462fd8.js +0 -11
  70. sky/dashboard/out/_next/static/chunks/856-cdf66268ec878d0c.js +0 -1
  71. sky/dashboard/out/_next/static/chunks/973-5b5019ba333e8d62.js +0 -1
  72. sky/dashboard/out/_next/static/chunks/pages/clusters-4aa031d1f42723d8.js +0 -1
  73. sky/dashboard/out/_next/static/chunks/pages/config-3102d02a188f04b3.js +0 -1
  74. sky/dashboard/out/_next/static/chunks/pages/infra/[context]-6f1e02e31eecb5ce.js +0 -1
  75. sky/dashboard/out/_next/static/chunks/pages/infra-fd5dc8a91bd9169a.js +0 -1
  76. sky/dashboard/out/_next/static/chunks/pages/workspace/new-09ae0f6f972aa871.js +0 -1
  77. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-0b4c662a25e4747a.js +0 -1
  78. sky/dashboard/out/_next/static/chunks/webpack-6133dc1e928bd0b5.js +0 -1
  79. sky/dashboard/out/_next/static/css/b23cb0257bf96c51.css +0 -3
  80. /sky/dashboard/out/_next/static/{ZWdSYkqVe3WjnFR8ocqoG → HudU4f4Xsy-cP51JvXSZ-}/_ssgManifest.js +0 -0
  81. /sky/dashboard/out/_next/static/chunks/pages/{_app-0ef7418d1a3822f3.js → _app-9a3ce3170d2edcec.js} +0 -0
  82. {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250627.dist-info}/WHEEL +0 -0
  83. {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250627.dist-info}/entry_points.txt +0 -0
  84. {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250627.dist-info}/licenses/LICENSE +0 -0
  85. {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250627.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,221 @@
1
+ """Utility functions for managing SSH node pools."""
2
+ import os
3
+ import re
4
+ import subprocess
5
+ from typing import Any, Callable, Dict, List, Optional
6
+ import uuid
7
+
8
+ import yaml
9
+
10
+ from sky.utils import ux_utils
11
+
12
+ DEFAULT_SSH_NODE_POOLS_PATH = os.path.expanduser('~/.sky/ssh_node_pools.yaml')
13
+ RED = '\033[0;31m'
14
+ NC = '\033[0m' # No color
15
+
16
+
17
+ def check_host_in_ssh_config(hostname: str) -> bool:
18
+ """Return True iff *hostname* matches at least one `Host`/`Match` stanza
19
+ in the user's OpenSSH client configuration (including anything pulled in
20
+ via Include).
21
+
22
+ It calls: ssh -vvG <hostname> -o ConnectTimeout=0
23
+ which:
24
+ • -G expands the effective config without connecting
25
+ • -vv prints debug lines that show which stanzas are applied
26
+ • ConnectTimeout=0 avoids a DNS lookup if <hostname> is a FQDN/IP
27
+
28
+ No config files are opened or parsed manually.
29
+
30
+ Parameters
31
+ ----------
32
+ hostname : str
33
+ The alias/IP/FQDN you want to test.
34
+
35
+ Returns
36
+ -------
37
+ bool
38
+ True – a specific stanza matched the host
39
+ False – nothing but the global defaults (`Host *`) applied
40
+ """
41
+ # We direct stderr→stdout because debug output goes to stderr.
42
+ proc = subprocess.run(
43
+ ['ssh', '-vvG', hostname, '-o', 'ConnectTimeout=0'],
44
+ text=True,
45
+ stdout=subprocess.PIPE,
46
+ stderr=subprocess.STDOUT,
47
+ check=False, # we only want the text, not to raise
48
+ )
49
+
50
+ # Look for lines like:
51
+ # debug1: ~/.ssh/config line 42: Applying options for <hostname>
52
+ # Anything other than "*"
53
+ pattern = re.compile(r'^debug\d+: .*Applying options for ([^*].*)$',
54
+ re.MULTILINE)
55
+
56
+ return bool(pattern.search(proc.stdout))
57
+
58
+
59
+ class UniqueKeySafeLoader(yaml.SafeLoader):
60
+ """Custom YAML loader that raises an error if there are duplicate keys."""
61
+
62
+ def construct_mapping(self, node, deep=False):
63
+ mapping = set()
64
+ for key_node, _ in node.value:
65
+ key = self.construct_object(key_node, deep=deep)
66
+ if key in mapping:
67
+ raise yaml.constructor.ConstructorError(
68
+ note=(f'Duplicate key found: {key!r}.\n'
69
+ 'Please remove one of them from the YAML file.'))
70
+ mapping.add(key)
71
+ return super().construct_mapping(node, deep)
72
+
73
+
74
+ def load_ssh_targets(file_path: str) -> Dict[str, Any]:
75
+ """Load SSH targets from YAML file."""
76
+ if not os.path.exists(file_path):
77
+ with ux_utils.print_exception_no_traceback():
78
+ raise ValueError(f'SSH Node Pools file not found: {file_path}')
79
+
80
+ try:
81
+ with open(file_path, 'r', encoding='utf-8') as f:
82
+ targets = yaml.load(f, Loader=UniqueKeySafeLoader)
83
+ return targets
84
+ except yaml.constructor.ConstructorError as e:
85
+ with ux_utils.print_exception_no_traceback():
86
+ raise ValueError(e.note) from e
87
+ except (yaml.YAMLError, IOError, OSError) as e:
88
+ with ux_utils.print_exception_no_traceback():
89
+ raise ValueError(f'Error loading SSH Node Pools file: {e}') from e
90
+
91
+
92
+ def get_cluster_config(
93
+ targets: Dict[str, Any],
94
+ cluster_name: Optional[str] = None,
95
+ file_path: str = DEFAULT_SSH_NODE_POOLS_PATH) -> Dict[str, Any]:
96
+ """Get configuration for specific clusters or all clusters."""
97
+ if not targets:
98
+ with ux_utils.print_exception_no_traceback():
99
+ raise ValueError(
100
+ f'No clusters defined in SSH Node Pools file {file_path}')
101
+
102
+ if cluster_name:
103
+ if cluster_name not in targets:
104
+ with ux_utils.print_exception_no_traceback():
105
+ raise ValueError(f'Cluster {cluster_name!r} not found in '
106
+ f'SSH Node Pools file {file_path}')
107
+ return {cluster_name: targets[cluster_name]}
108
+
109
+ # Return all clusters if no specific cluster is specified
110
+ return targets
111
+
112
+
113
+ def prepare_hosts_info(
114
+ cluster_name: str,
115
+ cluster_config: Dict[str, Any],
116
+ upload_ssh_key_func: Optional[Callable[[str, str], str]] = None
117
+ ) -> List[Dict[str, str]]:
118
+ """Prepare list of hosts with resolved user, identity_file, and password.
119
+
120
+ Args:
121
+ cluster_name: The name of the cluster.
122
+ cluster_config: The configuration for the cluster.
123
+ upload_ssh_key_func: A function to upload the SSH key to the remote
124
+ server and wait for the key to be uploaded. This function will take
125
+ the key name and the local key file path as input, and return the
126
+ path for the remote SSH key file on the API server. This function
127
+ will only be set in `sky ssh up -f` mode, and if this function is
128
+ set, any ssh config will not be allowed as we don't support
129
+ uploading any ssh config to the API server.
130
+
131
+ Returns:
132
+ A list of hosts with resolved user, identity_file, and password.
133
+ """
134
+ if 'hosts' not in cluster_config or not cluster_config['hosts']:
135
+ with ux_utils.print_exception_no_traceback():
136
+ raise ValueError(
137
+ f'No hosts defined in cluster {cluster_name} configuration')
138
+
139
+ # Get cluster-level defaults
140
+ cluster_user = cluster_config.get('user', '')
141
+ cluster_identity_file = os.path.expanduser(
142
+ cluster_config.get('identity_file', ''))
143
+ cluster_password = cluster_config.get('password', '')
144
+
145
+ # Check if cluster identity file exists
146
+ if cluster_identity_file and not os.path.isfile(cluster_identity_file):
147
+ with ux_utils.print_exception_no_traceback():
148
+ raise ValueError(
149
+ f'SSH Identity File Missing: {cluster_identity_file}')
150
+
151
+ use_cluster_config_msg = (f'Cluster {cluster_name} uses SSH config '
152
+ 'for hostname {host}, which is not '
153
+ 'supported by the -f flag. Please use a '
154
+ 'dict with `ip` field instead.')
155
+
156
+ def _maybe_hardcode_identity_file(i: int, identity_file: str) -> str:
157
+ if upload_ssh_key_func is None:
158
+ return identity_file
159
+ if not os.path.exists(os.path.expanduser(identity_file)):
160
+ with ux_utils.print_exception_no_traceback():
161
+ raise ValueError(
162
+ f'Identity file {identity_file} does not exist.')
163
+ key_name = f'{cluster_name}-{i}-{str(uuid.uuid4())[:4]}'
164
+ key_file_on_api_server = upload_ssh_key_func(key_name, identity_file)
165
+ return key_file_on_api_server
166
+
167
+ hosts_info = []
168
+ for i, host in enumerate(cluster_config['hosts']):
169
+ # Host can be a string (IP or SSH config hostname) or a dict
170
+ if isinstance(host, str):
171
+ # Check if this is an SSH config hostname
172
+ is_ssh_config_host = check_host_in_ssh_config(host)
173
+ if upload_ssh_key_func is not None and is_ssh_config_host:
174
+ with ux_utils.print_exception_no_traceback():
175
+ raise ValueError(use_cluster_config_msg.format(host=host))
176
+
177
+ hosts_info.append({
178
+ 'ip': host,
179
+ 'user': '' if is_ssh_config_host else cluster_user,
180
+ 'identity_file': '' if is_ssh_config_host else
181
+ _maybe_hardcode_identity_file(
182
+ i, cluster_identity_file),
183
+ 'password': cluster_password,
184
+ 'use_ssh_config': is_ssh_config_host
185
+ })
186
+ else:
187
+ # It's a dict with potential overrides
188
+ if 'ip' not in host:
189
+ print(f'{RED}Warning: Host missing \'ip\' field, '
190
+ f'skipping: {host}{NC}')
191
+ continue
192
+
193
+ # Check if this is an SSH config hostname
194
+ is_ssh_config_host = check_host_in_ssh_config(host['ip'])
195
+ if upload_ssh_key_func is not None and is_ssh_config_host:
196
+ with ux_utils.print_exception_no_traceback():
197
+ raise ValueError(use_cluster_config_msg.format(host=host))
198
+
199
+ # Use host-specific values or fall back to cluster defaults
200
+ host_user = '' if is_ssh_config_host else host.get(
201
+ 'user', cluster_user)
202
+ host_identity_file = '' if is_ssh_config_host else (
203
+ _maybe_hardcode_identity_file(
204
+ i, host.get('identity_file', cluster_identity_file)))
205
+ host_identity_file = os.path.expanduser(host_identity_file)
206
+ host_password = host.get('password', cluster_password)
207
+
208
+ if host_identity_file and not os.path.isfile(host_identity_file):
209
+ with ux_utils.print_exception_no_traceback():
210
+ raise ValueError(
211
+ f'SSH Identity File Missing: {host_identity_file}')
212
+
213
+ hosts_info.append({
214
+ 'ip': host['ip'],
215
+ 'user': host_user,
216
+ 'identity_file': host_identity_file,
217
+ 'password': host_password,
218
+ 'use_ssh_config': is_ssh_config_host
219
+ })
220
+
221
+ return hosts_info
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250625
3
+ Version: 1.0.0.dev20250627
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,10 +1,10 @@
1
- sky/__init__.py,sha256=RZFqktIWm9VjDd9MvcA69cl8cIDECyax-7XYwnjbnLc,6419
2
- sky/admin_policy.py,sha256=54DnRMDS0YaVNKG0vCfCaIUY7tKfMmEOFKKiuhGJgro,8976
1
+ sky/__init__.py,sha256=Sx44dETmHGyhZkqZcxkmsacwYCc7xmEeOcxTv_NPTc0,6419
2
+ sky/admin_policy.py,sha256=FMiizgvVTmD9gFA2OUaveXnuY3lbNU-fCbUYAODBZj4,9427
3
3
  sky/authentication.py,sha256=jIX30mcTDVHKdJJa5Tje4qSgX8pL1xE1IJWRK_aHnHw,25465
4
4
  sky/check.py,sha256=qN0SGRxSGMOKaxubRlCQayZUMIjviTInEKhNMYZQ4cw,30246
5
5
  sky/cli.py,sha256=VXIZryeTtJPYpPTBKymVPmuOCyh8knfWrq-qnkr6R-4,178
6
6
  sky/cloud_stores.py,sha256=Ln5GBpel-sEs7rVx7bBrMkfLwA_bctI05Rox2uoz7Lo,26388
7
- sky/core.py,sha256=C2L9k7z_bH1A0T_T3O1G02w1w-7Q9JYulyLo5W6ylhk,55580
7
+ sky/core.py,sha256=5UbaZ5xamYTajEq4TyiT81Q_cVzqPnMQRXASSz4OcNg,56272
8
8
  sky/dag.py,sha256=5MFXlP43y9U54zxfYGhVyBiWEInoFFlt_zJ7ASJntXw,3889
9
9
  sky/exceptions.py,sha256=YRPgpFkBRGE9jmG2r3SWJGS9p9-RPP2TZGjfd2VblSc,19044
10
10
  sky/execution.py,sha256=BhI4paGKpXMhWJoelHFe7LGFbCnW7hl0rIAmdIay-dk,33223
@@ -13,7 +13,7 @@ sky/models.py,sha256=I_DgzfDcNeJBoVV8FRR8BcNYkE0hzwxuj28Jjs6oxZg,2611
13
13
  sky/optimizer.py,sha256=2JZl6exFMuOAzpWefvfY9CZPWnvjDLLvR92A2qpvtRs,61418
14
14
  sky/resources.py,sha256=Jcg6z337r54D0NA_nTSnG8453lceC2zlTbC1bQwk8lQ,100064
15
15
  sky/sky_logging.py,sha256=cMurxhFExKEFX1frcMR71Ti_s9Obg9WY30veVxsZB6o,7285
16
- sky/skypilot_config.py,sha256=YB2CpsOy7jFXd0cr9NKARWuq0-k85inEszV8OvPjnJA,34032
16
+ sky/skypilot_config.py,sha256=-ftlGHJpitBfBMHM6RqDaZYFhzWbsa80_eiVxSRbAPg,34189
17
17
  sky/task.py,sha256=lSPLp4mc_plmY7ZI0mCmNG6aeeHFtIQzx23UWNclUOs,70701
18
18
  sky/adaptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  sky/adaptors/aws.py,sha256=4caUTO5nxZQyDVPyQdoPljaF-Lz_Fa6NEnu3FfmLZd4,8633
@@ -26,7 +26,7 @@ sky/adaptors/docker.py,sha256=_kzpZ0fkWHqqQAVVl0llTsCE31KYz3Sjn8psTBQHVkA,468
26
26
  sky/adaptors/gcp.py,sha256=oEb9jClEtApw6PQnxdxDYxOCYsedvM3aiko1EW1FDVo,3501
27
27
  sky/adaptors/hyperbolic.py,sha256=iyHDmtLFVTK9QajpAmObk0XO2OZnnO_1LbvDffPpt68,245
28
28
  sky/adaptors/ibm.py,sha256=7YbHrWbYcZsJDgxMBNZr1yBI03mjs_C3pnCTCz-MNtQ,5068
29
- sky/adaptors/kubernetes.py,sha256=hlSXeJyTR8j_yIbJ8WynvyXCjUDvdUDOwzQOVx8SK6g,9732
29
+ sky/adaptors/kubernetes.py,sha256=Y5rZI6hXstGDvMLi16dJtgbCuMfKdB772Jo5iVOzXjE,9455
30
30
  sky/adaptors/nebius.py,sha256=5dLZcWWCtwVdlQESfpXo4ZsZ832INw5ih16EUd8IR7c,8695
31
31
  sky/adaptors/oci.py,sha256=xJt6J9xBSFIENa6FwEt1V1sZE8puAZ_vPEoGlyQACPs,2839
32
32
  sky/adaptors/runpod.py,sha256=4Nt_BfZhJAKQNA3wO8cxvvNI8x4NsDGHu_4EhRDlGYQ,225
@@ -76,9 +76,9 @@ sky/catalog/data_fetchers/fetch_vsphere.py,sha256=Yf7tKzwJsQ_4f64IT1EAP108C1D3Rg
76
76
  sky/client/__init__.py,sha256=pz6xvVSd9X-gwqbsDL0E9QOojYqM0KAD0j-NCyCIF1k,38
77
77
  sky/client/common.py,sha256=E_5cjxd8fWRB7fU1yfIbiyQf-IyVhpD5KkB7Fl3cQEI,15215
78
78
  sky/client/oauth.py,sha256=sNJ_DMsSTcxluj5FeNQ2IafZJLImRFmCAZ79bXeABn4,2871
79
- sky/client/sdk.py,sha256=gTcnoDn7-1QEB0XbMBVk3nXnYxGrFty5yqErI4_5Y3k,86241
79
+ sky/client/sdk.py,sha256=w6NjjJALHAUPBtdrBlmJxv3NWHNcKioFKHP9s-OPZJQ,89494
80
80
  sky/client/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- sky/client/cli/command.py,sha256=W4nzQ64ckekLrLOFynqP-BcXUHMMNO0mpNQrH5J-mEQ,214654
81
+ sky/client/cli/command.py,sha256=ROqEg7Toj-mHJZALOGKK2nv5GwLmhziQDHAeo6RsHb8,214851
82
82
  sky/client/cli/deprecation_utils.py,sha256=H_d5UyF2CekEoThduAzt5cihBO8hwKYMu0-Wqfbjv5E,3370
83
83
  sky/client/cli/flags.py,sha256=6IdS_G2lB1C6r8kJMzLVREY_qV50VHiSfWlmppVrWuc,11623
84
84
  sky/clouds/__init__.py,sha256=tC9_Vi6GvVceWUi6uZvm7vXzBa0uH3CjRQ-QCYqdJMw,1624
@@ -98,7 +98,7 @@ sky/clouds/oci.py,sha256=_6FtvLBaoFo9ndyDudezMuUVW5gaP4AaZbMoEV82YBQ,27974
98
98
  sky/clouds/paperspace.py,sha256=cZkidPfWp7GwV23yNQAnlW2X6m_GXsl5qnmDvw5upHA,11414
99
99
  sky/clouds/runpod.py,sha256=5pR4oyFu3yh2BQzE3pxIpNIglsvzwGQ9YkabPW-gBVM,12807
100
100
  sky/clouds/scp.py,sha256=Q3DZcio9bIlY3hBuHt7NF3qgXlVzOTdqStSFsH9mI4Y,15655
101
- sky/clouds/ssh.py,sha256=8zapahEhAPkeAxU1UB0L0LYR7Yyp8OT1HCYclXYzx_4,8460
101
+ sky/clouds/ssh.py,sha256=3RAideItETYUP6TUPcHql_BrS7CyJjLmR-Ft_4XzUXE,9866
102
102
  sky/clouds/vast.py,sha256=1pzpdGqWDi9sEhDGq8E0f2G9v-2bsQjblNoGVyYR1yI,11751
103
103
  sky/clouds/vsphere.py,sha256=8jq_zS7q2DJDRC-MkmQh9ZWPN3j3ZsMucsAk_SZu8lc,12761
104
104
  sky/clouds/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -107,76 +107,77 @@ sky/clouds/utils/azure_utils.py,sha256=NToRBnhEyuUvb-nBnsKTxjhOBRkMcrelL8LK4w6s4
107
107
  sky/clouds/utils/gcp_utils.py,sha256=rh4a91euYFflq6V7bLpY9XnAwnwyNczRueOShpD-E8U,7204
108
108
  sky/clouds/utils/oci_utils.py,sha256=0YxhgZdeIHQUI1AZ86YuswsZg5HdVCIVfSTRJsSHYI0,6396
109
109
  sky/clouds/utils/scp_utils.py,sha256=VGuccVO5uFGr8-yolWSoYrgr11z6cIeDBGcqkBzAyOs,18409
110
- sky/dashboard/out/404.html,sha256=byaTFiB4W4MrZjcBfttGmqfVCbpXHz4MIx7QLeINeYs,1423
111
- sky/dashboard/out/clusters.html,sha256=IAvFrm7GKELDwKbOw3ir5bQVvPfSouq2zpcAHaj9Zrw,1418
112
- sky/dashboard/out/config.html,sha256=xU2zmHN_EuX-m6xTHpoASEweMTZ3UtoL5v9kQ589dOA,1414
110
+ sky/dashboard/out/404.html,sha256=4Wom0AJ6VbjnbPJOG5du1YTkI9TzSZX_CDwbaoCd88c,1423
111
+ sky/dashboard/out/clusters.html,sha256=PnrBVsYUa7nRFYmJ_awSz9fj0CfY2oxdV2CQXWQye8o,1418
112
+ sky/dashboard/out/config.html,sha256=d01pZPoMJLm8KPEK8FzXFC--ALff3Zy7NK86cbF_xIc,1414
113
113
  sky/dashboard/out/favicon.ico,sha256=XilUZZglAl_1zRsg85QsbQgmQAzGPQjcUIJ-A3AzYn8,93590
114
- sky/dashboard/out/index.html,sha256=ioS6J2Ev70zvTZ5rxVqn_uoPTYbelifzdApL_5W5DGI,1407
115
- sky/dashboard/out/infra.html,sha256=GG-Yo_LD9LzpN5EuxbYg06X6pudgqEHRsm0Us6arsDI,1412
116
- sky/dashboard/out/jobs.html,sha256=Lo3vtkhZUjV_uw6Qy1HM5h0rDzFwPZF40z0ZK2CZABw,1410
114
+ sky/dashboard/out/index.html,sha256=8x5Wug7Tir1r3JGx-6H1D6rBIl8P-A1KiZHBY_v2C8o,1407
115
+ sky/dashboard/out/infra.html,sha256=zun7ADCs2KN0rbC1Qib6V8JZOCvDMeY1IziHA7zViIY,1412
116
+ sky/dashboard/out/jobs.html,sha256=sC0iRoK8aAMvcxvEGl9uvA4KwoM6WOEXb_yfyCMAbNc,1410
117
117
  sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
118
- sky/dashboard/out/users.html,sha256=Sv-UEzL3ym2hOtZuaSIwQ45Gh2fuyJiLna6EbLa1wjA,1412
119
- sky/dashboard/out/volumes.html,sha256=pN1OTaS2szR8PrWZYSUuKM5xU2vYB1aPDoKvR7h39UY,1416
120
- sky/dashboard/out/workspaces.html,sha256=cXXl0reWo3P7uvsPFAGMedLV09X-iGU0VZLsaJe3_Po,1422
121
- sky/dashboard/out/_next/static/ZWdSYkqVe3WjnFR8ocqoG/_buildManifest.js,sha256=0kBB6ES7EOMSdHv8Z42A-YHAXHD7imkO3uUCrlvILF8,2169
122
- sky/dashboard/out/_next/static/ZWdSYkqVe3WjnFR8ocqoG/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
123
- sky/dashboard/out/_next/static/chunks/211.692afc57e812ae1a.js,sha256=TbpmhT-AzGXhDbjA6mJG_D5dLgq_st-hMr0nbCpRsEY,3778
118
+ sky/dashboard/out/users.html,sha256=diWaay2ltX_-LK17vmPxHBSRgAZQTKfA9eZEmZk2os8,1412
119
+ sky/dashboard/out/volumes.html,sha256=Ch9UX5Ri4w59aKNx2wAaZtj-1gqZBw2q9NJ73E1uFlM,1416
120
+ sky/dashboard/out/workspaces.html,sha256=_B3RMehwLax3-d2ac1aHEuSbx2Y0QbQAeo8n2h0A-_U,1422
121
+ sky/dashboard/out/_next/static/HudU4f4Xsy-cP51JvXSZ-/_buildManifest.js,sha256=qbv4stQCWKX4iRojj0ZY5PPMkxz27PBQM-_zC16U-ZM,2170
122
+ sky/dashboard/out/_next/static/HudU4f4Xsy-cP51JvXSZ-/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
123
+ sky/dashboard/out/_next/static/chunks/141-fa5a20cbf401b351.js,sha256=nCeN7eravceeJ87m8duix4t6-Eo2VshZVBFRUQzR9dU,17822
124
124
  sky/dashboard/out/_next/static/chunks/230-d6e363362017ff3a.js,sha256=WkDwCK_WCE2UfSYZNnfVrRHsYqgkpA9HBfnZtXKSkeI,22583
125
- sky/dashboard/out/_next/static/chunks/310.2671028c20e892c7.js,sha256=BGOhxV6TGjf7Z8uUymcI7f6Ncaj_3YObJtTd3Br3d8U,34756
126
- sky/dashboard/out/_next/static/chunks/37-1f1e94f5a561202a.js,sha256=zBzeMhOb8Of1aH4uU-lMSrvowGjxikvVBkP5hjTWyiU,19047
127
- sky/dashboard/out/_next/static/chunks/42.bc85e5b1a4debf22.js,sha256=3UEzVVmejY2fxKtQq_jKQP1_Fu-oOFiS9bMlWt2lGoo,13452
128
- sky/dashboard/out/_next/static/chunks/443.b2242d0efcdf5f47.js,sha256=PCxtMhwuF2YB0CtKlV6rjYXSyZZtPLA7miWqyCGEEHo,18352
125
+ sky/dashboard/out/_next/static/chunks/25.76c246239df93d50.js,sha256=w6BKvAxj9L2j1Ss4j6ZFE6_FAYuHcrDdQsEmI4-cmWs,10635
126
+ sky/dashboard/out/_next/static/chunks/43-36177d00f6956ab2.js,sha256=yRulANYggEvbxVWGb9iAYtGmI8o9lK48M9STghTUYok,16674
127
+ sky/dashboard/out/_next/static/chunks/430.ed51037d1a4a438b.js,sha256=vczgwkklvp5g6SroggeUauhjstjg2oPR0fmpTS9t5Qc,925
129
128
  sky/dashboard/out/_next/static/chunks/470-92dd1614396389be.js,sha256=JVu40o9FW6PdYFiPRZ7MWsLxrVgd5iuxe0kK7pQEcUw,15590
130
129
  sky/dashboard/out/_next/static/chunks/491.b3d264269613fe09.js,sha256=WVRPM-7C1QZqInNmEaFw_vpaCR0GcyjnOTvGMWdbYRs,8486
131
- sky/dashboard/out/_next/static/chunks/513.309df9e18a9ff005.js,sha256=N_W6rOSJNHKK1lnldigsLWogv_WLUJaaHz4fq1kjBvI,7088
132
130
  sky/dashboard/out/_next/static/chunks/544.110e53813fb98e2e.js,sha256=sZMt5pTninJj64KQrKZtmgyy2kEPHlFP1MLjWrj8_88,306
133
131
  sky/dashboard/out/_next/static/chunks/616-d6128fa9e7cae6e6.js,sha256=KdZtaXM4mX6I7wJME5yyIOOX8jGgstijnb9QPgo3bdM,179244
134
132
  sky/dashboard/out/_next/static/chunks/645.961f08e39b8ce447.js,sha256=N3zoEuCVl072EOJjTeBE2ElGppaQYTgR6T2xXEB7eUw,20033
135
- sky/dashboard/out/_next/static/chunks/66-66ae330df2d3c1c7.js,sha256=v_vmRxImKOGhTFF2TAkinfhsSA5esLMN2orjr1WwehQ,13291
136
133
  sky/dashboard/out/_next/static/chunks/664-047bc03493fda379.js,sha256=zPR7g3iSBlKD2s7vlzJ9sBtaNkg6uqdp1u_0587Fxyo,6556
137
- sky/dashboard/out/_next/static/chunks/682.00e56a220dd26fe1.js,sha256=V9Y4u4JsVb45YZo7CbSvdP5kbrTs3Px02lmcUKB8kio,22326
134
+ sky/dashboard/out/_next/static/chunks/690.55f9eed3be903f56.js,sha256=LxjKR7fBqYlEByfJc6VK-Vrc8O-0WZtPnOdacRmEfM4,29535
138
135
  sky/dashboard/out/_next/static/chunks/697.6460bf72e760addd.js,sha256=rKeQh2I9u5AeRlsQUXBQhtplnX6iAkujYoho6rg8dXY,9413
136
+ sky/dashboard/out/_next/static/chunks/785.dc2686c3c1235554.js,sha256=RBLio8Y0Ysl69JawpZ_gFbN-gbKNmsCQnWpw2fO0_zQ,4572
139
137
  sky/dashboard/out/_next/static/chunks/798-c0525dc3f21e488d.js,sha256=qROA0j-IKFdZFhQdWglA67iuCH8pf6mQRDqD6Q4hy00,38450
140
138
  sky/dashboard/out/_next/static/chunks/799-3625946b2ec2eb30.js,sha256=KZOrIkUG_Ju9ObLHlSS3_PIllwuGzw1o9FrCL_NsXGY,64559
141
139
  sky/dashboard/out/_next/static/chunks/804-4c9fc53aa74bc191.js,sha256=yC-hYtK6OPB30EDHw7JG50eDF5-CufVV-lCg4__Fg-w,11465
142
- sky/dashboard/out/_next/static/chunks/843-07d25a7e64462fd8.js,sha256=GLzSTxq-eW2lOhXEDQOJzHJPYzUE5bIgxN6y4Zkpu_E,17674
143
- sky/dashboard/out/_next/static/chunks/856-cdf66268ec878d0c.js,sha256=xS7JlfYASz1ysPXoizWKtaEltOdDvF-qDo7Mv6BmqA8,14268
140
+ sky/dashboard/out/_next/static/chunks/871-3db673be3ee3750b.js,sha256=Uc2zHbCyuXJPE9mZzNYZ1JqTsfHIZ_RSx216c2WT3nw,16208
141
+ sky/dashboard/out/_next/static/chunks/875.52c962183328b3f2.js,sha256=uwkp26H59tVeQ0DDZA9YYrWqZbInIJYx2PZE-s5FHk4,10052
144
142
  sky/dashboard/out/_next/static/chunks/937.3759f538f11a0953.js,sha256=IaXGhx7oSJ72AJzmF9c1IoK02F_rVo_YlnM2WWofWPo,54431
145
143
  sky/dashboard/out/_next/static/chunks/938-068520cc11738deb.js,sha256=dQMOHFUBZrLmC7V2YvbcjGGo5NCEIUlmy8_kRh-GVdc,25678
146
144
  sky/dashboard/out/_next/static/chunks/947-6620842ef80ae879.js,sha256=wVQ6A5PftPlT_QrlH9sd3i1IKtJLXBWg6rVisQ9Ktfs,10017
147
145
  sky/dashboard/out/_next/static/chunks/969-d3a0b53f728d280a.js,sha256=7vGNbFr0SbImIdjqEecyzD9d0sM7Lsfg851gUAMHBoM,9798
148
- sky/dashboard/out/_next/static/chunks/973-5b5019ba333e8d62.js,sha256=Ae6HPYDbcw8KzXylLfuirURKWoxuA6y6Vhk1PR-t4U0,10628
146
+ sky/dashboard/out/_next/static/chunks/973-81b2d057178adb76.js,sha256=Y0MkFX3534sdyp_PJggApYQzhEAcZcJm7F0wP5n8Hv0,8221
147
+ sky/dashboard/out/_next/static/chunks/982.1b61658204416b0f.js,sha256=sleE6OwKlHJBhHnGxMoYYOP4NaVxRTARQ9TuQtl3d_Q,15525
148
+ sky/dashboard/out/_next/static/chunks/984.e8bac186a24e5178.js,sha256=La8RN4LRGJJIE9mSpUr_PCoC6S-H5_3_LSXDqsBmGEc,40808
149
149
  sky/dashboard/out/_next/static/chunks/989-db34c16ad7ea6155.js,sha256=sTGISt_JIACVJorZS8_lq9_RtlwUG98wI6xzosS-zCI,9434
150
+ sky/dashboard/out/_next/static/chunks/990-0ad5ea1699e03ee8.js,sha256=vUYDvO9-CClIXLdV0GNIgbb_pKaLOOfIiHLY7LO6oiQ,16115
150
151
  sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js,sha256=ce2WOATL1LdzsWouKQ-1NCiBQJmcykgzqP8wCp1yqbE,172831
151
152
  sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js,sha256=dh6TKdXcSRoGP4HqHe2uwzWCZBPz16dyTWufLsxeRvM,140942
152
153
  sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js,sha256=P0_tU7pqs_pOQaw-lVzCNl6recBw5lFfkAD0jRk2uzc,115881
153
154
  sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js,sha256=BxTmVbZDnMUQvQd57MEl1Ui0VZaNmwLOviY7h_xMjP0,109884
154
155
  sky/dashboard/out/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js,sha256=6QPOwdWeAVe8x-SsiDrm-Ga6u2DkqgG5SFqglrlyIgA,91381
155
- sky/dashboard/out/_next/static/chunks/webpack-6133dc1e928bd0b5.js,sha256=uCGsNfrDyAEsZeoVskW68gFkGzbiBnAo8h5OvSOIcKc,4492
156
- sky/dashboard/out/_next/static/chunks/pages/_app-0ef7418d1a3822f3.js,sha256=kGC1bIix42JPaw3QBOZWTRSDrcxM_LcwJsEj_m7ipwk,7570
156
+ sky/dashboard/out/_next/static/chunks/webpack-08fdb9e6070127fc.js,sha256=m9AILwoQlHjkKhuzayHgK4alfhAwSp6TGRjNgE_8AvE,4541
157
+ sky/dashboard/out/_next/static/chunks/pages/_app-9a3ce3170d2edcec.js,sha256=kGC1bIix42JPaw3QBOZWTRSDrcxM_LcwJsEj_m7ipwk,7570
157
158
  sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js,sha256=TZqrus06KKPx-CMABDMPKF7w-NQ5s2gwJAM8Huyl7qU,247
158
- sky/dashboard/out/_next/static/chunks/pages/clusters-4aa031d1f42723d8.js,sha256=LSz1JeDcSp42CHvKMlaBlOXyTgRJIaIkEZrVVUMXOqM,832
159
- sky/dashboard/out/_next/static/chunks/pages/config-3102d02a188f04b3.js,sha256=34Gvm5Z_WYlEQD1gwyeaMGAff4woNpY2ShfGqLkuPrc,776
159
+ sky/dashboard/out/_next/static/chunks/pages/clusters-f119a5630a1efd61.js,sha256=-zxhubbpW2s9mEBzyGBnpZeuqv-tDvKP1wrCT_Z3SJI,833
160
+ sky/dashboard/out/_next/static/chunks/pages/config-6b255eae088da6a3.js,sha256=bM0Pop9raIOvuVMyZESmKZ-K3BHDv5N2Pvq_c8B9t40,777
160
161
  sky/dashboard/out/_next/static/chunks/pages/index-6b0d9e5031b70c58.js,sha256=Fp2FKnKQtORK_5O7MEQ08tlTk7ewMLuecw_EY5g4Dlg,513
161
- sky/dashboard/out/_next/static/chunks/pages/infra-fd5dc8a91bd9169a.js,sha256=j1zE9goTgbtdv3oP6Fm4vQTY0h9QswXeT88hAhtrjxo,796
162
- sky/dashboard/out/_next/static/chunks/pages/jobs-26da173e20af16e4.js,sha256=RO6x7pAOL2VIeKShgY6i5UVZAxsC4FGUxbvnJK8h8ro,834
163
- sky/dashboard/out/_next/static/chunks/pages/users-ce29e7420385563d.js,sha256=P5_tfLlra4rWlh_mg3dvL1j1M6UlWpiENnIt_Y5Bc3Q,806
162
+ sky/dashboard/out/_next/static/chunks/pages/infra-ee8cc4d449945d19.js,sha256=x0uu0li0QFub-_q__1PqfeVTtz1L5AF2qScJsQo6h5A,805
163
+ sky/dashboard/out/_next/static/chunks/pages/jobs-0a5695ff3075d94a.js,sha256=kE00uRt3Qbipyx4ISFoY_ILh3l6ZAnCpKeFFucgaKyg,834
164
+ sky/dashboard/out/_next/static/chunks/pages/users-4978cbb093e141e7.js,sha256=K-Qni4Pjo5-V5jda0FT4ghTWa4QZKQu8kJQblS39CKw,806
164
165
  sky/dashboard/out/_next/static/chunks/pages/volumes-476b670ef33d1ecd.js,sha256=dUTHjiMED4zNARhKc7ICqwvX5IN1hBSAMiXzegabXbE,768
165
- sky/dashboard/out/_next/static/chunks/pages/workspaces-862b120406461b10.js,sha256=5TR39mw2x2ozZnPTnCubqVQ_1DiPSFp1lKYDitgQcks,848
166
- sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-32ce4f49f2261f55.js,sha256=CSoE89n2Z1TawUloaGSr02V6KdW-Y9oBggf1wLKo7ys,16531
166
+ sky/dashboard/out/_next/static/chunks/pages/workspaces-50e230828730cfb3.js,sha256=e6Mt_kiQwKR2Bilc1rSuVat2jJzQsrGr3WaKreBmV38,848
167
+ sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-8040f2483897ed0c.js,sha256=jWaVTwUqzbXXsdJoFBo4eI48NmPHMpoMFYHteODd4Rw,16516
167
168
  sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-aff040d7bc5d0086.js,sha256=S0T39ORq8pVhFgUNG7FTeF22w9v85-HbHQknM4z0U2A,20240
168
- sky/dashboard/out/_next/static/chunks/pages/infra/[context]-6f1e02e31eecb5ce.js,sha256=pqsNYG5ZO0yEinn4Z5L3Oyzo6z1YpPnSP8czCt7SQ8k,806
169
+ sky/dashboard/out/_next/static/chunks/pages/infra/[context]-b302aea4d65766bf.js,sha256=jOfBiGwZ0Y4lt6_qu_K9tr2Bd4sbgy2ST2Apny9z6mE,815
169
170
  sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-e4b23128db0774cd.js,sha256=Yub_S1nVTAzh0A4r9k6UkRbkVxghk4etLhqXpS_i_yw,24343
170
- sky/dashboard/out/_next/static/chunks/pages/workspace/new-09ae0f6f972aa871.js,sha256=X3o7lqMpE0TbVZe-vTRGoFvCloySSIWoLBQ6EqSOD7c,757
171
- sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-0b4c662a25e4747a.js,sha256=Q-ZQr1E844k16lHVNfpwvxlGMmatPl5KOL-pn_Yh41w,4388
172
- sky/dashboard/out/_next/static/css/b23cb0257bf96c51.css,sha256=AWeYAaU26H8hRy70cFYf7IQ_AaAbhybcGueFvjU92S4,43095
173
- sky/dashboard/out/clusters/[cluster].html,sha256=1Sjy410Ld4bwXtHZe4-FbDoKzHC484eTS0O8yAH6DiI,2745
174
- sky/dashboard/out/clusters/[cluster]/[job].html,sha256=5yvOerMpt3GjRWv9v_34zXtC2lu2QaNZ1mRTwJCO4Jc,2067
175
- sky/dashboard/out/infra/[context].html,sha256=ZyZnbqTwr6hn_9_Ll64fKRG8mbYGrJrY0tz8DIUXhjs,1436
176
- sky/dashboard/out/jobs/[job].html,sha256=k0rkWIeYFEwBSonSEPiAfecU3oHpdo62MZ_SIfOv7-I,2209
171
+ sky/dashboard/out/_next/static/chunks/pages/workspace/new-5b59bce9eb208d84.js,sha256=eAJG1ElXXiny-HVkJcLkNuzY49G1GS6__71MItLU5Fk,758
172
+ sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-cb7e720b739de53a.js,sha256=hTtDcnaiRlbh5xoN6JgyAHW0tlQh2XdDf-PPPMT9VLo,1509
173
+ sky/dashboard/out/_next/static/css/52082cf558ec9705.css,sha256=HTMiKZlYRBhXwljhzadAoUlN6Y6ZV2p1gjQj2Z30nkE,44938
174
+ sky/dashboard/out/clusters/[cluster].html,sha256=88AWyjr4HC2sKCG4ruri3Isyohrp-FxiR_R4k02ZWWE,2746
175
+ sky/dashboard/out/clusters/[cluster]/[job].html,sha256=V1dzALncxYMjtUjgvz3FpRLQzTGspNuRDH9V0kG0RTI,2067
176
+ sky/dashboard/out/infra/[context].html,sha256=6R96HQazcUumefvQL0Rhm2R2XhfzUrieQvktWnoZEIk,1436
177
+ sky/dashboard/out/jobs/[job].html,sha256=d4ZfdFTF5El8m-xDDm634j0xotoUix7w_jTrEOVKbq4,2209
177
178
  sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
178
- sky/dashboard/out/workspace/new.html,sha256=lr3CmpxCK8lnf_LmSLNnbhIpfqpKHAsSpCZ1klLouOw,1428
179
- sky/dashboard/out/workspaces/[name].html,sha256=bwVBZZEU2KsLhtm-un6Ou40vDoDJK7YhoGL4v9PHKmU,2744
179
+ sky/dashboard/out/workspace/new.html,sha256=Na61aBqh8v1aXAtchFv52WJRa_-mfA-9Uw-XnSVOoYY,1428
180
+ sky/dashboard/out/workspaces/[name].html,sha256=i1c1RVpAPwTKVwXuLcuk9cKutGLcSx3whpko5Eo45zk,2744
180
181
  sky/data/__init__.py,sha256=Nhaf1NURisXpZuwWANa2IuCyppIuc720FRwqSE2oEwY,184
181
182
  sky/data/data_transfer.py,sha256=N8b0CQebDuHieXjvEVwlYmK6DbQxUGG1RQJEyTbh3dU,12040
182
183
  sky/data/data_utils.py,sha256=CNYPM963qby5ddW0DZNbhiWXkqgB9MHh_jrC5DoBctM,33437
@@ -246,7 +247,7 @@ sky/provision/kubernetes/constants.py,sha256=OXyMNSruqyfTJV90yH8PsHtmi04cgeac8mv
246
247
  sky/provision/kubernetes/instance.py,sha256=mPQA7r3y8Bg2WDN4nsgk3hgBo5NeL4RuLg0VELvjBTo,57981
247
248
  sky/provision/kubernetes/network.py,sha256=PEy7lZvmoysmormB49JW245tRcy4owAXzDGV5KHVPEI,12672
248
249
  sky/provision/kubernetes/network_utils.py,sha256=6uck1aBkgtm-gGBitU3_hEUp8j14ZuG_4Xo70ReZYXs,11654
249
- sky/provision/kubernetes/utils.py,sha256=C6jP93SXdYaw5rS4ISIvdTM_Gh-q4XK9n00vVWWE4o8,140904
250
+ sky/provision/kubernetes/utils.py,sha256=Dk66Bc02eZvmrHQ0q9_ldZ06O-2r5uxvVSNCFc2JOWc,141631
250
251
  sky/provision/kubernetes/volume.py,sha256=EI3XM1oO2qKBOsBe1vlt3uX1IuaBl23KFyJD-3jUqH8,5665
251
252
  sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml,sha256=S87GNAbDqgTrLuxF-afPAqQ0V-i41El4s_9KBZMuaag,1331
252
253
  sky/provision/lambda_cloud/__init__.py,sha256=6EEvSgtUeEiup9ivIFevHmgv0GqleroO2X0K7TRa2nE,612
@@ -319,8 +320,8 @@ sky/server/common.py,sha256=QrImjzIfx8YKdPBjwkCP-K4OaXVjRL9fcJUbBk5tQjE,34178
319
320
  sky/server/config.py,sha256=XWf5Kw4am6vMO5wcyWevbQAFH-dmKb7AMEgDzD083-M,8538
320
321
  sky/server/constants.py,sha256=o2gyedC4nYwHCdM05ZClnDnoOn5kCjAHpdkz0MsgK6k,1319
321
322
  sky/server/metrics.py,sha256=aVRaSwpBVXE9dXIVd9bNsSigKM4bkqNq0eTpP0Noyo8,3657
322
- sky/server/rest.py,sha256=x0BUQ0FXgG3U8Bf3eZ0r2fNkJ3Yd7GTuoS7gXeAjr-E,5738
323
- sky/server/server.py,sha256=6Hb2F6IVnDHGrUXQpa905sz7yXb47oMgn_TY2btlepI,62316
323
+ sky/server/rest.py,sha256=CF5RthCqH7QD-2Isj-MMf9t0GTiaruFzh6iEvW0D-oA,5769
324
+ sky/server/server.py,sha256=lChL5AQPJXaiYzNe6lP7gDasanY3YrOK6qOJh4VZ2_A,61596
324
325
  sky/server/state.py,sha256=YbVOMJ1JipQQv17gLIGyiGN7MKfnP83qlUa5MB1z0Yk,747
325
326
  sky/server/stream_utils.py,sha256=RS4RuMxQqTGqp3uxzZVtmFWzos4d49P7hMX_VklzEVU,9189
326
327
  sky/server/uvicorn.py,sha256=3mdSUbc8zHRYAbZZLkfPB6U9VXD_t2jDM1BMjpTx1Mo,9014
@@ -347,7 +348,7 @@ sky/skylet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
347
348
  sky/skylet/attempt_skylet.py,sha256=GZ6ITjjA0m-da3IxXXfoHR6n4pjp3X3TOXUqVvSrV0k,2136
348
349
  sky/skylet/autostop_lib.py,sha256=kGUnHm-jpF4zl3UJfB-4pnoldWpnVeR96WwYGSw7em0,4630
349
350
  sky/skylet/configs.py,sha256=kV490lonYVVQMDRO2haizlt9fpQmqBIpwBScn14zS78,2132
350
- sky/skylet/constants.py,sha256=Z4bp0K6iL3WZfVh1P_2CzN0oB-J0YHFljZOkXjUL3og,22853
351
+ sky/skylet/constants.py,sha256=5GZxeP6mbQPxAghhpW006xcMhffBfmck5vV777xPwk8,23022
351
352
  sky/skylet/events.py,sha256=pnV3ZiwWhXqTHpU5B5Y9Xwam_7FQDI6IrxgSx7X_NVA,12743
352
353
  sky/skylet/job_lib.py,sha256=aZ_lUU1u0HVU2AdTcYcFUAS7eeelK-bAbJlCoZ3QX7A,48267
353
354
  sky/skylet/log_lib.py,sha256=9nLOhevnM668itQyVyPSoQHKfZ2MWm_FwXPxK28X0oM,23201
@@ -368,6 +369,9 @@ sky/skylet/ray_patches/log_monitor.py.patch,sha256=CPoh3U_ogOHrkMOK7jaIRnwdzxjBT
368
369
  sky/skylet/ray_patches/resource_demand_scheduler.py.patch,sha256=AVV-Hw-Rxw16aFm4VsyzayX1QOvwmQuM79iVdSjkSl4,658
369
370
  sky/skylet/ray_patches/updater.py.patch,sha256=ZNMGVYICPBB44jLbEx2KvCgIY7BWYdDv3-2b2HJWmAQ,289
370
371
  sky/skylet/ray_patches/worker.py.patch,sha256=_OBhibdr3xOy5Qje6Tt8D1eQVm_msi50TJbCJmOTxVU,565
372
+ sky/ssh_node_pools/__init__.py,sha256=phpYJAd7I0uO1-O87eb9PbetGbtMiKW5mI-NQCZlXPA,40
373
+ sky/ssh_node_pools/core.py,sha256=NyT-9W94lnKT_I1mfa068t-pIB7xzZ1WBjKTUdZIDGI,4877
374
+ sky/ssh_node_pools/server.py,sha256=Qb4Zu6DxqDQG8snUtvWLnUu40hqZEczdA1hVaP-h-y0,8351
371
375
  sky/templates/aws-ray.yml.j2,sha256=YuqG6KklTd2ry_fTK0hrqslkVM_zHCQWSiORmzUHbFo,9168
372
376
  sky/templates/azure-ray.yml.j2,sha256=2_WQ3x_LoraE3F12qc97DUXZvD9no0gs8jGRhvkV3No,6360
373
377
  sky/templates/cudo-ray.yml.j2,sha256=9g0yFYUk6xPet-JNTPuVDZlVZ9oAcFPL1qaE6fyy-Xc,3797
@@ -443,7 +447,7 @@ sky/utils/kubernetes/cleanup-tunnel.sh,sha256=rXMXuMfyB9bzKjLvXdMCjimDVvdjGPMXuq
443
447
  sky/utils/kubernetes/config_map_utils.py,sha256=ucdQGp1XHliZxoCFWU8EMJ2NKfUEs7t-ygw-J61It_w,4760
444
448
  sky/utils/kubernetes/create_cluster.sh,sha256=VpFLLLzodeldN9-JKqcjs2LkKksMGlg14Q7qGZ49LQE,7816
445
449
  sky/utils/kubernetes/delete_cluster.sh,sha256=BSccHF43GyepDNf-FZcenzHzpXXATkVD92vgn1lWPgk,927
446
- sky/utils/kubernetes/deploy_remote_cluster.py,sha256=LSYCbFmtCuvnymEmT7FxMaqQeFXxz56dO8bw3WjtW2A,61556
450
+ sky/utils/kubernetes/deploy_remote_cluster.py,sha256=KECOmpIt_i1qnrC2Ju7sKUlTbQYqkP17ezjivaHctwc,54712
447
451
  sky/utils/kubernetes/exec_kubeconfig_converter.py,sha256=fCWX13qvbqvoHghwjWjZdmzfOrcmSiTaQnP6owJ05A8,2256
448
452
  sky/utils/kubernetes/generate_kind_config.py,sha256=_TNLnifA_r7-CRq083IP1xjelYqiLjzQX9ohuqYpDH8,3187
449
453
  sky/utils/kubernetes/generate_kubeconfig.sh,sha256=Xm_C-CIZIb4QeJSIoVEOdnOCcZ3BhDJdHNoNOxVuBrE,10476
@@ -454,6 +458,7 @@ sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=lF9hMg0TVVX1jE8W1xmzkaz66
454
458
  sky/utils/kubernetes/rsync_helper.sh,sha256=MT29sI5iD2QxYlXFwrN16oq0Er4TPFQVs4Z4A3U4a7Q,2483
455
459
  sky/utils/kubernetes/ssh-tunnel.sh,sha256=60eHKF7phJe9pFEkGlqdwWzI80tpog8QCkL7fAbIAic,12143
456
460
  sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=Kq1MDygF2IxFmu9FXpCxqucXLmeUrvs6OtRij6XTQbo,6554
461
+ sky/utils/kubernetes/ssh_utils.py,sha256=hPV2gU6j3j1aVf8kFvkux_KE88R5j8-JUDEopG6v70o,9046
457
462
  sky/volumes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
458
463
  sky/volumes/utils.py,sha256=qhRtW9nMUBBGpeb5Sr1jIP9M6ZcZq5cVB0hfPwflTZQ,5009
459
464
  sky/volumes/volume.py,sha256=Cl_1A8Uv6mDK0avFZQoVllKKwrWnJcUDVjHtp9g0d2I,7130
@@ -466,9 +471,9 @@ sky/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
466
471
  sky/workspaces/core.py,sha256=2kKUP-V5Qo1n-xfayA4M1OE_ina6_4bxkTF3dv3yBEU,20704
467
472
  sky/workspaces/server.py,sha256=Box45DS54xXGHy7I3tGKGy-JP0a8G_z6IhfvGlEXtsA,3439
468
473
  sky/workspaces/utils.py,sha256=IIAiFoS6sdb2t0X5YoX9AietpTanZUQNTK8cePun-sY,2143
469
- skypilot_nightly-1.0.0.dev20250625.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
470
- skypilot_nightly-1.0.0.dev20250625.dist-info/METADATA,sha256=4Zq9Vbzp3vrL3oL941tvHV1C7waPXmcelo7OOtVUq7k,18810
471
- skypilot_nightly-1.0.0.dev20250625.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
472
- skypilot_nightly-1.0.0.dev20250625.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
473
- skypilot_nightly-1.0.0.dev20250625.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
474
- skypilot_nightly-1.0.0.dev20250625.dist-info/RECORD,,
474
+ skypilot_nightly-1.0.0.dev20250627.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
475
+ skypilot_nightly-1.0.0.dev20250627.dist-info/METADATA,sha256=2Vuac_gt6MrCnv7UPnCcntWgejGfVgi0n2W7Dy7N-IA,18810
476
+ skypilot_nightly-1.0.0.dev20250627.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
477
+ skypilot_nightly-1.0.0.dev20250627.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
478
+ skypilot_nightly-1.0.0.dev20250627.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
479
+ skypilot_nightly-1.0.0.dev20250627.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST=function(s,c,e,a,t,u,n,r,i,j,f,k,b,d){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-6b0d9e5031b70c58.js"],"/_error":["static/chunks/pages/_error-1be831200e60c5c0.js"],"/clusters":["static/chunks/pages/clusters-4aa031d1f42723d8.js"],"/clusters/[cluster]":[s,c,e,a,t,r,j,u,n,f,i,k,b,d,"static/chunks/37-1f1e94f5a561202a.js","static/chunks/pages/clusters/[cluster]-32ce4f49f2261f55.js"],"/clusters/[cluster]/[job]":[s,c,e,a,t,u,n,"static/chunks/pages/clusters/[cluster]/[job]-aff040d7bc5d0086.js"],"/config":["static/chunks/pages/config-3102d02a188f04b3.js"],"/infra":["static/chunks/pages/infra-fd5dc8a91bd9169a.js"],"/infra/[context]":["static/chunks/pages/infra/[context]-6f1e02e31eecb5ce.js"],"/jobs":["static/chunks/pages/jobs-26da173e20af16e4.js"],"/jobs/[job]":[s,c,e,a,t,r,u,n,i,"static/chunks/pages/jobs/[job]-e4b23128db0774cd.js"],"/users":["static/chunks/pages/users-ce29e7420385563d.js"],"/volumes":["static/chunks/pages/volumes-476b670ef33d1ecd.js"],"/workspace/new":["static/chunks/pages/workspace/new-09ae0f6f972aa871.js"],"/workspaces":["static/chunks/pages/workspaces-862b120406461b10.js"],"/workspaces/[name]":[s,c,e,a,t,r,j,u,n,f,i,k,b,d,"static/chunks/843-07d25a7e64462fd8.js","static/chunks/pages/workspaces/[name]-0b4c662a25e4747a.js"],sortedPages:["/","/_app","/_error","/clusters","/clusters/[cluster]","/clusters/[cluster]/[job]","/config","/infra","/infra/[context]","/jobs","/jobs/[job]","/users","/volumes","/workspace/new","/workspaces","/workspaces/[name]"]}}("static/chunks/616-d6128fa9e7cae6e6.js","static/chunks/230-d6e363362017ff3a.js","static/chunks/799-3625946b2ec2eb30.js","static/chunks/664-047bc03493fda379.js","static/chunks/804-4c9fc53aa74bc191.js","static/chunks/989-db34c16ad7ea6155.js","static/chunks/470-92dd1614396389be.js","static/chunks/798-c0525dc3f21e488d.js","static/chunks/969-d3a0b53f728d280a.js","static/chunks/947-6620842ef80ae879.js","static/chunks/66-66ae330df2d3c1c7.js","static/chunks/856-cdf66268ec878d0c.js","static/chunks/973-5b5019ba333e8d62.js","static/chunks/938-068520cc11738deb.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[211],{803:function(e,r,n){n.d(r,{z:function(){return d}});var t=n(5893),l=n(7294),a=n(8426),s=n(2003),i=n(2350);let o=(0,s.j)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),d=l.forwardRef((e,r)=>{let{className:n,variant:l,size:s,asChild:d=!1,...c}=e,u=d?a.g7:"button";return(0,t.jsx)(u,{className:(0,i.cn)(o({variant:l,size:s,className:n})),ref:r,...c})});d.displayName="Button"},7673:function(e,r,n){n.d(r,{Ol:function(){return d},Zb:function(){return o},aY:function(){return f},eW:function(){return p},ll:function(){return c}});var t=n(5893),l=n(7294),a=n(5697),s=n.n(a),i=n(2350);let o=l.forwardRef((e,r)=>{let{className:n,children:l,...a}=e;return(0,t.jsx)("div",{ref:r,className:(0,i.cn)("rounded-lg border bg-card text-card-foreground shadow-sm",n),...a,children:l})});o.displayName="Card",o.propTypes={className:s().string,children:s().node};let d=l.forwardRef((e,r)=>{let{className:n,children:l,...a}=e;return(0,t.jsx)("div",{ref:r,className:(0,i.cn)("flex flex-col space-y-1.5 p-6",n),...a,children:l})});d.displayName="CardHeader",d.propTypes={className:s().string,children:s().node};let c=l.forwardRef((e,r)=>{let{className:n,children:l,...a}=e;return(0,t.jsx)("h3",{ref:r,className:(0,i.cn)("text-2xl font-semibold leading-none tracking-tight",n),...a,children:l})});c.displayName="CardTitle",c.propTypes={className:s().string,children:s().node};let u=l.forwardRef((e,r)=>{let{className:n,children:l,...a}=e;return(0,t.jsx)("p",{ref:r,className:(0,i.cn)("text-sm text-muted-foreground",n),...a,children:l})});u.displayName="CardDescription",u.propTypes={className:s().string,children:s().node};let f=l.forwardRef((e,r)=>{let{className:n,children:l,...a}=e;return(0,t.jsx)("div",{ref:r,className:(0,i.cn)("p-6 pt-0",n),...a,children:l})});f.displayName="CardContent",f.propTypes={className:s().string,children:s().node};let p=l.forwardRef((e,r)=>{let{className:n,children:l,...a}=e;return(0,t.jsx)("div",{ref:r,className:(0,i.cn)("flex items-center p-6 pt-0",n),...a,children:l})});p.displayName="CardFooter",p.propTypes={className:s().string,children:s().node}},2003:function(e,r,n){n.d(r,{j:function(){return s}});var t=n(512);let l=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,a=t.W,s=(e,r)=>n=>{var t;if((null==r?void 0:r.variants)==null)return a(e,null==n?void 0:n.class,null==n?void 0:n.className);let{variants:s,defaultVariants:i}=r,o=Object.keys(s).map(e=>{let r=null==n?void 0:n[e],t=null==i?void 0:i[e];if(null===r)return null;let a=l(r)||l(t);return s[e][a]}),d=n&&Object.entries(n).reduce((e,r)=>{let[n,t]=r;return void 0===t||(e[n]=t),e},{});return a(e,o,null==r?void 0:null===(t=r.compoundVariants)||void 0===t?void 0:t.reduce((e,r)=>{let{class:n,className:t,...l}=r;return Object.entries(l).every(e=>{let[r,n]=e;return Array.isArray(n)?n.includes({...i,...d}[r]):({...i,...d})[r]===n})?[...e,n,t]:e},[]),null==n?void 0:n.class,null==n?void 0:n.className)}}}]);
@@ -1,16 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[310],{1812:function(e,s,t){t.d(s,{X:function(){return l}});var r=t(5893),a=t(7294);let n=e=>{if(!(null==e?void 0:e.message))return"An unexpected error occurred.";let s=e.message;return s.includes("failed:")&&(s=s.split("failed:")[1].trim()),s},l=e=>{let{error:s,title:t="Error",onDismiss:l}=e,[i,o]=(0,a.useState)(!1);if((0,a.useEffect)(()=>{s&&o(!1)},[s]),!s||i)return null;let c="string"==typeof s?s:n(s);return(0,r.jsx)("div",{className:"bg-red-50 border border-red-200 rounded-md p-3 mb-4",children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex",children:[(0,r.jsx)("div",{className:"flex-shrink-0",children:(0,r.jsx)("svg",{className:"h-5 w-5 text-red-400",viewBox:"0 0 20 20",fill:"currentColor",children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"})})}),(0,r.jsx)("div",{className:"ml-3",children:(0,r.jsxs)("div",{className:"text-sm text-red-800",children:[(0,r.jsxs)("strong",{children:[t,":"]})," ",c]})})]}),(0,r.jsx)("button",{onClick:()=>{o(!0),l&&l()},className:"flex-shrink-0 ml-4 text-red-400 hover:text-red-600 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 focus:ring-offset-red-50 rounded","aria-label":"Dismiss error",children:(0,r.jsx)("svg",{className:"h-4 w-4",viewBox:"0 0 20 20",fill:"currentColor",children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})})})]})})}},803:function(e,s,t){t.d(s,{z:function(){return c}});var r=t(5893),a=t(7294),n=t(8426),l=t(2003),i=t(2350);let o=(0,l.j)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),c=a.forwardRef((e,s)=>{let{className:t,variant:a,size:l,asChild:c=!1,...d}=e,u=c?n.g7:"button";return(0,r.jsx)(u,{className:(0,i.cn)(o({variant:a,size:l,className:t})),ref:s,...d})});c.displayName="Button"},7673:function(e,s,t){t.d(s,{Ol:function(){return c},Zb:function(){return o},aY:function(){return m},eW:function(){return x},ll:function(){return d}});var r=t(5893),a=t(7294),n=t(5697),l=t.n(n),i=t(2350);let o=a.forwardRef((e,s)=>{let{className:t,children:a,...n}=e;return(0,r.jsx)("div",{ref:s,className:(0,i.cn)("rounded-lg border bg-card text-card-foreground shadow-sm",t),...n,children:a})});o.displayName="Card",o.propTypes={className:l().string,children:l().node};let c=a.forwardRef((e,s)=>{let{className:t,children:a,...n}=e;return(0,r.jsx)("div",{ref:s,className:(0,i.cn)("flex flex-col space-y-1.5 p-6",t),...n,children:a})});c.displayName="CardHeader",c.propTypes={className:l().string,children:l().node};let d=a.forwardRef((e,s)=>{let{className:t,children:a,...n}=e;return(0,r.jsx)("h3",{ref:s,className:(0,i.cn)("text-2xl font-semibold leading-none tracking-tight",t),...n,children:a})});d.displayName="CardTitle",d.propTypes={className:l().string,children:l().node};let u=a.forwardRef((e,s)=>{let{className:t,children:a,...n}=e;return(0,r.jsx)("p",{ref:s,className:(0,i.cn)("text-sm text-muted-foreground",t),...n,children:a})});u.displayName="CardDescription",u.propTypes={className:l().string,children:l().node};let m=a.forwardRef((e,s)=>{let{className:t,children:a,...n}=e;return(0,r.jsx)("div",{ref:s,className:(0,i.cn)("p-6 pt-0",t),...n,children:a})});m.displayName="CardContent",m.propTypes={className:l().string,children:l().node};let x=a.forwardRef((e,s)=>{let{className:t,children:a,...n}=e;return(0,r.jsx)("div",{ref:s,className:(0,i.cn)("flex items-center p-6 pt-0",t),...n,children:a})});x.displayName="CardFooter",x.propTypes={className:l().string,children:l().node}},326:function(e,s,t){t.d(s,{$N:function(){return f},Be:function(){return h},Vq:function(){return o},cN:function(){return x},cZ:function(){return u},fK:function(){return m}});var r=t(5893),a=t(7294),n=t(6327),l=t(2350),i=t(3767);let o=n.fC;n.xz;let c=n.h_;n.x8;let d=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)(n.aV,{ref:s,className:(0,l.cn)("fixed inset-0 z-50 bg-black/50 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",t),...a})});d.displayName=n.aV.displayName;let u=a.forwardRef((e,s)=>{let{className:t,children:a,...o}=e;return(0,r.jsxs)(c,{children:[(0,r.jsx)(d,{}),(0,r.jsxs)(n.VY,{ref:s,className:(0,l.cn)("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",t),...o,children:[a,(0,r.jsxs)(n.x8,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100 data-[state=open]:text-gray-500",children:[(0,r.jsx)(i.Z,{className:"h-4 w-4"}),(0,r.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})});u.displayName=n.VY.displayName;let m=e=>{let{className:s,...t}=e;return(0,r.jsx)("div",{className:(0,l.cn)("flex flex-col space-y-1.5 text-center sm:text-left",s),...t})};m.displayName="DialogHeader";let x=e=>{let{className:s,...t}=e;return(0,r.jsx)("div",{className:(0,l.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",s),...t})};x.displayName="DialogFooter";let f=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)(n.Dx,{ref:s,className:(0,l.cn)("text-lg font-semibold leading-none tracking-tight",t),...a})});f.displayName=n.Dx.displayName;let h=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)(n.dk,{ref:s,className:(0,l.cn)("text-sm text-gray-500",t),...a})});h.displayName=n.dk.displayName},8764:function(e,s,t){t.d(s,{RM:function(){return o},SC:function(){return c},iA:function(){return l},pj:function(){return u},ss:function(){return d},xD:function(){return i}});var r=t(5893),a=t(7294),n=t(2350);let l=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("div",{className:"relative w-full overflow-auto",children:(0,r.jsx)("table",{ref:s,className:(0,n.cn)("w-full caption-bottom text-base",t),...a})})});l.displayName="Table";let i=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("thead",{ref:s,className:(0,n.cn)("[&_tr]:border-b",t),...a})});i.displayName="TableHeader";let o=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("tbody",{ref:s,className:(0,n.cn)("[&_tr:last-child]:border-0",t),...a})});o.displayName="TableBody",a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("tfoot",{ref:s,className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",t),...a})}).displayName="TableFooter";let c=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("tr",{ref:s,className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",t),...a})});c.displayName="TableRow";let d=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("th",{ref:s,className:(0,n.cn)("h-12 px-4 text-left align-middle font-medium text-[hsl(var(--text-strong))] [&:has([role=checkbox])]:pr-0",t),...a})});d.displayName="TableHead";let u=a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("td",{ref:s,className:(0,n.cn)("p-4 align-middle [&:has([role=checkbox])]:pr-0",t),...a})});u.displayName="TableCell",a.forwardRef((e,s)=>{let{className:t,...a}=e;return(0,r.jsx)("caption",{ref:s,className:(0,n.cn)("mt-4 text-base text-muted-foreground",t),...a})}).displayName="TableCaption"},8310:function(e,s,t){t.r(s),t.d(s,{Users:function(){return M}});var r=t(5893),a=t(7294),n=t(5697),l=t.n(n),i=t(8799),o=t(1664),c=t.n(o),d=t(803),u=t(8764),m=t(3081),x=t(3266),f=t(8969),h=t(6378),p=t(6856),g=t(1214),b=t(4545),y=t(998);/**
2
- * @license lucide-react v0.407.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */let j=(0,y.Z)("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);var v=t(3626);/**
7
- * @license lucide-react v0.407.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */let N=(0,y.Z)("EyeOff",[["path",{d:"M9.88 9.88a3 3 0 1 0 4.24 4.24",key:"1jxqfv"}],["path",{d:"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68",key:"9wicm4"}],["path",{d:"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61",key:"1jreej"}],["line",{x1:"2",x2:"22",y1:"2",y2:"22",key:"a6p6uj"}]]),w=(0,y.Z)("Eye",[["path",{d:"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z",key:"rwhkz3"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]),k=(0,y.Z)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);var C=t(282),R=t(3767);/**
12
- * @license lucide-react v0.407.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */let D=(0,y.Z)("Pen",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]]),E=(0,y.Z)("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);var S=t(7603);t(9470);var I=t(3001),U=t(7673),F=t(7145),z=t(326),L=t(1812);let _=(e,s)=>e&&e.includes("@")?e.split("@")[0]:e||"N/A",Z=(e,s)=>e&&e.includes("@")?e:s||"-",T=g.nb.REFRESH_INTERVAL,V=e=>{let{message:s,onDismiss:t}=e;return s?(0,r.jsx)("div",{className:"bg-green-50 border border-green-200 rounded p-4 mb-6",children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[(0,r.jsx)("div",{className:"flex-shrink-0",children:(0,r.jsx)("svg",{className:"h-5 w-5 text-green-400",viewBox:"0 0 20 20",fill:"currentColor",children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"})})}),(0,r.jsx)("div",{className:"ml-3",children:(0,r.jsx)("p",{className:"text-sm font-medium text-green-800",children:s})})]}),t&&(0,r.jsx)("div",{className:"ml-auto pl-3",children:(0,r.jsx)("div",{className:"-mx-1.5 -my-1.5",children:(0,r.jsxs)("button",{type:"button",onClick:t,className:"inline-flex rounded-md bg-green-50 p-1.5 text-green-500 hover:bg-green-100 focus:outline-none focus:ring-2 focus:ring-green-600 focus:ring-offset-2 focus:ring-offset-green-50",children:[(0,r.jsx)("span",{className:"sr-only",children:"Dismiss"}),(0,r.jsx)("svg",{className:"h-5 w-5",viewBox:"0 0 20 20",fill:"currentColor",children:(0,r.jsx)("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})})]})})})]})}):null};function M(){let[e,s]=(0,a.useState)(!1),t=(0,a.useRef)(null),n=(0,I.X)(),[l,o]=(0,a.useState)(!1),[u,p]=(0,a.useState)({username:"",password:"",role:"user"}),[g,b]=(0,a.useState)(!1),[y,C]=(0,a.useState)({open:!1,message:"",userName:""}),[R,D]=(0,a.useState)(null),[E,S]=(0,a.useState)(!1),[U,_]=(0,a.useState)(!1),[Z,M]=(0,a.useState)(!1),[P,q]=(0,a.useState)(null),[B,O]=(0,a.useState)(!1),[H,K]=(0,a.useState)(null),[Y,$]=(0,a.useState)("import"),[X,J]=(0,a.useState)(!1),[W,G]=(0,a.useState)(null),[Q,ee]=(0,a.useState)(""),[es,et]=(0,a.useState)(!1),[er,ea]=(0,a.useState)(null),[en,el]=(0,a.useState)(!1),[ei,eo]=(0,a.useState)(null),[ec,ed]=(0,a.useState)(null),[eu,em]=(0,a.useState)(!1),[ex,ef]=(0,a.useState)(null),[eh,ep]=(0,a.useState)(null),[eg,eb]=(0,a.useState)(void 0);(0,a.useEffect)(()=>{!async function(){try{let e=await F.x.get("/api/health");if(e.ok){let s=await e.json();eb(!!s.basic_auth_enabled)}else eb(!1)}catch(e){eb(!1)}}()},[]);let ey=(0,a.useCallback)(async()=>{if(R&&Date.now()-R.timestamp<3e5)return R;S(!0);try{let e=await F.x.get("/users/role");if(!e.ok){let s=await e.json();throw Error(s.detail||"Failed to get user role")}let s=await e.json(),t={role:s.role,name:s.name,id:s.id,timestamp:Date.now()};return D(t),S(!1),t}catch(e){throw S(!1),e}},[R]);(0,a.useEffect)(()=>{ey().catch(()=>{console.error("Failed to get user role")})},[ey]);let ej=async(e,s)=>{try{let t=await ey();if("admin"!==t.role)return C({open:!0,message:e,userName:t.name.toLowerCase()}),!1;return s(),!0}catch(e){return console.error("Failed to check user role:",e),C({open:!0,message:"Error: ".concat(e.message),userName:""}),!1}},ev=()=>{h.default.invalidate(m.R),h.default.invalidate(x.getClusters),h.default.invalidate(f.getManagedJobs,[{allUsers:!0}]),t.current&&t.current()},eN=async()=>{if(!u.username||!u.password){ep(Error("Username and password are required.")),o(!1);return}b(!0),ep(null),ef(null);try{let e=await F.x.post("/users/create",u);if(!e.ok){let s=await e.json();throw Error(s.detail||"Failed to create user")}ef('User "'.concat(u.username,'" created successfully!')),o(!1),p({username:"",password:"",role:"user"}),ev()}catch(e){ep(e),o(!1),p({username:"",password:"",role:"user"})}finally{b(!1)}},ew=async e=>{let s=e.target.files[0];s&&(q(s),K(null))},ek=async()=>{if(!P){alert("Please select a CSV file first.");return}O(!0);try{let e=new FileReader;e.onload=async e=>{try{let s=e.target.result,t=await F.x.post("/users/import",{csv_content:s});if(!t.ok){let e=await t.json();throw Error(e.detail||"Failed to import users")}let r=await t.json(),a="Import completed. ".concat(r.success_count," users created successfully.");r.error_count>0&&(a+="\n".concat(r.error_count," failed."),r.creation_errors.length>0&&(a+="\nErrors: ".concat(r.creation_errors.slice(0,3).join(", ")),r.creation_errors.length>3&&(a+=" and ".concat(r.creation_errors.length-3," more...")))),K({message:a}),r.success_count>0&&ev()}catch(e){alert("Error importing users: ".concat(e.message))}finally{O(!1)}},e.readAsText(P)}catch(e){alert("Error reading file: ".concat(e.message)),O(!1)}},eC=async e=>{G(e),ee(""),J(!0)},eR=async()=>{if(!Q){ea(Error("Please enter a new password."));return}et(!0),ea(null);try{let e=await F.x.post("/users/update",{user_id:W.userId,password:Q});if(!e.ok){let s=await e.json();throw Error(s.detail||"Failed to reset password")}ef('Password reset successfully for user "'.concat(W.usernameDisplay,'"!')),J(!1),G(null),ee("")}catch(e){ea(e)}finally{et(!1)}},eD=async()=>{if(ei){em(!0),ed(null);try{let e=await F.x.post("/users/delete",{user_id:ei.userId});if(!e.ok){let s=await e.json();throw Error(s.detail||"Failed to delete user")}ef('User "'.concat(ei.usernameDisplay,'" deleted successfully!')),el(!1),eo(null),ev()}catch(e){ed(e)}finally{em(!1)}}},eE=()=>{el(!1),eo(null),ed(null)},eS=()=>{J(!1),G(null),ee(""),ea(null)};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-4 h-5",children:[(0,r.jsx)("div",{className:"text-base",children:(0,r.jsx)(c(),{href:"/users",className:"text-sky-blue hover:underline leading-none",children:"Users"})}),(0,r.jsxs)("div",{className:"flex items-center",children:[e&&(0,r.jsxs)("div",{className:"flex items-center mr-2",children:[(0,r.jsx)(i.Z,{size:15,className:"mt-0"}),(0,r.jsx)("span",{className:"ml-2 text-gray-500 text-sm",children:"Loading..."})]}),eg&&(null==R?void 0:R.role)==="admin"&&(0,r.jsx)("button",{onClick:async()=>{await ej("cannot create users",()=>{o(!0)})},className:"text-sky-blue hover:text-sky-blue-bright flex items-center border-sky-blue rounded px-2 py-1 mr-2",title:"Create New User",children:"+ New User"}),eg&&(null==R?void 0:R.role)==="admin"&&(0,r.jsxs)("button",{onClick:async()=>{await ej("cannot import users",()=>{M(!0)})},className:"text-sky-blue hover:text-sky-blue-bright flex items-center rounded px-2 py-1 mr-2",title:"Import/Export Users",children:[(0,r.jsx)(j,{className:"h-4 w-4 mr-1"}),"Import/Export"]}),(0,r.jsxs)("button",{onClick:ev,disabled:e,className:"text-sky-blue hover:text-sky-blue-bright flex items-center",children:[(0,r.jsx)(v.Z,{className:"h-4 w-4 mr-1.5"}),!n&&(0,r.jsx)("span",{children:"Refresh"})]})]})]}),(0,r.jsx)(V,{message:ex,onDismiss:()=>ef(null)}),(0,r.jsx)(L.X,{error:eh,title:"Error",onDismiss:()=>ep(null)}),(0,r.jsx)(A,{refreshInterval:T,setLoading:s,refreshDataRef:t,checkPermissionAndAct:ej,roleLoading:E,onResetPassword:eC,onDeleteUser:e=>{ej("cannot delete users",()=>{eo(e),el(!0)})},basicAuthEnabled:eg,currentUserRole:null==R?void 0:R.role,currentUserId:null==R?void 0:R.id}),(0,r.jsx)(z.Vq,{open:l,onOpenChange:o,children:(0,r.jsxs)(z.cZ,{className:"sm:max-w-md",children:[(0,r.jsx)(z.fK,{children:(0,r.jsx)(z.$N,{children:"Create User"})}),(0,r.jsxs)("div",{className:"flex flex-col gap-4 py-4",children:[(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Username"}),(0,r.jsx)("input",{className:"border rounded px-3 py-2 w-full",placeholder:"Username",value:u.username,onChange:e=>p({...u,username:e.target.value})})]}),(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Password"}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("input",{className:"border rounded px-3 py-2 w-full pr-10",placeholder:"Password",type:U?"text":"password",value:u.password,onChange:e=>p({...u,password:e.target.value})}),(0,r.jsx)("button",{type:"button",className:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600",onClick:()=>_(!U),children:U?(0,r.jsx)(N,{className:"h-4 w-4"}):(0,r.jsx)(w,{className:"h-4 w-4"})})]})]}),(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Role"}),(0,r.jsxs)("select",{className:"border rounded px-3 py-2 w-full",value:u.role,onChange:e=>p({...u,role:e.target.value}),children:[(0,r.jsx)("option",{value:"user",children:"User"}),(0,r.jsx)("option",{value:"admin",children:"Admin"})]})]})]}),(0,r.jsxs)(z.cN,{children:[(0,r.jsx)("button",{className:"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2",onClick:()=>o(!1),disabled:g,children:"Cancel"}),(0,r.jsx)("button",{className:"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-sky-600 text-white hover:bg-sky-700 h-10 px-4 py-2",onClick:eN,disabled:g,children:g?"Creating...":"Create"})]})]})}),(0,r.jsx)(z.Vq,{open:y.open,onOpenChange:e=>C(s=>({...s,open:e})),children:(0,r.jsxs)(z.cZ,{className:"sm:max-w-md transition-all duration-200 ease-in-out",children:[(0,r.jsxs)(z.fK,{children:[(0,r.jsx)(z.$N,{children:"Permission Denied"}),(0,r.jsx)(z.Be,{children:E?(0,r.jsxs)("div",{className:"flex items-center py-2",children:[(0,r.jsx)(i.Z,{size:16,className:"mr-2"}),(0,r.jsx)("span",{children:"Checking permissions..."})]}):(0,r.jsx)(r.Fragment,{children:y.userName?(0,r.jsxs)(r.Fragment,{children:[y.userName," is logged in as non-admin and ",y.message,"."]}):y.message})})]}),(0,r.jsx)(z.cN,{children:(0,r.jsx)(d.z,{variant:"outline",onClick:()=>C(e=>({...e,open:!1})),disabled:E,children:"OK"})})]})}),(0,r.jsx)(z.Vq,{open:Z,onOpenChange:M,children:(0,r.jsxs)(z.cZ,{className:"sm:max-w-lg",children:[(0,r.jsx)(z.fK,{children:(0,r.jsx)(z.$N,{children:"Import/Export Users"})}),(0,r.jsxs)("div",{className:"flex border-b border-gray-200 mb-4",children:[(0,r.jsx)("button",{className:"px-4 py-2 text-sm font-medium ".concat("import"===Y?"border-b-2 border-sky-500 text-sky-600":"text-gray-500 hover:text-gray-700"),onClick:()=>$("import"),children:"Import"}),(0,r.jsx)("button",{className:"px-4 py-2 text-sm font-medium ".concat("export"===Y?"border-b-2 border-sky-500 text-sky-600":"text-gray-500 hover:text-gray-700"),onClick:()=>$("export"),children:"Export"})]}),(0,r.jsx)("div",{className:"flex flex-col gap-4 py-4",children:"import"===Y?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"CSV File"}),(0,r.jsx)("input",{type:"file",accept:".csv",onChange:ew,className:"border rounded px-3 py-2 w-full"}),(0,r.jsxs)("p",{className:"text-xs text-gray-500",children:["CSV should have columns: username, password, role",(0,r.jsx)("br",{}),"Supports both plain text passwords and exported password hashes."]})]}),H&&(0,r.jsx)("div",{className:"p-3 bg-green-50 border border-green-200 rounded text-green-700 text-sm",children:H.message})]}):(0,r.jsx)(r.Fragment,{children:(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Export Users to CSV"}),(0,r.jsx)("p",{className:"text-xs text-gray-500",children:"Download all users as a CSV file with password hashes."}),(0,r.jsxs)("div",{className:"p-3 bg-amber-50 border border-amber-200 rounded",children:[(0,r.jsx)("p",{className:"text-sm text-amber-700",children:"⚠️ This will export all users with columns: username, password (hashed), role"}),(0,r.jsx)("p",{className:"text-xs text-amber-600 mt-1",children:"Password hashes can be imported directly for system backups."})]})]})})}),(0,r.jsxs)(z.cN,{children:[(0,r.jsx)("button",{className:"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2",onClick:()=>M(!1),disabled:B,children:"Cancel"}),"import"===Y?(0,r.jsx)("button",{className:"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-sky-600 text-white hover:bg-sky-700 h-10 px-4 py-2",onClick:ek,disabled:B||!P,children:B?"Importing...":"Import"}):(0,r.jsxs)("button",{className:"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-sky-600 text-white hover:bg-sky-700 h-10 px-4 py-2",onClick:async()=>{try{let e=await F.x.get("/users/export");if(!e.ok){let s=await e.json();throw Error(s.detail||"Failed to export users")}let s=await e.json(),t=s.csv_content,r=new Blob([t],{type:"text/csv;charset=utf-8;"}),a=URL.createObjectURL(r),n=document.createElement("a");n.href=a;let l=new Date,i=e=>String(e).padStart(2,"0"),o=l.getFullYear(),c=i(l.getMonth()+1),d=i(l.getDate()),u=i(l.getHours()),m=i(l.getMinutes()),x=i(l.getSeconds());n.download="users_export_".concat(o,"-").concat(c,"-").concat(d,"-").concat(u,"-").concat(m,"-").concat(x,".csv"),n.click(),URL.revokeObjectURL(a),alert("Successfully exported ".concat(s.user_count," users to CSV file."))}catch(e){alert("Error exporting users: ".concat(e.message))}},children:[(0,r.jsx)(k,{className:"h-4 w-4 mr-1"}),"Export"]})]})]})}),(0,r.jsx)(z.Vq,{open:X,onOpenChange:eS,children:(0,r.jsxs)(z.cZ,{className:"sm:max-w-md",children:[(0,r.jsxs)(z.fK,{children:[(0,r.jsx)(z.$N,{children:"Reset Password"}),(0,r.jsxs)(z.Be,{children:["Enter a new password for"," ",(null==W?void 0:W.usernameDisplay)||"this user","."]})]}),(0,r.jsx)("div",{className:"flex flex-col gap-4 py-4",children:(0,r.jsxs)("div",{className:"grid gap-2",children:[(0,r.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"New Password"}),(0,r.jsx)("input",{type:"password",className:"border rounded px-3 py-2 w-full",placeholder:"Enter new password",value:Q,onChange:e=>ee(e.target.value),autoFocus:!0})]})}),(0,r.jsx)(L.X,{error:er,title:"Reset Failed",onDismiss:()=>ea(null)}),(0,r.jsxs)(z.cN,{children:[(0,r.jsx)(d.z,{variant:"outline",onClick:eS,disabled:es,children:"Cancel"}),(0,r.jsx)(d.z,{variant:"default",onClick:eR,disabled:es||!Q,className:"bg-sky-600 text-white hover:bg-sky-700",children:es?"Resetting...":"Reset Password"})]})]})}),(0,r.jsx)(z.Vq,{open:en,onOpenChange:eE,children:(0,r.jsxs)(z.cZ,{className:"sm:max-w-md",children:[(0,r.jsxs)(z.fK,{children:[(0,r.jsx)(z.$N,{children:"Delete User"}),(0,r.jsxs)(z.Be,{children:['Are you sure you want to delete user "',(null==ei?void 0:ei.usernameDisplay)||"this user",'"? This action cannot be undone.']})]}),(0,r.jsx)(L.X,{error:ec,title:"Deletion Failed",onDismiss:()=>ed(null)}),(0,r.jsxs)(z.cN,{children:[(0,r.jsx)(d.z,{variant:"outline",onClick:eE,disabled:eu,children:"Cancel"}),(0,r.jsx)(d.z,{variant:"destructive",onClick:eD,disabled:eu,children:eu?"Deleting...":"Delete"})]})]})})]})}function A(e){let{refreshInterval:s,setLoading:t,refreshDataRef:n,checkPermissionAndAct:l,roleLoading:o,onResetPassword:d,onDeleteUser:g,basicAuthEnabled:y,currentUserRole:j,currentUserId:v}=e,[N,w]=(0,a.useState)([]),[k,I]=(0,a.useState)(!0),[z,L]=(0,a.useState)(!1),[T,V]=(0,a.useState)({key:"username",direction:"ascending"}),[M,A]=(0,a.useState)(null),[P,q]=(0,a.useState)(""),B=(0,a.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];t&&e&&t(!0),e&&I(!0);try{let s=await h.default.get(m.R),r=(s||[]).map(e=>({...e,usernameDisplay:_(e.username,e.userId),fullEmailID:Z(e.username,e.userId),clusterCount:-1,jobCount:-1}));w(r),L(!0),t&&e&&t(!1),e&&I(!1);let[a,n]=await Promise.all([h.default.get(x.getClusters),h.default.get(f.getManagedJobs,[{allUsers:!0}])]),l=n.jobs||[],i=(s||[]).map(e=>{let s=(a||[]).filter(s=>s.user_hash===e.userId),t=(l||[]).filter(s=>s.user_hash===e.userId);return{...e,usernameDisplay:_(e.username,e.userId),fullEmailID:Z(e.username,e.userId),clusterCount:s.length,jobCount:t.length}});w(i)}catch(s){console.error("Failed to fetch or process user data:",s),w([]),L(!0),t&&e&&t(!1),e&&I(!1)}},[t]);(0,a.useEffect)(()=>{n&&(n.current=()=>B(!0))},[n,B]),(0,a.useEffect)(()=>{(async()=>{L(!1),I(!0),await p.ZP.preloadForPage("users"),B(!0)})();let e=setInterval(()=>{B(!1)},s);return()=>clearInterval(e)},[B,s]);let O=(0,a.useMemo)(()=>(0,b.R0)(N,T.key,T.direction),[N,T]),H=e=>{let s="ascending";T.key===e&&"ascending"===T.direction&&(s="descending"),V({key:e,direction:s})},K=e=>T.key===e?"ascending"===T.direction?" ↑":" ↓":"",Y=async(e,s)=>{await l("cannot edit user role",()=>{A(e),q(s)})},$=()=>{A(null),q("")},X=async e=>{if(!e||!P){console.error("User ID or role is missing."),alert("Error: User ID or role is missing.");return}I(!0);try{let s=await F.x.post("/users/update",{user_id:e,role:P});if(!s.ok){let e=await s.json();throw Error(e.detail||"Failed to update role")}h.default.invalidate(m.R),await B(!0),$()}catch(e){console.error("Failed to update user role:",e),alert("Error updating role: ".concat(e.message))}finally{I(!1)}};return k&&0===N.length&&!z?(0,r.jsx)("div",{className:"flex justify-center items-center h-64",children:(0,r.jsx)(i.Z,{})}):z?O&&0!==O.length?(0,r.jsx)(U.Zb,{children:(0,r.jsxs)(u.iA,{children:[(0,r.jsx)(u.xD,{children:(0,r.jsxs)(u.SC,{children:[(0,r.jsxs)(u.ss,{onClick:()=>H("usernameDisplay"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Name",K("usernameDisplay")]}),(0,r.jsxs)(u.ss,{onClick:()=>H("fullEmailID"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["User ID",K("fullEmailID")]}),(0,r.jsxs)(u.ss,{onClick:()=>H("role"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Role",K("role")]}),(0,r.jsxs)(u.ss,{onClick:()=>H("clusterCount"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Clusters",K("clusterCount")]}),(0,r.jsxs)(u.ss,{onClick:()=>H("jobCount"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Jobs",K("jobCount")]}),y&&(0,r.jsx)(u.ss,{className:"whitespace-nowrap w-1/6",children:"Actions"})]})}),(0,r.jsx)(u.RM,{children:O.map(e=>(0,r.jsxs)(u.SC,{children:[(0,r.jsx)(u.pj,{className:"truncate",title:e.username,children:e.usernameDisplay}),(0,r.jsx)(u.pj,{className:"truncate",title:e.fullEmailID,children:e.fullEmailID}),(0,r.jsx)(u.pj,{className:"truncate",title:e.role,children:(0,r.jsx)("div",{className:"flex items-center gap-2",children:M===e.userId?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("select",{value:P,onChange:e=>q(e.target.value),className:"block w-auto p-1 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-sky-blue focus:border-sky-blue sm:text-sm",children:[(0,r.jsx)("option",{value:"admin",children:"Admin"}),(0,r.jsx)("option",{value:"user",children:"User"})]}),(0,r.jsx)("button",{onClick:()=>X(e.userId),className:"text-green-600 hover:text-green-800 p-1",title:"Save",children:(0,r.jsx)(C.Z,{className:"h-4 w-4"})}),(0,r.jsx)("button",{onClick:$,className:"text-gray-500 hover:text-gray-700 p-1",title:"Cancel",children:(0,r.jsx)(R.Z,{className:"h-4 w-4"})})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"capitalize",children:e.role}),"admin"===j&&(0,r.jsx)("button",{onClick:()=>Y(e.userId,e.role),className:"text-sky-blue hover:text-sky-blue-bright p-1",title:"Edit role",children:(0,r.jsx)(D,{className:"h-3 w-3"})})]})})}),(0,r.jsx)(u.pj,{children:-1===e.clusterCount?(0,r.jsxs)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-400 rounded text-xs font-medium flex items-center",children:[(0,r.jsx)(i.Z,{size:10,className:"mr-1"}),"Loading..."]}):(0,r.jsx)(c(),{href:"/clusters?user=".concat(encodeURIComponent(e.userId)),className:"px-2 py-0.5 rounded text-xs font-medium transition-colors duration-200 cursor-pointer inline-block ".concat(e.clusterCount>0?"bg-blue-100 text-blue-800 hover:bg-blue-200 hover:text-blue-900":"bg-gray-100 text-gray-500 hover:bg-gray-200 hover:text-gray-700"),title:"View ".concat(e.clusterCount," cluster").concat(1!==e.clusterCount?"s":""," for ").concat(e.usernameDisplay),children:e.clusterCount})}),(0,r.jsx)(u.pj,{children:-1===e.jobCount?(0,r.jsxs)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-400 rounded text-xs font-medium flex items-center",children:[(0,r.jsx)(i.Z,{size:10,className:"mr-1"}),"Loading..."]}):(0,r.jsx)(c(),{href:"/jobs?user=".concat(encodeURIComponent(e.userId)),className:"px-2 py-0.5 rounded text-xs font-medium transition-colors duration-200 cursor-pointer inline-block ".concat(e.jobCount>0?"bg-green-100 text-green-800 hover:bg-green-200 hover:text-green-900":"bg-gray-100 text-gray-500 hover:bg-gray-200 hover:text-gray-700"),title:"View ".concat(e.jobCount," job").concat(1!==e.jobCount?"s":""," for ").concat(e.usernameDisplay),children:e.jobCount})}),y&&(0,r.jsx)(u.pj,{className:"relative",children:(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("button",{onClick:"admin"===j||e.userId===v?async()=>{d(e)}:void 0,className:"admin"===j||e.userId===v?"text-sky-blue hover:text-sky-blue-bright p-1":"text-gray-300 cursor-not-allowed p-1",title:"admin"===j||e.userId===v?"Reset Password":"You can only reset your own password",disabled:"admin"!==j&&e.userId!==v,children:(0,r.jsx)(E,{className:"h-4 w-4"})}),"admin"===j&&(0,r.jsx)("button",{onClick:()=>g(e),className:"text-sky-blue hover:text-red-500 p-1",title:"Delete User",children:(0,r.jsx)(S.Z,{className:"h-4 w-4"})})]})})]},e.userId))})]})}):(0,r.jsxs)("div",{className:"text-center py-12",children:[(0,r.jsx)("p",{className:"text-lg font-semibold text-gray-500",children:"No users found."}),(0,r.jsx)("p",{className:"text-sm text-gray-400 mt-1",children:"There are currently no users to display."})]}):(0,r.jsxs)("div",{className:"flex justify-center items-center h-64",children:[(0,r.jsx)(i.Z,{}),(0,r.jsx)("span",{className:"ml-2 text-gray-500",children:"Loading users..."})]})}A.propTypes={refreshInterval:l().number.isRequired,setLoading:l().func.isRequired,refreshDataRef:l().shape({current:l().func}).isRequired,checkPermissionAndAct:l().func.isRequired,roleLoading:l().bool.isRequired,onResetPassword:l().func.isRequired,onDeleteUser:l().func.isRequired,basicAuthEnabled:l().bool,currentUserRole:l().string,currentUserId:l().string}},4545:function(e,s,t){function r(e){return e.startsWith("sky-jobs-controller-")}function a(e,s,t){return null===s?e:[...e].sort((e,r)=>e[s]<r[s]?"ascending"===t?-1:1:e[s]>r[s]?"ascending"===t?1:-1:0)}t.d(s,{R0:function(){return a},Ym:function(){return r}})}}]);