skypilot-nightly 1.0.0.dev20250625__py3-none-any.whl → 1.0.0.dev20250626__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.
- sky/__init__.py +2 -2
- sky/adaptors/kubernetes.py +1 -6
- sky/client/cli/command.py +10 -5
- sky/client/sdk.py +91 -15
- sky/clouds/ssh.py +36 -0
- sky/core.py +20 -0
- sky/dashboard/out/404.html +1 -1
- sky/dashboard/out/_next/static/bs6UB9V4Jq10TIZ5x-kBK/_buildManifest.js +1 -0
- sky/dashboard/out/_next/static/chunks/141-fa5a20cbf401b351.js +11 -0
- sky/dashboard/out/_next/static/chunks/25.76c246239df93d50.js +6 -0
- sky/dashboard/out/_next/static/chunks/43-36177d00f6956ab2.js +1 -0
- sky/dashboard/out/_next/static/chunks/430.ed51037d1a4a438b.js +1 -0
- sky/dashboard/out/_next/static/chunks/690.55f9eed3be903f56.js +16 -0
- sky/dashboard/out/_next/static/chunks/785.dc2686c3c1235554.js +1 -0
- sky/dashboard/out/_next/static/chunks/871-3db673be3ee3750b.js +6 -0
- sky/dashboard/out/_next/static/chunks/875.52c962183328b3f2.js +25 -0
- sky/dashboard/out/_next/static/chunks/973-81b2d057178adb76.js +1 -0
- sky/dashboard/out/_next/static/chunks/982.1b61658204416b0f.js +1 -0
- sky/dashboard/out/_next/static/chunks/984.e8bac186a24e5178.js +1 -0
- sky/dashboard/out/_next/static/chunks/990-0ad5ea1699e03ee8.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-32ce4f49f2261f55.js → [cluster]-8040f2483897ed0c.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters-f119a5630a1efd61.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/config-6b255eae088da6a3.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra/[context]-b302aea4d65766bf.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/infra-ee8cc4d449945d19.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/{jobs-26da173e20af16e4.js → jobs-0a5695ff3075d94a.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/{users-ce29e7420385563d.js → users-4978cbb093e141e7.js} +1 -1
- sky/dashboard/out/_next/static/chunks/pages/workspace/new-5b59bce9eb208d84.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-cb7e720b739de53a.js +1 -0
- sky/dashboard/out/_next/static/chunks/pages/{workspaces-862b120406461b10.js → workspaces-50e230828730cfb3.js} +1 -1
- sky/dashboard/out/_next/static/chunks/webpack-08fdb9e6070127fc.js +1 -0
- sky/dashboard/out/_next/static/css/52082cf558ec9705.css +3 -0
- sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
- sky/dashboard/out/clusters/[cluster].html +1 -1
- sky/dashboard/out/clusters.html +1 -1
- sky/dashboard/out/config.html +1 -1
- sky/dashboard/out/index.html +1 -1
- sky/dashboard/out/infra/[context].html +1 -1
- sky/dashboard/out/infra.html +1 -1
- sky/dashboard/out/jobs/[job].html +1 -1
- sky/dashboard/out/jobs.html +1 -1
- sky/dashboard/out/users.html +1 -1
- sky/dashboard/out/volumes.html +1 -1
- sky/dashboard/out/workspace/new.html +1 -1
- sky/dashboard/out/workspaces/[name].html +1 -1
- sky/dashboard/out/workspaces.html +1 -1
- sky/provision/kubernetes/utils.py +18 -2
- sky/server/rest.py +3 -2
- sky/server/server.py +4 -27
- sky/skylet/constants.py +5 -0
- sky/skypilot_config.py +3 -0
- sky/ssh_node_pools/__init__.py +1 -0
- sky/ssh_node_pools/core.py +133 -0
- sky/ssh_node_pools/server.py +232 -0
- sky/utils/kubernetes/deploy_remote_cluster.py +12 -185
- sky/utils/kubernetes/ssh_utils.py +221 -0
- {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.dist-info}/METADATA +1 -1
- {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.dist-info}/RECORD +64 -59
- sky/dashboard/out/_next/static/ZWdSYkqVe3WjnFR8ocqoG/_buildManifest.js +0 -1
- sky/dashboard/out/_next/static/chunks/211.692afc57e812ae1a.js +0 -1
- sky/dashboard/out/_next/static/chunks/310.2671028c20e892c7.js +0 -16
- sky/dashboard/out/_next/static/chunks/37-1f1e94f5a561202a.js +0 -6
- sky/dashboard/out/_next/static/chunks/42.bc85e5b1a4debf22.js +0 -6
- sky/dashboard/out/_next/static/chunks/443.b2242d0efcdf5f47.js +0 -1
- sky/dashboard/out/_next/static/chunks/513.309df9e18a9ff005.js +0 -1
- sky/dashboard/out/_next/static/chunks/66-66ae330df2d3c1c7.js +0 -1
- sky/dashboard/out/_next/static/chunks/682.00e56a220dd26fe1.js +0 -6
- sky/dashboard/out/_next/static/chunks/843-07d25a7e64462fd8.js +0 -11
- sky/dashboard/out/_next/static/chunks/856-cdf66268ec878d0c.js +0 -1
- sky/dashboard/out/_next/static/chunks/973-5b5019ba333e8d62.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/clusters-4aa031d1f42723d8.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/config-3102d02a188f04b3.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/infra/[context]-6f1e02e31eecb5ce.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/infra-fd5dc8a91bd9169a.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/workspace/new-09ae0f6f972aa871.js +0 -1
- sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-0b4c662a25e4747a.js +0 -1
- sky/dashboard/out/_next/static/chunks/webpack-6133dc1e928bd0b5.js +0 -1
- sky/dashboard/out/_next/static/css/b23cb0257bf96c51.css +0 -3
- /sky/dashboard/out/_next/static/{ZWdSYkqVe3WjnFR8ocqoG → bs6UB9V4Jq10TIZ5x-kBK}/_ssgManifest.js +0 -0
- /sky/dashboard/out/_next/static/chunks/pages/{_app-0ef7418d1a3822f3.js → _app-9a3ce3170d2edcec.js} +0 -0
- {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.dist-info}/WHEEL +0 -0
- {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.dist-info}/entry_points.txt +0 -0
- {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.dist-info}/licenses/LICENSE +0 -0
- {skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.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
|
{skypilot_nightly-1.0.0.dev20250625.dist-info → skypilot_nightly-1.0.0.dev20250626.dist-info}/RECORD
RENAMED
@@ -1,10 +1,10 @@
|
|
1
|
-
sky/__init__.py,sha256=
|
1
|
+
sky/__init__.py,sha256=NR20_bGlHryXM5cubd9hJpNqH199f2FffDkPXMWIk0o,6419
|
2
2
|
sky/admin_policy.py,sha256=54DnRMDS0YaVNKG0vCfCaIUY7tKfMmEOFKKiuhGJgro,8976
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
111
|
-
sky/dashboard/out/clusters.html,sha256=
|
112
|
-
sky/dashboard/out/config.html,sha256=
|
110
|
+
sky/dashboard/out/404.html,sha256=1BS1RUrFbbDuvYL4kbiIwtUsrTvfp5C5qqFBfnfsUXk,1423
|
111
|
+
sky/dashboard/out/clusters.html,sha256=PQV7VCH1RJCBXl5naQoU_KxGnJHwB5kc70vimUuVIik,1418
|
112
|
+
sky/dashboard/out/config.html,sha256=JcSlc3s6tj9J7fQg-IrEiE7OpNFo9UW2RL-Qf3rqVDI,1414
|
113
113
|
sky/dashboard/out/favicon.ico,sha256=XilUZZglAl_1zRsg85QsbQgmQAzGPQjcUIJ-A3AzYn8,93590
|
114
|
-
sky/dashboard/out/index.html,sha256=
|
115
|
-
sky/dashboard/out/infra.html,sha256=
|
116
|
-
sky/dashboard/out/jobs.html,sha256=
|
114
|
+
sky/dashboard/out/index.html,sha256=RZ2OJAwpDxFzdsfvlp4xJl__4xfl1MQQMdNOqMpXAc8,1407
|
115
|
+
sky/dashboard/out/infra.html,sha256=ZC6XSUw2l35u_3YedUFA3SLYii1hNe3c56yBZQ0i1FM,1412
|
116
|
+
sky/dashboard/out/jobs.html,sha256=Pl7jnxa_DiNL78QaNY8e9S9Z9NvAQlASqmICY2rTeCc,1410
|
117
117
|
sky/dashboard/out/skypilot.svg,sha256=c0iRtlfLlaUm2p0rG9NFmo5FN0Qhf3pq5Xph-AeMPJw,5064
|
118
|
-
sky/dashboard/out/users.html,sha256=
|
119
|
-
sky/dashboard/out/volumes.html,sha256
|
120
|
-
sky/dashboard/out/workspaces.html,sha256=
|
121
|
-
sky/dashboard/out/_next/static/
|
122
|
-
sky/dashboard/out/_next/static/
|
123
|
-
sky/dashboard/out/_next/static/chunks/
|
118
|
+
sky/dashboard/out/users.html,sha256=DoHSoGiRLURq5hQ5KQGHvcAKdEEhPKoY5WBUg55Fzy4,1412
|
119
|
+
sky/dashboard/out/volumes.html,sha256=-2fz1Dgtpz8w8KcYjBfGBAWotDceMbpmn9Oefg-w6d8,1416
|
120
|
+
sky/dashboard/out/workspaces.html,sha256=WArQjsAEij79NA7mtKpOgFs3yRqo9jWkO7KDp2klDJ4,1422
|
121
|
+
sky/dashboard/out/_next/static/bs6UB9V4Jq10TIZ5x-kBK/_buildManifest.js,sha256=qbv4stQCWKX4iRojj0ZY5PPMkxz27PBQM-_zC16U-ZM,2170
|
122
|
+
sky/dashboard/out/_next/static/bs6UB9V4Jq10TIZ5x-kBK/_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/
|
126
|
-
sky/dashboard/out/_next/static/chunks/
|
127
|
-
sky/dashboard/out/_next/static/chunks/
|
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/
|
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/
|
143
|
-
sky/dashboard/out/_next/static/chunks/
|
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-
|
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-
|
156
|
-
sky/dashboard/out/_next/static/chunks/pages/_app-
|
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-
|
159
|
-
sky/dashboard/out/_next/static/chunks/pages/config-
|
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-
|
162
|
-
sky/dashboard/out/_next/static/chunks/pages/jobs-
|
163
|
-
sky/dashboard/out/_next/static/chunks/pages/users-
|
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-
|
166
|
-
sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-
|
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]-
|
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-
|
171
|
-
sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-
|
172
|
-
sky/dashboard/out/_next/static/css/
|
173
|
-
sky/dashboard/out/clusters/[cluster].html,sha256
|
174
|
-
sky/dashboard/out/clusters/[cluster]/[job].html,sha256=
|
175
|
-
sky/dashboard/out/infra/[context].html,sha256=
|
176
|
-
sky/dashboard/out/jobs/[job].html,sha256=
|
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=-Y68IniJHZ4_mBD70ZNP6ydlMi2dnN8d_DvbmSuQhX0,2746
|
175
|
+
sky/dashboard/out/clusters/[cluster]/[job].html,sha256=6RU8hTcTSWO7yzg3pDqvaZ5-cBBPOtY8uDTbBWw1Ygo,2067
|
176
|
+
sky/dashboard/out/infra/[context].html,sha256=RDKSuVn0s0MxUFEfTVjmaPqMQ59ZShfx884iak1hp6c,1436
|
177
|
+
sky/dashboard/out/jobs/[job].html,sha256=QFpck1bM_iJ0ceZeYGxVE1-JPl0j0_p0KX-_aXqKqvU,2209
|
177
178
|
sky/dashboard/out/videos/cursor-small.mp4,sha256=8tRdp1vjawOrXUar1cfjOc-nkaKmcwCPZx_LO0XlCvQ,203285
|
178
|
-
sky/dashboard/out/workspace/new.html,sha256=
|
179
|
-
sky/dashboard/out/workspaces/[name].html,sha256=
|
179
|
+
sky/dashboard/out/workspace/new.html,sha256=L4gv5B_wKY-90RbXkifFBL68-4cnMayHEc7dhK9IKqE,1428
|
180
|
+
sky/dashboard/out/workspaces/[name].html,sha256=o-IRx-r0iikNkxQz6xkTNxlCFI9FSMHwEkfYdMpv3uQ,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=
|
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=
|
323
|
-
sky/server/server.py,sha256=
|
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=
|
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=
|
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.
|
470
|
-
skypilot_nightly-1.0.0.
|
471
|
-
skypilot_nightly-1.0.0.
|
472
|
-
skypilot_nightly-1.0.0.
|
473
|
-
skypilot_nightly-1.0.0.
|
474
|
-
skypilot_nightly-1.0.0.
|
474
|
+
skypilot_nightly-1.0.0.dev20250626.dist-info/licenses/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
|
475
|
+
skypilot_nightly-1.0.0.dev20250626.dist-info/METADATA,sha256=hN6wLeFIa4ao29rQET3iZmva-vGrfsOS7SOIY9HCeC8,18810
|
476
|
+
skypilot_nightly-1.0.0.dev20250626.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
477
|
+
skypilot_nightly-1.0.0.dev20250626.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
|
478
|
+
skypilot_nightly-1.0.0.dev20250626.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
|
479
|
+
skypilot_nightly-1.0.0.dev20250626.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}})}}]);
|