skypilot-nightly 1.0.0.dev20250617__tar.gz → 1.0.0.dev20250618__tar.gz

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 (486) hide show
  1. {skypilot_nightly-1.0.0.dev20250617/skypilot_nightly.egg-info → skypilot_nightly-1.0.0.dev20250618}/PKG-INFO +9 -1
  2. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/__init__.py +2 -2
  3. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/backend_utils.py +7 -0
  4. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/cloud_vm_ray_backend.py +48 -36
  5. skypilot_nightly-1.0.0.dev20250618/sky/cli.py +9 -0
  6. {skypilot_nightly-1.0.0.dev20250617/sky → skypilot_nightly-1.0.0.dev20250618/sky/client}/cli.py +11 -2
  7. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/client/sdk.py +22 -2
  8. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/kubernetes.py +5 -0
  9. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/404.html +1 -1
  10. {skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/vA3PPpkBwpRTRNBHFYAw_ → skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/LRpGymRCqq-feuFyoWz4m}/_buildManifest.js +1 -1
  11. skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/641.c8e452bc5070a630.js +1 -0
  12. skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/984.ae8c08791d274ca0.js +50 -0
  13. skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/pages/users-928edf039219e47b.js +1 -0
  14. skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/webpack-ebc2404fd6ce581c.js +1 -0
  15. skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/css/6c12ecc3bd2239b6.css +3 -0
  16. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  17. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/clusters/[cluster].html +1 -1
  18. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/clusters.html +1 -1
  19. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/config.html +1 -1
  20. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/index.html +1 -1
  21. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/infra/[context].html +1 -1
  22. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/infra.html +1 -1
  23. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/jobs/[job].html +1 -1
  24. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/jobs.html +1 -1
  25. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/users.html +1 -1
  26. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/workspace/new.html +1 -1
  27. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/workspaces/[name].html +1 -1
  28. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/workspaces.html +1 -1
  29. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/global_user_state.py +50 -11
  30. skypilot_nightly-1.0.0.dev20250618/sky/logs/__init__.py +17 -0
  31. skypilot_nightly-1.0.0.dev20250618/sky/logs/agent.py +73 -0
  32. skypilot_nightly-1.0.0.dev20250618/sky/logs/gcp.py +91 -0
  33. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/models.py +1 -0
  34. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/instance_setup.py +35 -0
  35. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/provisioner.py +11 -0
  36. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/common.py +21 -9
  37. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/payloads.py +19 -1
  38. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/server.py +121 -29
  39. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/setup_files/dependencies.py +11 -1
  40. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/constants.py +9 -1
  41. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/job_lib.py +75 -19
  42. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/kubernetes-ray.yml.j2 +9 -0
  43. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/users/permission.py +49 -19
  44. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/users/rbac.py +10 -1
  45. skypilot_nightly-1.0.0.dev20250618/sky/users/server.py +332 -0
  46. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/schemas.py +40 -0
  47. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618/skypilot_nightly.egg-info}/PKG-INFO +9 -1
  48. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/skypilot_nightly.egg-info/SOURCES.txt +18 -12
  49. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/skypilot_nightly.egg-info/requires.txt +9 -0
  50. skypilot_nightly-1.0.0.dev20250618/tests/test_api_compatibility.py +435 -0
  51. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_cli.py +1 -65
  52. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_jobs_and_serve.py +1 -1
  53. skypilot_nightly-1.0.0.dev20250618/tests/test_no_parellel.py +100 -0
  54. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_optimizer_dryruns.py +1 -26
  55. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_optimizer_random_dag.py +6 -6
  56. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_smoke.py +1 -0
  57. skypilot_nightly-1.0.0.dev20250617/sky/client/cli.py +0 -5733
  58. skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/600.bd2ed8c076b720ec.js +0 -16
  59. skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/pages/users-c69ffcab9d6e5269.js +0 -1
  60. skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/webpack-1b69b196a4dbffef.js +0 -1
  61. skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/css/8e97adcaacc15293.css +0 -3
  62. skypilot_nightly-1.0.0.dev20250617/sky/users/server.py +0 -67
  63. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/LICENSE +0 -0
  64. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/MANIFEST.in +0 -0
  65. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/README.md +0 -0
  66. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/pyproject.toml +0 -0
  67. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/setup.cfg +0 -0
  68. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/setup.py +0 -0
  69. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/__init__.py +0 -0
  70. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/aws.py +0 -0
  71. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/azure.py +0 -0
  72. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/cloudflare.py +0 -0
  73. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/common.py +0 -0
  74. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/cudo.py +0 -0
  75. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/do.py +0 -0
  76. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/docker.py +0 -0
  77. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/gcp.py +0 -0
  78. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/hyperbolic.py +0 -0
  79. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/ibm.py +0 -0
  80. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/kubernetes.py +0 -0
  81. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/nebius.py +0 -0
  82. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/oci.py +0 -0
  83. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/runpod.py +0 -0
  84. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/vast.py +0 -0
  85. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/adaptors/vsphere.py +0 -0
  86. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/admin_policy.py +0 -0
  87. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/authentication.py +0 -0
  88. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/__init__.py +0 -0
  89. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/backend.py +0 -0
  90. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/docker_utils.py +0 -0
  91. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/local_docker_backend.py +0 -0
  92. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/monkey_patches/monkey_patch_ray_up.py +0 -0
  93. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/backends/wheel_utils.py +0 -0
  94. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/__init__.py +0 -0
  95. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/aws_catalog.py +0 -0
  96. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/azure_catalog.py +0 -0
  97. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/common.py +0 -0
  98. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/config.py +0 -0
  99. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/cudo_catalog.py +0 -0
  100. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/__init__.py +0 -0
  101. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/analyze.py +0 -0
  102. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_aws.py +0 -0
  103. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_azure.py +0 -0
  104. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_cudo.py +0 -0
  105. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_fluidstack.py +0 -0
  106. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_gcp.py +0 -0
  107. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_hyperbolic.py +0 -0
  108. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_ibm.py +0 -0
  109. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_lambda_cloud.py +0 -0
  110. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_vast.py +0 -0
  111. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/data_fetchers/fetch_vsphere.py +0 -0
  112. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/do_catalog.py +0 -0
  113. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/fluidstack_catalog.py +0 -0
  114. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/gcp_catalog.py +0 -0
  115. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/hyperbolic_catalog.py +0 -0
  116. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/ibm_catalog.py +0 -0
  117. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/kubernetes_catalog.py +0 -0
  118. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/lambda_catalog.py +0 -0
  119. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/nebius_catalog.py +0 -0
  120. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/oci_catalog.py +0 -0
  121. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/paperspace_catalog.py +0 -0
  122. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/runpod_catalog.py +0 -0
  123. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/scp_catalog.py +0 -0
  124. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/ssh_catalog.py +0 -0
  125. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/vast_catalog.py +0 -0
  126. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/catalog/vsphere_catalog.py +0 -0
  127. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/check.py +0 -0
  128. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/client/__init__.py +0 -0
  129. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/client/common.py +0 -0
  130. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/client/oauth.py +0 -0
  131. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/cloud_stores.py +0 -0
  132. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/__init__.py +0 -0
  133. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/aws.py +0 -0
  134. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/azure.py +0 -0
  135. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/cloud.py +0 -0
  136. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/cudo.py +0 -0
  137. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/do.py +0 -0
  138. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/fluidstack.py +0 -0
  139. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/gcp.py +0 -0
  140. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/hyperbolic.py +0 -0
  141. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/ibm.py +0 -0
  142. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/lambda_cloud.py +0 -0
  143. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/nebius.py +0 -0
  144. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/oci.py +0 -0
  145. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/paperspace.py +0 -0
  146. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/runpod.py +0 -0
  147. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/scp.py +0 -0
  148. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/ssh.py +0 -0
  149. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/utils/__init__.py +0 -0
  150. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/utils/aws_utils.py +0 -0
  151. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/utils/azure_utils.py +0 -0
  152. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/utils/gcp_utils.py +0 -0
  153. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/utils/oci_utils.py +0 -0
  154. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/utils/scp_utils.py +0 -0
  155. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/vast.py +0 -0
  156. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/clouds/vsphere.py +0 -0
  157. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/core.py +0 -0
  158. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dag.py +0 -0
  159. {skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/vA3PPpkBwpRTRNBHFYAw_ → skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/LRpGymRCqq-feuFyoWz4m}/_ssgManifest.js +0 -0
  160. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/211.692afc57e812ae1a.js +0 -0
  161. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/350.9e123a4551f68b0d.js +0 -0
  162. /skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/37-824c707421f6f003.js → /skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/37-3a4d77ad62932eaf.js +0 -0
  163. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/42.d39e24467181b06b.js +0 -0
  164. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/443.b2242d0efcdf5f47.js +0 -0
  165. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/470-4d1a5dbe58a8a2b9.js +0 -0
  166. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/491.b3d264269613fe09.js +0 -0
  167. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/513.211357a2914a34b2.js +0 -0
  168. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/616-d6128fa9e7cae6e6.js +0 -0
  169. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/664-047bc03493fda379.js +0 -0
  170. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/682.4dd5dc116f740b5f.js +0 -0
  171. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/760-a89d354797ce7af5.js +0 -0
  172. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/798-c0525dc3f21e488d.js +0 -0
  173. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/799-3625946b2ec2eb30.js +0 -0
  174. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/804-4c9fc53aa74bc191.js +0 -0
  175. /skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/843-ab9c4f609239155f.js → /skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/843-b3040e493f6e7947.js +0 -0
  176. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/856-c2c39c0912285e54.js +0 -0
  177. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/901-b424d293275e1fd7.js +0 -0
  178. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/937.3759f538f11a0953.js +0 -0
  179. /skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/938-385d190b95815e11.js → /skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/938-1493ac755eadeb35.js +0 -0
  180. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/947-6620842ef80ae879.js +0 -0
  181. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/969-20d54a9d998dc102.js +0 -0
  182. /skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/973-c807fc34f09c7df3.js → /skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/973-db3c97c2bfbceb65.js +0 -0
  183. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -0
  184. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -0
  185. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -0
  186. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -0
  187. /skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/pages/_app-32b2caae3445bf3b.js → /skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/pages/_app-c416e87d5c2715cf.js +0 -0
  188. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -0
  189. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-89216c616dbaa9c5.js +0 -0
  190. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-36bc0962129f72df.js +0 -0
  191. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/clusters-82a651dbad53ec6e.js +0 -0
  192. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/config-497a35a7ed49734a.js +0 -0
  193. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/index-6b0d9e5031b70c58.js +0 -0
  194. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/infra/[context]-d2910be98e9227cb.js +0 -0
  195. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/infra-780860bcc1103945.js +0 -0
  196. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-cf490d1fa38f3740.js +0 -0
  197. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/jobs-336ab80e270ce2ce.js +0 -0
  198. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/workspace/new-31aa8bdcb7592635.js +0 -0
  199. /skypilot_nightly-1.0.0.dev20250617/sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-c8c2191328532b7d.js → /skypilot_nightly-1.0.0.dev20250618/sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-c4ff1ec05e2f3daf.js +0 -0
  200. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/pages/workspaces-82e6601baa5dd280.js +0 -0
  201. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js +0 -0
  202. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/favicon.ico +0 -0
  203. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/skypilot.svg +0 -0
  204. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/dashboard/out/videos/cursor-small.mp4 +0 -0
  205. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/data/__init__.py +0 -0
  206. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/data/data_transfer.py +0 -0
  207. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/data/data_utils.py +0 -0
  208. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/data/mounting_utils.py +0 -0
  209. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/data/storage.py +0 -0
  210. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/data/storage_utils.py +0 -0
  211. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/exceptions.py +0 -0
  212. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/execution.py +0 -0
  213. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/__init__.py +0 -0
  214. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/client/__init__.py +0 -0
  215. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/client/sdk.py +0 -0
  216. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/constants.py +0 -0
  217. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/controller.py +0 -0
  218. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/recovery_strategy.py +0 -0
  219. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/scheduler.py +0 -0
  220. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/server/__init__.py +0 -0
  221. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/server/core.py +0 -0
  222. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/server/server.py +0 -0
  223. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/state.py +0 -0
  224. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/jobs/utils.py +0 -0
  225. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/optimizer.py +0 -0
  226. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/__init__.py +0 -0
  227. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/aws/__init__.py +0 -0
  228. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/aws/config.py +0 -0
  229. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/aws/instance.py +0 -0
  230. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/aws/utils.py +0 -0
  231. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/azure/__init__.py +0 -0
  232. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/azure/azure-config-template.json +0 -0
  233. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/azure/config.py +0 -0
  234. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/azure/instance.py +0 -0
  235. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/common.py +0 -0
  236. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/constants.py +0 -0
  237. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/cudo/__init__.py +0 -0
  238. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/cudo/config.py +0 -0
  239. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/cudo/cudo_machine_type.py +0 -0
  240. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/cudo/cudo_utils.py +0 -0
  241. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/cudo/cudo_wrapper.py +0 -0
  242. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/cudo/instance.py +0 -0
  243. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/do/__init__.py +0 -0
  244. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/do/config.py +0 -0
  245. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/do/constants.py +0 -0
  246. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/do/instance.py +0 -0
  247. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/do/utils.py +0 -0
  248. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/docker_utils.py +0 -0
  249. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/fluidstack/__init__.py +0 -0
  250. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/fluidstack/config.py +0 -0
  251. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/fluidstack/fluidstack_utils.py +0 -0
  252. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/fluidstack/instance.py +0 -0
  253. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/__init__.py +0 -0
  254. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/config.py +0 -0
  255. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/constants.py +0 -0
  256. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/instance.py +0 -0
  257. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/instance_utils.py +0 -0
  258. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/mig_utils.py +0 -0
  259. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/gcp/volume_utils.py +0 -0
  260. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/hyperbolic/__init__.py +0 -0
  261. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/hyperbolic/config.py +0 -0
  262. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/hyperbolic/instance.py +0 -0
  263. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/hyperbolic/utils.py +0 -0
  264. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/__init__.py +0 -0
  265. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/config.py +0 -0
  266. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/constants.py +0 -0
  267. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/instance.py +0 -0
  268. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +0 -0
  269. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/network.py +0 -0
  270. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/network_utils.py +0 -0
  271. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/kubernetes/utils.py +0 -0
  272. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/lambda_cloud/__init__.py +0 -0
  273. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/lambda_cloud/config.py +0 -0
  274. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/lambda_cloud/instance.py +0 -0
  275. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/lambda_cloud/lambda_utils.py +0 -0
  276. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/logging.py +0 -0
  277. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/metadata_utils.py +0 -0
  278. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/nebius/__init__.py +0 -0
  279. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/nebius/config.py +0 -0
  280. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/nebius/constants.py +0 -0
  281. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/nebius/instance.py +0 -0
  282. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/nebius/utils.py +0 -0
  283. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/oci/__init__.py +0 -0
  284. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/oci/config.py +0 -0
  285. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/oci/instance.py +0 -0
  286. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/oci/query_utils.py +0 -0
  287. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/paperspace/__init__.py +0 -0
  288. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/paperspace/config.py +0 -0
  289. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/paperspace/constants.py +0 -0
  290. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/paperspace/instance.py +0 -0
  291. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/paperspace/utils.py +0 -0
  292. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/__init__.py +0 -0
  293. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/api/__init__.py +0 -0
  294. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/api/commands.py +0 -0
  295. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/api/pods.py +0 -0
  296. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/config.py +0 -0
  297. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/instance.py +0 -0
  298. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/runpod/utils.py +0 -0
  299. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/scp/__init__.py +0 -0
  300. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/scp/config.py +0 -0
  301. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/scp/instance.py +0 -0
  302. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/ssh/__init__.py +0 -0
  303. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vast/__init__.py +0 -0
  304. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vast/config.py +0 -0
  305. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vast/instance.py +0 -0
  306. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vast/utils.py +0 -0
  307. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/__init__.py +0 -0
  308. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/__init__.py +0 -0
  309. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/cls_api_client.py +0 -0
  310. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/cls_api_helper.py +0 -0
  311. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/custom_script.py +0 -0
  312. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/id_generator.py +0 -0
  313. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/metadata_utils.py +0 -0
  314. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/service_manager.py +0 -0
  315. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/service_manager_factory.py +0 -0
  316. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/ssl_helper.py +0 -0
  317. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/vapiconnect.py +0 -0
  318. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/common/vim_utils.py +0 -0
  319. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/config.py +0 -0
  320. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/instance.py +0 -0
  321. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/provision/vsphere/vsphere_utils.py +0 -0
  322. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/resources.py +0 -0
  323. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/__init__.py +0 -0
  324. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/autoscalers.py +0 -0
  325. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/client/__init__.py +0 -0
  326. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/client/sdk.py +0 -0
  327. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/constants.py +0 -0
  328. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/controller.py +0 -0
  329. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/load_balancer.py +0 -0
  330. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/load_balancing_policies.py +0 -0
  331. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/replica_managers.py +0 -0
  332. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/serve_state.py +0 -0
  333. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/serve_utils.py +0 -0
  334. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/server/__init__.py +0 -0
  335. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/server/core.py +0 -0
  336. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/server/server.py +0 -0
  337. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/service.py +0 -0
  338. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/service_spec.py +0 -0
  339. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/serve/spot_placer.py +0 -0
  340. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/__init__.py +0 -0
  341. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/config.py +0 -0
  342. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/constants.py +0 -0
  343. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/html/log.html +0 -0
  344. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/html/token_page.html +0 -0
  345. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/__init__.py +0 -0
  346. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/event_loop.py +0 -0
  347. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/executor.py +0 -0
  348. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/preconditions.py +0 -0
  349. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/process.py +0 -0
  350. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/queues/__init__.py +0 -0
  351. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/queues/local_queue.py +0 -0
  352. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/queues/mp_queue.py +0 -0
  353. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/requests.py +0 -0
  354. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/serializers/__init__.py +0 -0
  355. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/serializers/decoders.py +0 -0
  356. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/requests/serializers/encoders.py +0 -0
  357. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/stream_utils.py +0 -0
  358. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/server/uvicorn.py +0 -0
  359. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/setup_files/MANIFEST.in +0 -0
  360. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/setup_files/setup.py +0 -0
  361. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/sky_logging.py +0 -0
  362. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/LICENSE +0 -0
  363. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/__init__.py +0 -0
  364. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/attempt_skylet.py +0 -0
  365. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/autostop_lib.py +0 -0
  366. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/configs.py +0 -0
  367. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/events.py +0 -0
  368. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/log_lib.py +0 -0
  369. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/log_lib.pyi +0 -0
  370. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/providers/__init__.py +0 -0
  371. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/providers/command_runner.py +0 -0
  372. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/providers/ibm/__init__.py +0 -0
  373. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/providers/ibm/node_provider.py +0 -0
  374. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/providers/ibm/utils.py +0 -0
  375. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/providers/ibm/vpc_provider.py +0 -0
  376. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/__init__.py +0 -0
  377. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/autoscaler.py.patch +0 -0
  378. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/cli.py.patch +0 -0
  379. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/command_runner.py.patch +0 -0
  380. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/log_monitor.py.patch +0 -0
  381. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/resource_demand_scheduler.py.patch +0 -0
  382. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/updater.py.patch +0 -0
  383. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/ray_patches/worker.py.patch +0 -0
  384. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/skylet.py +0 -0
  385. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skylet/subprocess_daemon.py +0 -0
  386. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/skypilot_config.py +0 -0
  387. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/task.py +0 -0
  388. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/aws-ray.yml.j2 +0 -0
  389. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/azure-ray.yml.j2 +0 -0
  390. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/cudo-ray.yml.j2 +0 -0
  391. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/do-ray.yml.j2 +0 -0
  392. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/fluidstack-ray.yml.j2 +0 -0
  393. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/gcp-ray.yml.j2 +0 -0
  394. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/hyperbolic-ray.yml.j2 +0 -0
  395. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/ibm-ray.yml.j2 +0 -0
  396. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/jobs-controller.yaml.j2 +0 -0
  397. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/kubernetes-ingress.yml.j2 +0 -0
  398. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/kubernetes-loadbalancer.yml.j2 +0 -0
  399. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/kubernetes-port-forward-proxy-command.sh +0 -0
  400. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/kubernetes-ssh-jump.yml.j2 +0 -0
  401. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/lambda-ray.yml.j2 +0 -0
  402. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/local-ray.yml.j2 +0 -0
  403. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/nebius-ray.yml.j2 +0 -0
  404. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/oci-ray.yml.j2 +0 -0
  405. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/paperspace-ray.yml.j2 +0 -0
  406. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/runpod-ray.yml.j2 +0 -0
  407. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/scp-ray.yml.j2 +0 -0
  408. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/sky-serve-controller.yaml.j2 +0 -0
  409. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/skypilot-server-kubernetes-proxy.sh +0 -0
  410. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/vast-ray.yml.j2 +0 -0
  411. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/vsphere-ray.yml.j2 +0 -0
  412. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/templates/websocket_proxy.py +0 -0
  413. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/usage/__init__.py +0 -0
  414. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/usage/constants.py +0 -0
  415. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/usage/usage_lib.py +0 -0
  416. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/users/__init__.py +0 -0
  417. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/users/model.conf +0 -0
  418. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/__init__.py +0 -0
  419. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/accelerator_registry.py +0 -0
  420. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/admin_policy_utils.py +0 -0
  421. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/annotations.py +0 -0
  422. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/atomic.py +0 -0
  423. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/aws/__init__.py +0 -0
  424. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/aws/get_default_security_group.py +0 -0
  425. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/cli_utils/__init__.py +0 -0
  426. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/cli_utils/status_utils.py +0 -0
  427. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/cluster_utils.py +0 -0
  428. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/command_runner.py +0 -0
  429. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/command_runner.pyi +0 -0
  430. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/common.py +0 -0
  431. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/common_utils.py +0 -0
  432. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/config_utils.py +0 -0
  433. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/context.py +0 -0
  434. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/context_utils.py +0 -0
  435. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/control_master_utils.py +0 -0
  436. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/controller_utils.py +0 -0
  437. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/dag_utils.py +0 -0
  438. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/db_utils.py +0 -0
  439. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/env_options.py +0 -0
  440. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/infra_utils.py +0 -0
  441. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/__init__.py +0 -0
  442. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/cleanup-tunnel.sh +0 -0
  443. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/config_map_utils.py +0 -0
  444. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/create_cluster.sh +0 -0
  445. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/delete_cluster.sh +0 -0
  446. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/deploy_remote_cluster.py +0 -0
  447. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/exec_kubeconfig_converter.py +0 -0
  448. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/generate_kind_config.py +0 -0
  449. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/generate_kubeconfig.sh +0 -0
  450. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/gpu_labeler.py +0 -0
  451. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +0 -0
  452. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +0 -0
  453. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/kubernetes_deploy_utils.py +0 -0
  454. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/rsync_helper.sh +0 -0
  455. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/ssh-tunnel.sh +0 -0
  456. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -0
  457. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/kubernetes_enums.py +0 -0
  458. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/log_utils.py +0 -0
  459. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/message_utils.py +0 -0
  460. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/registry.py +0 -0
  461. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/resources_utils.py +0 -0
  462. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/rich_console_utils.py +0 -0
  463. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/rich_utils.py +0 -0
  464. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/status_lib.py +0 -0
  465. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/subprocess_utils.py +0 -0
  466. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/timeline.py +0 -0
  467. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/ux_utils.py +0 -0
  468. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/utils/validator.py +0 -0
  469. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/workspaces/__init__.py +0 -0
  470. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/workspaces/core.py +0 -0
  471. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/workspaces/server.py +0 -0
  472. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/sky/workspaces/utils.py +0 -0
  473. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/skypilot_nightly.egg-info/dependency_links.txt +0 -0
  474. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/skypilot_nightly.egg-info/entry_points.txt +0 -0
  475. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/skypilot_nightly.egg-info/top_level.txt +0 -0
  476. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_api.py +0 -0
  477. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_config.py +0 -0
  478. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_db_utils.py +0 -0
  479. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_failover.py +0 -0
  480. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_global_user_state.py +0 -0
  481. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_jobs.py +0 -0
  482. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_list_accelerators.py +0 -0
  483. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_serve_autoscaler.py +0 -0
  484. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_storage.py +0 -0
  485. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_wheels.py +0 -0
  486. {skypilot_nightly-1.0.0.dev20250617 → skypilot_nightly-1.0.0.dev20250618}/tests/test_yaml_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250617
3
+ Version: 1.0.0.dev20250618
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -51,6 +51,7 @@ Requires-Dist: sqlalchemy
51
51
  Requires-Dist: psycopg2-binary
52
52
  Requires-Dist: casbin
53
53
  Requires-Dist: sqlalchemy_adapter
54
+ Requires-Dist: passlib
54
55
  Provides-Extra: aws
55
56
  Requires-Dist: awscli>=1.27.10; extra == "aws"
56
57
  Requires-Dist: botocore>=1.29.10; extra == "aws"
@@ -120,6 +121,10 @@ Requires-Dist: botocore>=1.29.10; extra == "nebius"
120
121
  Requires-Dist: boto3>=1.26.1; extra == "nebius"
121
122
  Requires-Dist: colorama<0.4.5; extra == "nebius"
122
123
  Provides-Extra: hyperbolic
124
+ Provides-Extra: server
125
+ Requires-Dist: casbin; extra == "server"
126
+ Requires-Dist: sqlalchemy_adapter; extra == "server"
127
+ Requires-Dist: passlib; extra == "server"
123
128
  Provides-Extra: all
124
129
  Requires-Dist: awscli>=1.27.10; extra == "all"
125
130
  Requires-Dist: botocore>=1.29.10; extra == "all"
@@ -169,6 +174,9 @@ Requires-Dist: awscli>=1.27.10; extra == "all"
169
174
  Requires-Dist: botocore>=1.29.10; extra == "all"
170
175
  Requires-Dist: boto3>=1.26.1; extra == "all"
171
176
  Requires-Dist: colorama<0.4.5; extra == "all"
177
+ Requires-Dist: casbin; extra == "all"
178
+ Requires-Dist: sqlalchemy_adapter; extra == "all"
179
+ Requires-Dist: passlib; extra == "all"
172
180
  Dynamic: author
173
181
  Dynamic: classifier
174
182
  Dynamic: description
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = 'fa78e63ee618b8695df1bca87911a231cce3d7da'
8
+ _SKYPILOT_COMMIT_SHA = '903f8a7f3955084316b26af619b6b043f43de01c'
9
9
 
10
10
 
11
11
  def _get_git_commit():
@@ -35,7 +35,7 @@ def _get_git_commit():
35
35
 
36
36
 
37
37
  __commit__ = _get_git_commit()
38
- __version__ = '1.0.0.dev20250617'
38
+ __version__ = '1.0.0.dev20250618'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
@@ -28,6 +28,7 @@ from sky import check as sky_check
28
28
  from sky import clouds
29
29
  from sky import exceptions
30
30
  from sky import global_user_state
31
+ from sky import logs
31
32
  from sky import provision as provision_lib
32
33
  from sky import sky_logging
33
34
  from sky import skypilot_config
@@ -660,6 +661,12 @@ def write_cluster_config(
660
661
 
661
662
  credentials = sky_check.get_cloud_credential_file_mounts(excluded_clouds)
662
663
 
664
+ logging_agent = logs.get_logging_agent()
665
+ if logging_agent:
666
+ for k, v in logging_agent.get_credential_file_mounts().items():
667
+ assert k not in credentials, f'{k} already in credentials'
668
+ credentials[k] = v
669
+
663
670
  private_key_path, _ = auth.get_or_generate_keys()
664
671
  auth_config = {'ssh_private_key': private_key_path}
665
672
  region_name = resources_vars.get('region')
@@ -142,6 +142,7 @@ _MAX_RAY_UP_RETRY = 5
142
142
  _MAX_GET_ZONE_RETRY = 3
143
143
 
144
144
  _JOB_ID_PATTERN = re.compile(r'Job ID: ([0-9]+)')
145
+ _LOG_DIR_PATTERN = re.compile(r'Log Dir: ([^ ]+)')
145
146
 
146
147
  # Path to the monkey-patched ray up script.
147
148
  # We don't do import then __file__ because that script needs to be filled in
@@ -3461,10 +3462,12 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3461
3462
  job_id: int,
3462
3463
  detach_run: bool = False,
3463
3464
  managed_job_dag: Optional['dag.Dag'] = None,
3465
+ remote_log_dir: Optional[str] = None,
3464
3466
  ) -> None:
3465
3467
  """Executes generated code on the head node."""
3466
3468
  script_path = os.path.join(SKY_REMOTE_APP_DIR, f'sky_job_{job_id}')
3467
- remote_log_dir = self.log_dir
3469
+ if remote_log_dir is None:
3470
+ remote_log_dir = self.log_dir
3468
3471
  remote_log_path = os.path.join(remote_log_dir, 'run.log')
3469
3472
 
3470
3473
  cd = f'cd {SKY_REMOTE_WORKDIR}'
@@ -3583,13 +3586,14 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3583
3586
  self.tail_logs(handle, job_id)
3584
3587
 
3585
3588
  def _add_job(self, handle: CloudVmRayResourceHandle,
3586
- job_name: Optional[str], resources_str: str) -> int:
3589
+ job_name: Optional[str],
3590
+ resources_str: str) -> Tuple[int, str]:
3587
3591
  code = job_lib.JobLibCodeGen.add_job(
3588
3592
  job_name=job_name,
3589
3593
  username=common_utils.get_user_hash(),
3590
3594
  run_timestamp=self.run_timestamp,
3591
3595
  resources_str=resources_str)
3592
- returncode, job_id_str, stderr = self.run_on_head(handle,
3596
+ returncode, result_str, stderr = self.run_on_head(handle,
3593
3597
  code,
3594
3598
  stream_logs=False,
3595
3599
  require_outputs=True,
@@ -3603,17 +3607,23 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3603
3607
  subprocess_utils.handle_returncode(returncode, code,
3604
3608
  'Failed to fetch job id.', stderr)
3605
3609
  try:
3606
- job_id_match = _JOB_ID_PATTERN.search(job_id_str)
3610
+ job_id_match = _JOB_ID_PATTERN.search(result_str)
3607
3611
  if job_id_match is not None:
3608
3612
  job_id = int(job_id_match.group(1))
3609
3613
  else:
3610
3614
  # For backward compatibility.
3611
- job_id = int(job_id_str)
3615
+ job_id = int(result_str)
3616
+ log_dir_match = _LOG_DIR_PATTERN.search(result_str)
3617
+ if log_dir_match is not None:
3618
+ log_dir = log_dir_match.group(1).strip()
3619
+ else:
3620
+ # For backward compatibility, use the same log dir as local.
3621
+ log_dir = self.log_dir
3612
3622
  except ValueError as e:
3613
3623
  logger.error(stderr)
3614
- raise ValueError(f'Failed to parse job id: {job_id_str}; '
3624
+ raise ValueError(f'Failed to parse job id: {result_str}; '
3615
3625
  f'Returncode: {returncode}') from e
3616
- return job_id
3626
+ return job_id, log_dir
3617
3627
 
3618
3628
  def _execute(
3619
3629
  self,
@@ -3665,15 +3675,17 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3665
3675
  logger.info(f'Dryrun complete. Would have run:\n{task}')
3666
3676
  return None
3667
3677
 
3668
- job_id = self._add_job(handle, task_copy.name, resources_str)
3678
+ job_id, log_dir = self._add_job(handle, task_copy.name, resources_str)
3669
3679
 
3670
3680
  num_actual_nodes = task.num_nodes * handle.num_ips_per_node
3671
3681
  # Case: task_lib.Task(run, num_nodes=N) or TPU VM Pods
3672
3682
  if num_actual_nodes > 1:
3673
- self._execute_task_n_nodes(handle, task_copy, job_id, detach_run)
3683
+ self._execute_task_n_nodes(handle, task_copy, job_id, detach_run,
3684
+ log_dir)
3674
3685
  else:
3675
3686
  # Case: task_lib.Task(run, num_nodes=1)
3676
- self._execute_task_one_node(handle, task_copy, job_id, detach_run)
3687
+ self._execute_task_one_node(handle, task_copy, job_id, detach_run,
3688
+ log_dir)
3677
3689
 
3678
3690
  return job_id
3679
3691
 
@@ -3836,32 +3848,32 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
3836
3848
  Returns:
3837
3849
  A dictionary mapping job_id to log path.
3838
3850
  """
3839
- code = job_lib.JobLibCodeGen.get_run_timestamp_with_globbing(job_ids)
3840
- returncode, run_timestamps, stderr = self.run_on_head(
3841
- handle,
3842
- code,
3843
- stream_logs=False,
3844
- require_outputs=True,
3845
- separate_stderr=True)
3851
+ code = job_lib.JobLibCodeGen.get_log_dirs_for_jobs(job_ids)
3852
+ returncode, job_to_dir, stderr = self.run_on_head(handle,
3853
+ code,
3854
+ stream_logs=False,
3855
+ require_outputs=True,
3856
+ separate_stderr=True)
3846
3857
  subprocess_utils.handle_returncode(returncode, code,
3847
3858
  'Failed to sync logs.', stderr)
3848
- run_timestamps = message_utils.decode_payload(run_timestamps)
3849
- if not run_timestamps:
3859
+ job_to_dir: Dict[str, str] = message_utils.decode_payload(job_to_dir)
3860
+ if not job_to_dir:
3850
3861
  logger.info(f'{colorama.Fore.YELLOW}'
3851
3862
  'No matching log directories found'
3852
3863
  f'{colorama.Style.RESET_ALL}')
3853
3864
  return {}
3854
3865
 
3855
- job_ids = list(run_timestamps.keys())
3856
- run_timestamps = list(run_timestamps.values())
3866
+ job_ids = list(job_to_dir.keys())
3867
+ dirs = list(job_to_dir.values())
3857
3868
  remote_log_dirs = [
3858
- os.path.join(constants.SKY_LOGS_DIRECTORY, run_timestamp)
3859
- for run_timestamp in run_timestamps
3860
- ]
3861
- local_log_dirs = [
3862
- os.path.join(local_dir, run_timestamp)
3863
- for run_timestamp in run_timestamps
3869
+ # TODO(aylei): backward compatibility for legacy runtime that
3870
+ # returns run_timestamp only, remove after 0.12.0
3871
+ (dir if constants.SKY_LOGS_DIRECTORY in dir else os.path.join(
3872
+ constants.SKY_LOGS_DIRECTORY, dir)) for dir in dirs
3864
3873
  ]
3874
+ local_log_dirs = [(dir.replace(constants.SKY_LOGS_DIRECTORY, local_dir)
3875
+ if constants.SKY_LOGS_DIRECTORY in dir else
3876
+ os.path.join(local_dir, dir)) for dir in dirs]
3865
3877
 
3866
3878
  runners = handle.get_command_runners()
3867
3879
 
@@ -4033,8 +4045,7 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
4033
4045
 
4034
4046
  # get the run_timestamp
4035
4047
  # the function takes in [job_id]
4036
- code = job_lib.JobLibCodeGen.get_run_timestamp_with_globbing(
4037
- [str(job_id)])
4048
+ code = job_lib.JobLibCodeGen.get_log_dirs_for_jobs([str(job_id)])
4038
4049
  returncode, run_timestamps, stderr = self.run_on_head(
4039
4050
  handle,
4040
4051
  code,
@@ -5182,9 +5193,9 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5182
5193
 
5183
5194
  def _execute_task_one_node(self, handle: CloudVmRayResourceHandle,
5184
5195
  task: task_lib.Task, job_id: int,
5185
- detach_run: bool) -> None:
5196
+ detach_run: bool, remote_log_dir: str) -> None:
5186
5197
  # Launch the command as a Ray task.
5187
- log_dir = os.path.join(self.log_dir, 'tasks')
5198
+ log_dir = os.path.join(remote_log_dir, 'tasks')
5188
5199
 
5189
5200
  resources_dict = backend_utils.get_task_demands_dict(task)
5190
5201
  internal_ips = handle.internal_ips()
@@ -5222,17 +5233,17 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5222
5233
  codegen.build(),
5223
5234
  job_id,
5224
5235
  detach_run=detach_run,
5225
- managed_job_dag=task.managed_job_dag)
5236
+ managed_job_dag=task.managed_job_dag,
5237
+ remote_log_dir=remote_log_dir)
5226
5238
 
5227
5239
  def _execute_task_n_nodes(self, handle: CloudVmRayResourceHandle,
5228
5240
  task: task_lib.Task, job_id: int,
5229
- detach_run: bool) -> None:
5241
+ detach_run: bool, remote_log_dir: str) -> None:
5230
5242
  # Strategy:
5231
5243
  # ray.init(...)
5232
5244
  # for node:
5233
5245
  # submit _run_cmd(cmd) with resource {node_i: 1}
5234
- log_dir_base = self.log_dir
5235
- log_dir = os.path.join(log_dir_base, 'tasks')
5246
+ log_dir = os.path.join(remote_log_dir, 'tasks')
5236
5247
  resources_dict = backend_utils.get_task_demands_dict(task)
5237
5248
  internal_ips = handle.internal_ips()
5238
5249
  assert internal_ips is not None, 'internal_ips is not cached in handle'
@@ -5278,4 +5289,5 @@ class CloudVmRayBackend(backends.Backend['CloudVmRayResourceHandle']):
5278
5289
  codegen.build(),
5279
5290
  job_id,
5280
5291
  detach_run=detach_run,
5281
- managed_job_dag=task.managed_job_dag)
5292
+ managed_job_dag=task.managed_job_dag,
5293
+ remote_log_dir=remote_log_dir)
@@ -0,0 +1,9 @@
1
+ """The 'sky' command line tool."""
2
+
3
+ from sky.client import cli as cli_client
4
+
5
+
6
+ # For backward compatibility.
7
+ # setup.py uses this file to install the CLI.
8
+ def cli():
9
+ cli_client.cli()
@@ -5498,10 +5498,19 @@ def api():
5498
5498
  'to manage the process lifecycle and collect logs directly. '
5499
5499
  'This is useful when the API server is managed by systems '
5500
5500
  'like systemd and Kubernetes.')
5501
+ @click.option('--enable-basic-auth',
5502
+ is_flag=True,
5503
+ default=False,
5504
+ required=False,
5505
+ help='Enable basic authentication in the SkyPilot API server.')
5501
5506
  @usage_lib.entrypoint
5502
- def api_start(deploy: bool, host: Optional[str], foreground: bool):
5507
+ def api_start(deploy: bool, host: Optional[str], foreground: bool,
5508
+ enable_basic_auth: bool):
5503
5509
  """Starts the SkyPilot API server locally."""
5504
- sdk.api_start(deploy=deploy, host=host, foreground=foreground)
5510
+ sdk.api_start(deploy=deploy,
5511
+ host=host,
5512
+ foreground=foreground,
5513
+ enable_basic_auth=enable_basic_auth)
5505
5514
 
5506
5515
 
5507
5516
  @api.command('stop', cls=_DocumentedCodeCommand)
@@ -1856,6 +1856,7 @@ def api_start(
1856
1856
  deploy: bool = False,
1857
1857
  host: str = '127.0.0.1',
1858
1858
  foreground: bool = False,
1859
+ enable_basic_auth: bool = False,
1859
1860
  ) -> None:
1860
1861
  """Starts the API server.
1861
1862
 
@@ -1869,6 +1870,8 @@ def api_start(
1869
1870
  if deploy is True, to allow remote access.
1870
1871
  foreground: Whether to run the API server in the foreground (run in
1871
1872
  the current process).
1873
+ enable_basic_auth: Whether to enable basic authentication
1874
+ in the API server.
1872
1875
  Returns:
1873
1876
  None
1874
1877
  """
@@ -1887,7 +1890,8 @@ def api_start(
1887
1890
  'from the config file and/or unset the '
1888
1891
  'SKYPILOT_API_SERVER_ENDPOINT environment '
1889
1892
  'variable.')
1890
- server_common.check_server_healthy_or_start_fn(deploy, host, foreground)
1893
+ server_common.check_server_healthy_or_start_fn(deploy, host, foreground,
1894
+ enable_basic_auth)
1891
1895
  if foreground:
1892
1896
  # Explain why current process exited
1893
1897
  logger.info('API server is already running:')
@@ -1990,7 +1994,8 @@ def api_login(endpoint: Optional[str] = None, get_token: bool = False) -> None:
1990
1994
  raise click.BadParameter('Endpoint must be a valid URL.')
1991
1995
  endpoint = endpoint.rstrip('/')
1992
1996
 
1993
- server_status = server_common.check_server_healthy(endpoint)
1997
+ server_status, api_server_info = server_common.check_server_healthy(
1998
+ endpoint)
1994
1999
  if server_status == server_common.ApiServerStatus.NEEDS_AUTH or get_token:
1995
2000
  # We detected an auth proxy, so go through the auth proxy cookie flow.
1996
2001
  token: Optional[str] = None
@@ -2121,6 +2126,21 @@ def api_login(endpoint: Optional[str] = None, get_token: bool = False) -> None:
2121
2126
  'w',
2122
2127
  encoding='utf-8') as f:
2123
2128
  f.write(user_hash)
2129
+ else:
2130
+ # Check if basic auth is enabled
2131
+ if api_server_info.basic_auth_enabled:
2132
+ if api_server_info.user is None:
2133
+ with ux_utils.print_exception_no_traceback():
2134
+ raise ValueError(
2135
+ 'Basic auth is enabled but no valid user is found')
2136
+ # Set the user hash in the local file
2137
+ user_hash = api_server_info.user.get('id')
2138
+ if not user_hash or not common_utils.is_valid_user_hash(user_hash):
2139
+ raise ValueError(f'Invalid user hash: {user_hash}')
2140
+ with open(os.path.expanduser('~/.sky/user_hash'),
2141
+ 'w',
2142
+ encoding='utf-8') as f:
2143
+ f.write(user_hash)
2124
2144
 
2125
2145
  # Set the endpoint in the config file
2126
2146
  config_path = pathlib.Path(
@@ -602,6 +602,10 @@ class Kubernetes(clouds.Cloud):
602
602
  None,
603
603
  override_configs=resources.cluster_config_overrides)
604
604
 
605
+ k8s_kueue_local_queue_name = skypilot_config.get_nested(
606
+ ('kubernetes', 'kueue', 'local_queue_name'),
607
+ None,
608
+ override_configs=resources.cluster_config_overrides)
605
609
  deploy_vars = {
606
610
  'instance_type': resources.instance_type,
607
611
  'custom_resources': custom_resources,
@@ -619,6 +623,7 @@ class Kubernetes(clouds.Cloud):
619
623
  'k8s_service_account_name': k8s_service_account_name,
620
624
  'k8s_automount_sa_token': 'true',
621
625
  'k8s_fuse_device_required': fuse_device_required,
626
+ 'k8s_kueue_local_queue_name': k8s_kueue_local_queue_name,
622
627
  # Namespace to run the fusermount-server daemonset in
623
628
  'k8s_skypilot_system_namespace': _SKYPILOT_SYSTEM_NAMESPACE,
624
629
  'k8s_fusermount_shared_dir': _FUSERMOUNT_SHARED_DIR,
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/8e97adcaacc15293.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/8e97adcaacc15293.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-1b69b196a4dbffef.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-32b2caae3445bf3b.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-1be831200e60c5c0.js" defer=""></script><script src="/dashboard/_next/static/vA3PPpkBwpRTRNBHFYAw_/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/vA3PPpkBwpRTRNBHFYAw_/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"vA3PPpkBwpRTRNBHFYAw_","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/dashboard/_next/static/css/6c12ecc3bd2239b6.css" as="style"/><link rel="stylesheet" href="/dashboard/_next/static/css/6c12ecc3bd2239b6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/dashboard/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="/dashboard/_next/static/chunks/webpack-ebc2404fd6ce581c.js" defer=""></script><script src="/dashboard/_next/static/chunks/framework-87d061ee6ed71b28.js" defer=""></script><script src="/dashboard/_next/static/chunks/main-e0e2335212e72357.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_app-c416e87d5c2715cf.js" defer=""></script><script src="/dashboard/_next/static/chunks/pages/_error-1be831200e60c5c0.js" defer=""></script><script src="/dashboard/_next/static/LRpGymRCqq-feuFyoWz4m/_buildManifest.js" defer=""></script><script src="/dashboard/_next/static/LRpGymRCqq-feuFyoWz4m/_ssgManifest.js" defer=""></script></head><body><div id="__next"></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"LRpGymRCqq-feuFyoWz4m","assetPrefix":"/dashboard","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- self.__BUILD_MANIFEST=function(s,c,a,e,t,n,r,u,i,j,k,b,f){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-6b0d9e5031b70c58.js"],"/_error":["static/chunks/pages/_error-1be831200e60c5c0.js"],"/clusters":["static/chunks/pages/clusters-82a651dbad53ec6e.js"],"/clusters/[cluster]":[s,c,a,e,t,r,i,n,j,u,k,b,f,"static/chunks/37-824c707421f6f003.js","static/chunks/pages/clusters/[cluster]-36bc0962129f72df.js"],"/clusters/[cluster]/[job]":[s,c,a,e,t,n,"static/chunks/pages/clusters/[cluster]/[job]-89216c616dbaa9c5.js"],"/config":["static/chunks/pages/config-497a35a7ed49734a.js"],"/infra":["static/chunks/pages/infra-780860bcc1103945.js"],"/infra/[context]":["static/chunks/pages/infra/[context]-d2910be98e9227cb.js"],"/jobs":["static/chunks/pages/jobs-336ab80e270ce2ce.js"],"/jobs/[job]":[s,c,a,e,t,r,n,u,"static/chunks/pages/jobs/[job]-cf490d1fa38f3740.js"],"/users":["static/chunks/pages/users-c69ffcab9d6e5269.js"],"/workspace/new":["static/chunks/pages/workspace/new-31aa8bdcb7592635.js"],"/workspaces":["static/chunks/pages/workspaces-82e6601baa5dd280.js"],"/workspaces/[name]":[s,c,a,e,t,r,i,n,j,u,k,b,f,"static/chunks/843-ab9c4f609239155f.js","static/chunks/pages/workspaces/[name]-c8c2191328532b7d.js"],sortedPages:["/","/_app","/_error","/clusters","/clusters/[cluster]","/clusters/[cluster]/[job]","/config","/infra","/infra/[context]","/jobs","/jobs/[job]","/users","/workspace/new","/workspaces","/workspaces/[name]"]}}("static/chunks/616-d6128fa9e7cae6e6.js","static/chunks/760-a89d354797ce7af5.js","static/chunks/799-3625946b2ec2eb30.js","static/chunks/804-4c9fc53aa74bc191.js","static/chunks/664-047bc03493fda379.js","static/chunks/470-4d1a5dbe58a8a2b9.js","static/chunks/798-c0525dc3f21e488d.js","static/chunks/969-20d54a9d998dc102.js","static/chunks/947-6620842ef80ae879.js","static/chunks/901-b424d293275e1fd7.js","static/chunks/856-c2c39c0912285e54.js","static/chunks/973-c807fc34f09c7df3.js","static/chunks/938-385d190b95815e11.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
1
+ self.__BUILD_MANIFEST=function(s,c,e,a,t,n,r,u,i,b,j,k,f){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/pages/index-6b0d9e5031b70c58.js"],"/_error":["static/chunks/pages/_error-1be831200e60c5c0.js"],"/clusters":["static/chunks/pages/clusters-82a651dbad53ec6e.js"],"/clusters/[cluster]":[s,c,e,a,t,r,i,n,b,u,j,k,f,"static/chunks/37-3a4d77ad62932eaf.js","static/chunks/pages/clusters/[cluster]-36bc0962129f72df.js"],"/clusters/[cluster]/[job]":[s,c,e,a,t,n,"static/chunks/pages/clusters/[cluster]/[job]-89216c616dbaa9c5.js"],"/config":["static/chunks/pages/config-497a35a7ed49734a.js"],"/infra":["static/chunks/pages/infra-780860bcc1103945.js"],"/infra/[context]":["static/chunks/pages/infra/[context]-d2910be98e9227cb.js"],"/jobs":["static/chunks/pages/jobs-336ab80e270ce2ce.js"],"/jobs/[job]":[s,c,e,a,t,r,n,u,"static/chunks/pages/jobs/[job]-cf490d1fa38f3740.js"],"/users":["static/chunks/pages/users-928edf039219e47b.js"],"/workspace/new":["static/chunks/pages/workspace/new-31aa8bdcb7592635.js"],"/workspaces":["static/chunks/pages/workspaces-82e6601baa5dd280.js"],"/workspaces/[name]":[s,c,e,a,t,r,i,n,b,u,j,k,f,"static/chunks/843-b3040e493f6e7947.js","static/chunks/pages/workspaces/[name]-c4ff1ec05e2f3daf.js"],sortedPages:["/","/_app","/_error","/clusters","/clusters/[cluster]","/clusters/[cluster]/[job]","/config","/infra","/infra/[context]","/jobs","/jobs/[job]","/users","/workspace/new","/workspaces","/workspaces/[name]"]}}("static/chunks/616-d6128fa9e7cae6e6.js","static/chunks/760-a89d354797ce7af5.js","static/chunks/799-3625946b2ec2eb30.js","static/chunks/804-4c9fc53aa74bc191.js","static/chunks/664-047bc03493fda379.js","static/chunks/470-4d1a5dbe58a8a2b9.js","static/chunks/798-c0525dc3f21e488d.js","static/chunks/969-20d54a9d998dc102.js","static/chunks/947-6620842ef80ae879.js","static/chunks/901-b424d293275e1fd7.js","static/chunks/856-c2c39c0912285e54.js","static/chunks/973-db3c97c2bfbceb65.js","static/chunks/938-1493ac755eadeb35.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[641],{1812:function(e,s,r){r.d(s,{X:function(){return l}});var t=r(5893),a=r(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:r="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,t.jsx)("div",{className:"bg-red-50 border border-red-200 rounded-md p-3 mb-4",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex",children:[(0,t.jsx)("div",{className:"flex-shrink-0",children:(0,t.jsx)("svg",{className:"h-5 w-5 text-red-400",viewBox:"0 0 20 20",fill:"currentColor",children:(0,t.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,t.jsx)("div",{className:"ml-3",children:(0,t.jsxs)("div",{className:"text-sm text-red-800",children:[(0,t.jsxs)("strong",{children:[r,":"]})," ",c]})})]}),(0,t.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,t.jsx)("svg",{className:"h-4 w-4",viewBox:"0 0 20 20",fill:"currentColor",children:(0,t.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,r){r.d(s,{z:function(){return c}});var t=r(5893),a=r(7294),n=r(8426),l=r(2003),i=r(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:r,variant:a,size:l,asChild:c=!1,...d}=e,u=c?n.g7:"button";return(0,t.jsx)(u,{className:(0,i.cn)(o({variant:a,size:l,className:r})),ref:s,...d})});c.displayName="Button"},7673:function(e,s,r){r.d(s,{Ol:function(){return c},Zb:function(){return o},aY:function(){return m},eW:function(){return x},ll:function(){return d}});var t=r(5893),a=r(7294),n=r(5697),l=r.n(n),i=r(2350);let o=a.forwardRef((e,s)=>{let{className:r,children:a,...n}=e;return(0,t.jsx)("div",{ref:s,className:(0,i.cn)("rounded-lg border bg-card text-card-foreground shadow-sm",r),...n,children:a})});o.displayName="Card",o.propTypes={className:l().string,children:l().node};let c=a.forwardRef((e,s)=>{let{className:r,children:a,...n}=e;return(0,t.jsx)("div",{ref:s,className:(0,i.cn)("flex flex-col space-y-1.5 p-6",r),...n,children:a})});c.displayName="CardHeader",c.propTypes={className:l().string,children:l().node};let d=a.forwardRef((e,s)=>{let{className:r,children:a,...n}=e;return(0,t.jsx)("h3",{ref:s,className:(0,i.cn)("text-2xl font-semibold leading-none tracking-tight",r),...n,children:a})});d.displayName="CardTitle",d.propTypes={className:l().string,children:l().node};let u=a.forwardRef((e,s)=>{let{className:r,children:a,...n}=e;return(0,t.jsx)("p",{ref:s,className:(0,i.cn)("text-sm text-muted-foreground",r),...n,children:a})});u.displayName="CardDescription",u.propTypes={className:l().string,children:l().node};let m=a.forwardRef((e,s)=>{let{className:r,children:a,...n}=e;return(0,t.jsx)("div",{ref:s,className:(0,i.cn)("p-6 pt-0",r),...n,children:a})});m.displayName="CardContent",m.propTypes={className:l().string,children:l().node};let x=a.forwardRef((e,s)=>{let{className:r,children:a,...n}=e;return(0,t.jsx)("div",{ref:s,className:(0,i.cn)("flex items-center p-6 pt-0",r),...n,children:a})});x.displayName="CardFooter",x.propTypes={className:l().string,children:l().node}},326:function(e,s,r){r.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 t=r(5893),a=r(7294),n=r(6327),l=r(2350),i=r(3767);let o=n.fC;n.xz;let c=n.h_;n.x8;let d=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.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",r),...a})});d.displayName=n.aV.displayName;let u=a.forwardRef((e,s)=>{let{className:r,children:a,...o}=e;return(0,t.jsxs)(c,{children:[(0,t.jsx)(d,{}),(0,t.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",r),...o,children:[a,(0,t.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,t.jsx)(i.Z,{className:"h-4 w-4"}),(0,t.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})});u.displayName=n.VY.displayName;let m=e=>{let{className:s,...r}=e;return(0,t.jsx)("div",{className:(0,l.cn)("flex flex-col space-y-1.5 text-center sm:text-left",s),...r})};m.displayName="DialogHeader";let x=e=>{let{className:s,...r}=e;return(0,t.jsx)("div",{className:(0,l.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",s),...r})};x.displayName="DialogFooter";let f=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)(n.Dx,{ref:s,className:(0,l.cn)("text-lg font-semibold leading-none tracking-tight",r),...a})});f.displayName=n.Dx.displayName;let h=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)(n.dk,{ref:s,className:(0,l.cn)("text-sm text-gray-500",r),...a})});h.displayName=n.dk.displayName},8764:function(e,s,r){r.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 t=r(5893),a=r(7294),n=r(2350);let l=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("div",{className:"relative w-full overflow-auto",children:(0,t.jsx)("table",{ref:s,className:(0,n.cn)("w-full caption-bottom text-base",r),...a})})});l.displayName="Table";let i=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("thead",{ref:s,className:(0,n.cn)("[&_tr]:border-b",r),...a})});i.displayName="TableHeader";let o=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("tbody",{ref:s,className:(0,n.cn)("[&_tr:last-child]:border-0",r),...a})});o.displayName="TableBody",a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("tfoot",{ref:s,className:(0,n.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",r),...a})}).displayName="TableFooter";let c=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("tr",{ref:s,className:(0,n.cn)("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",r),...a})});c.displayName="TableRow";let d=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.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",r),...a})});d.displayName="TableHead";let u=a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("td",{ref:s,className:(0,n.cn)("p-4 align-middle [&:has([role=checkbox])]:pr-0",r),...a})});u.displayName="TableCell",a.forwardRef((e,s)=>{let{className:r,...a}=e;return(0,t.jsx)("caption",{ref:s,className:(0,n.cn)("mt-4 text-base text-muted-foreground",r),...a})}).displayName="TableCaption"},2641:function(e,s,r){r.r(s),r.d(s,{Users:function(){return V}});var t=r(5893),a=r(7294),n=r(5697),l=r.n(n),i=r(8799),o=r(1664),c=r.n(o),d=r(803),u=r(8764),m=r(3081),x=r(3266),f=r(8969),h=r(6378),p=r(6856),g=r(1214),b=r(4545),j=r(1109),y=r(3626),v=r(3685),N=r(6741),w=r(6826),k=r(282),C=r(3767),R=r(5274),D=r(3936),S=r(7603);r(9470);var E=r(3001),I=r(7673),U=r(7145),F=r(326),_=r(1812);let L=(e,s)=>e&&e.includes("@")?e.split("@")[0]:e||"N/A",Z=(e,s)=>e&&e.includes("@")?e:s||"-",z=g.nb.REFRESH_INTERVAL,T=e=>{let{message:s,onDismiss:r}=e;return s?(0,t.jsx)("div",{className:"bg-green-50 border border-green-200 rounded p-4 mb-6",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)("div",{className:"flex-shrink-0",children:(0,t.jsx)("svg",{className:"h-5 w-5 text-green-400",viewBox:"0 0 20 20",fill:"currentColor",children:(0,t.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,t.jsx)("div",{className:"ml-3",children:(0,t.jsx)("p",{className:"text-sm font-medium text-green-800",children:s})})]}),r&&(0,t.jsx)("div",{className:"ml-auto pl-3",children:(0,t.jsx)("div",{className:"-mx-1.5 -my-1.5",children:(0,t.jsxs)("button",{type:"button",onClick:r,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,t.jsx)("span",{className:"sr-only",children:"Dismiss"}),(0,t.jsx)("svg",{className:"h-5 w-5",viewBox:"0 0 20 20",fill:"currentColor",children:(0,t.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 V(){let[e,s]=(0,a.useState)(!1),r=(0,a.useRef)(null),n=(0,E.X)(),[l,o]=(0,a.useState)(!1),[u,p]=(0,a.useState)({username:"",password:"",role:"user"}),[g,b]=(0,a.useState)(!1),[k,C]=(0,a.useState)({open:!1,message:"",userName:""}),[R,D]=(0,a.useState)(null),[S,I]=(0,a.useState)(!1),[L,Z]=(0,a.useState)(!1),[V,A]=(0,a.useState)(!1),[q,M]=(0,a.useState)(null),[B,O]=(0,a.useState)(!1),[K,H]=(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,er]=(0,a.useState)(!1),[et,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 U.x.get("/api/health");if(e.ok){let s=await e.json();eb(!!s.basic_auth_enabled)}else eb(!1)}catch(e){eb(!1)}})()},[]),(0,a.useEffect)(()=>{ej().catch(()=>{console.error("Failed to get user role")})},[]);let ej=async()=>{if(R&&Date.now()-R.timestamp<3e5)return R;I(!0);try{let e=await U.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(),r={role:s.role,name:s.name,id:s.id,timestamp:Date.now()};return D(r),I(!1),r}catch(e){throw I(!1),e}},ey=async(e,s)=>{try{let r=await ej();if("admin"!==r.role)return C({open:!0,message:e,userName:r.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}]),r.current&&r.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 U.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&&(M(s),H(null))},ek=async()=>{if(!q){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,r=await U.x.post("/users/import",{csv_content:s});if(!r.ok){let e=await r.json();throw Error(e.detail||"Failed to import users")}let t=await r.json(),a="Import completed. ".concat(t.success_count," users created successfully.");t.error_count>0&&(a+="\n".concat(t.error_count," failed."),t.creation_errors.length>0&&(a+="\nErrors: ".concat(t.creation_errors.slice(0,3).join(", ")),t.creation_errors.length>3&&(a+=" and ".concat(t.creation_errors.length-3," more...")))),H({message:a}),t.success_count>0&&ev()}catch(e){alert("Error importing users: ".concat(e.message))}finally{O(!1)}},e.readAsText(q)}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}er(!0),ea(null);try{let e=await U.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{er(!1)}},eD=async()=>{if(ei){em(!0),ed(null);try{let e=await U.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)}}},eS=()=>{el(!1),eo(null),ed(null)},eE=()=>{J(!1),G(null),ee(""),ea(null)};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4 h-5",children:[(0,t.jsx)("div",{className:"text-base",children:(0,t.jsx)(c(),{href:"/users",className:"text-sky-blue hover:underline leading-none",children:"Users"})}),(0,t.jsxs)("div",{className:"flex items-center",children:[e&&(0,t.jsxs)("div",{className:"flex items-center mr-2",children:[(0,t.jsx)(i.Z,{size:15,className:"mt-0"}),(0,t.jsx)("span",{className:"ml-2 text-gray-500 text-sm",children:"Loading..."})]}),eg&&(null==R?void 0:R.role)==="admin"&&(0,t.jsx)("button",{onClick:async()=>{await ey("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,t.jsxs)("button",{onClick:async()=>{await ey("cannot import users",()=>{A(!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,t.jsx)(j.Z,{className:"h-4 w-4 mr-1"}),"Import/Export"]}),(0,t.jsxs)("button",{onClick:ev,disabled:e,className:"text-sky-blue hover:text-sky-blue-bright flex items-center",children:[(0,t.jsx)(y.Z,{className:"h-4 w-4 mr-1.5"}),!n&&(0,t.jsx)("span",{children:"Refresh"})]})]})]}),(0,t.jsx)(T,{message:ex,onDismiss:()=>ef(null)}),(0,t.jsx)(_.X,{error:eh,title:"Error",onDismiss:()=>ep(null)}),(0,t.jsx)(P,{refreshInterval:z,setLoading:s,refreshDataRef:r,checkPermissionAndAct:ey,roleLoading:S,onResetPassword:eC,onDeleteUser:e=>{ey("cannot delete users",()=>{eo(e),el(!0)})},basicAuthEnabled:eg,currentUserRole:null==R?void 0:R.role,currentUserId:null==R?void 0:R.id}),(0,t.jsx)(F.Vq,{open:l,onOpenChange:o,children:(0,t.jsxs)(F.cZ,{className:"sm:max-w-md",children:[(0,t.jsx)(F.fK,{children:(0,t.jsx)(F.$N,{children:"Create User"})}),(0,t.jsxs)("div",{className:"flex flex-col gap-4 py-4",children:[(0,t.jsxs)("div",{className:"grid gap-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Username"}),(0,t.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,t.jsxs)("div",{className:"grid gap-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Password"}),(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("input",{className:"border rounded px-3 py-2 w-full pr-10",placeholder:"Password",type:L?"text":"password",value:u.password,onChange:e=>p({...u,password:e.target.value})}),(0,t.jsx)("button",{type:"button",className:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600",onClick:()=>Z(!L),children:L?(0,t.jsx)(v.Z,{className:"h-4 w-4"}):(0,t.jsx)(N.Z,{className:"h-4 w-4"})})]})]}),(0,t.jsxs)("div",{className:"grid gap-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Role"}),(0,t.jsxs)("select",{className:"border rounded px-3 py-2 w-full",value:u.role,onChange:e=>p({...u,role:e.target.value}),children:[(0,t.jsx)("option",{value:"user",children:"User"}),(0,t.jsx)("option",{value:"admin",children:"Admin"})]})]})]}),(0,t.jsxs)(F.cN,{children:[(0,t.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,t.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,t.jsx)(F.Vq,{open:k.open,onOpenChange:e=>C(s=>({...s,open:e})),children:(0,t.jsxs)(F.cZ,{className:"sm:max-w-md transition-all duration-200 ease-in-out",children:[(0,t.jsxs)(F.fK,{children:[(0,t.jsx)(F.$N,{children:"Permission Denied"}),(0,t.jsx)(F.Be,{children:S?(0,t.jsxs)("div",{className:"flex items-center py-2",children:[(0,t.jsx)(i.Z,{size:16,className:"mr-2"}),(0,t.jsx)("span",{children:"Checking permissions..."})]}):(0,t.jsx)(t.Fragment,{children:k.userName?(0,t.jsxs)(t.Fragment,{children:[k.userName," is logged in as non-admin and ",k.message,"."]}):k.message})})]}),(0,t.jsx)(F.cN,{children:(0,t.jsx)(d.z,{variant:"outline",onClick:()=>C(e=>({...e,open:!1})),disabled:S,children:"OK"})})]})}),(0,t.jsx)(F.Vq,{open:V,onOpenChange:A,children:(0,t.jsxs)(F.cZ,{className:"sm:max-w-lg",children:[(0,t.jsx)(F.fK,{children:(0,t.jsx)(F.$N,{children:"Import/Export Users"})}),(0,t.jsxs)("div",{className:"flex border-b border-gray-200 mb-4",children:[(0,t.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,t.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,t.jsx)("div",{className:"flex flex-col gap-4 py-4",children:"import"===Y?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"grid gap-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"CSV File"}),(0,t.jsx)("input",{type:"file",accept:".csv",onChange:ew,className:"border rounded px-3 py-2 w-full"}),(0,t.jsxs)("p",{className:"text-xs text-gray-500",children:["CSV should have columns: username, password, role",(0,t.jsx)("br",{}),"Supports both plain text passwords and exported password hashes."]})]}),K&&(0,t.jsx)("div",{className:"p-3 bg-green-50 border border-green-200 rounded text-green-700 text-sm",children:K.message})]}):(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)("div",{className:"grid gap-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"Export Users to CSV"}),(0,t.jsx)("p",{className:"text-xs text-gray-500",children:"Download all users as a CSV file with password hashes."}),(0,t.jsxs)("div",{className:"p-3 bg-amber-50 border border-amber-200 rounded",children:[(0,t.jsx)("p",{className:"text-sm text-amber-700",children:"⚠️ This will export all users with columns: username, password (hashed), role"}),(0,t.jsx)("p",{className:"text-xs text-amber-600 mt-1",children:"Password hashes can be imported directly for system backups."})]})]})})}),(0,t.jsxs)(F.cN,{children:[(0,t.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:()=>A(!1),disabled:B,children:"Cancel"}),"import"===Y?(0,t.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||!q,children:B?"Importing...":"Import"}):(0,t.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 U.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(),r=s.csv_content,t=new Blob([r],{type:"text/csv;charset=utf-8;"}),a=URL.createObjectURL(t),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,t.jsx)(w.Z,{className:"h-4 w-4 mr-1"}),"Export"]})]})]})}),(0,t.jsx)(F.Vq,{open:X,onOpenChange:eE,children:(0,t.jsxs)(F.cZ,{className:"sm:max-w-md",children:[(0,t.jsxs)(F.fK,{children:[(0,t.jsx)(F.$N,{children:"Reset Password"}),(0,t.jsxs)(F.Be,{children:["Enter a new password for"," ",(null==W?void 0:W.usernameDisplay)||"this user","."]})]}),(0,t.jsx)("div",{className:"flex flex-col gap-4 py-4",children:(0,t.jsxs)("div",{className:"grid gap-2",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-gray-700",children:"New Password"}),(0,t.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,t.jsx)(_.X,{error:et,title:"Reset Failed",onDismiss:()=>ea(null)}),(0,t.jsxs)(F.cN,{children:[(0,t.jsx)(d.z,{variant:"outline",onClick:eE,disabled:es,children:"Cancel"}),(0,t.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,t.jsx)(F.Vq,{open:en,onOpenChange:eS,children:(0,t.jsxs)(F.cZ,{className:"sm:max-w-md",children:[(0,t.jsxs)(F.fK,{children:[(0,t.jsx)(F.$N,{children:"Delete User"}),(0,t.jsxs)(F.Be,{children:['Are you sure you want to delete user "',(null==ei?void 0:ei.usernameDisplay)||"this user",'"? This action cannot be undone.']})]}),(0,t.jsx)(_.X,{error:ec,title:"Deletion Failed",onDismiss:()=>ed(null)}),(0,t.jsxs)(F.cN,{children:[(0,t.jsx)(d.z,{variant:"outline",onClick:eS,disabled:eu,children:"Cancel"}),(0,t.jsx)(d.z,{variant:"destructive",onClick:eD,disabled:eu,children:eu?"Deleting...":"Delete"})]})]})})]})}function P(e){let{refreshInterval:s,setLoading:r,refreshDataRef:n,checkPermissionAndAct:l,roleLoading:o,onResetPassword:d,onDeleteUser:g,basicAuthEnabled:j,currentUserRole:y,currentUserId:v}=e,[N,w]=(0,a.useState)([]),[E,F]=(0,a.useState)(!0),[_,z]=(0,a.useState)(!1),[T,V]=(0,a.useState)({key:"username",direction:"ascending"}),[P,A]=(0,a.useState)(null),[q,M]=(0,a.useState)(""),B=(0,a.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];r&&e&&r(!0),e&&F(!0);try{let s=await h.default.get(m.R),t=(s||[]).map(e=>({...e,usernameDisplay:L(e.username,e.userId),fullEmailID:Z(e.username,e.userId),clusterCount:-1,jobCount:-1}));w(t),z(!0),r&&e&&r(!1),e&&F(!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),r=(l||[]).filter(s=>s.user_hash===e.userId);return{...e,usernameDisplay:L(e.username,e.userId),fullEmailID:Z(e.username,e.userId),clusterCount:s.length,jobCount:r.length}});w(i)}catch(s){console.error("Failed to fetch or process user data:",s),w([]),z(!0),r&&e&&r(!1),e&&F(!1)}},[r]);(0,a.useEffect)(()=>{n&&(n.current=()=>B(!0))},[n,B]),(0,a.useEffect)(()=>{(async()=>{z(!1),F(!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]),K=e=>{let s="ascending";T.key===e&&"ascending"===T.direction&&(s="descending"),V({key:e,direction:s})},H=e=>T.key===e?"ascending"===T.direction?" ↑":" ↓":"",Y=async(e,s)=>{await l("cannot edit user role",()=>{A(e),M(s)})},$=()=>{A(null),M("")},X=async e=>{if(!e||!q){console.error("User ID or role is missing."),alert("Error: User ID or role is missing.");return}F(!0);try{let s=await U.x.post("/users/update",{user_id:e,role:q});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{F(!1)}};return E&&0===N.length&&!_?(0,t.jsx)("div",{className:"flex justify-center items-center h-64",children:(0,t.jsx)(i.Z,{})}):_?O&&0!==O.length?(0,t.jsx)(I.Zb,{children:(0,t.jsxs)(u.iA,{children:[(0,t.jsx)(u.xD,{children:(0,t.jsxs)(u.SC,{children:[(0,t.jsxs)(u.ss,{onClick:()=>K("usernameDisplay"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Name",H("usernameDisplay")]}),(0,t.jsxs)(u.ss,{onClick:()=>K("fullEmailID"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["User ID",H("fullEmailID")]}),(0,t.jsxs)(u.ss,{onClick:()=>K("role"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Role",H("role")]}),(0,t.jsxs)(u.ss,{onClick:()=>K("clusterCount"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Clusters",H("clusterCount")]}),(0,t.jsxs)(u.ss,{onClick:()=>K("jobCount"),className:"sortable whitespace-nowrap cursor-pointer hover:bg-gray-50 w-1/5",children:["Jobs",H("jobCount")]}),j&&(0,t.jsx)(u.ss,{className:"whitespace-nowrap w-1/6",children:"Actions"})]})}),(0,t.jsx)(u.RM,{children:O.map(e=>(0,t.jsxs)(u.SC,{children:[(0,t.jsx)(u.pj,{className:"truncate",title:e.username,children:e.usernameDisplay}),(0,t.jsx)(u.pj,{className:"truncate",title:e.fullEmailID,children:e.fullEmailID}),(0,t.jsx)(u.pj,{className:"truncate",title:e.role,children:(0,t.jsx)("div",{className:"flex items-center gap-2",children:P===e.userId?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("select",{value:q,onChange:e=>M(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,t.jsx)("option",{value:"admin",children:"Admin"}),(0,t.jsx)("option",{value:"user",children:"User"})]}),(0,t.jsx)("button",{onClick:()=>X(e.userId),className:"text-green-600 hover:text-green-800 p-1",title:"Save",children:(0,t.jsx)(k.Z,{className:"h-4 w-4"})}),(0,t.jsx)("button",{onClick:$,className:"text-gray-500 hover:text-gray-700 p-1",title:"Cancel",children:(0,t.jsx)(C.Z,{className:"h-4 w-4"})})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"capitalize",children:e.role}),"admin"===y&&(0,t.jsx)("button",{onClick:()=>Y(e.userId,e.role),className:"text-sky-blue hover:text-sky-blue-bright p-1",title:"Edit role",children:(0,t.jsx)(R.Z,{className:"h-3 w-3"})})]})})}),(0,t.jsx)(u.pj,{children:-1===e.clusterCount?(0,t.jsxs)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-400 rounded text-xs font-medium flex items-center",children:[(0,t.jsx)(i.Z,{size:10,className:"mr-1"}),"Loading..."]}):(0,t.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,t.jsx)(u.pj,{children:-1===e.jobCount?(0,t.jsxs)("span",{className:"px-2 py-0.5 bg-gray-100 text-gray-400 rounded text-xs font-medium flex items-center",children:[(0,t.jsx)(i.Z,{size:10,className:"mr-1"}),"Loading..."]}):(0,t.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})}),j&&(0,t.jsx)(u.pj,{className:"relative",children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("button",{onClick:"admin"===y||e.userId===v?async()=>{d(e)}:void 0,className:"admin"===y||e.userId===v?"text-sky-blue hover:text-sky-blue-bright p-1":"text-gray-300 cursor-not-allowed p-1",title:"admin"===y||e.userId===v?"Reset Password":"You can only reset your own password",disabled:"admin"!==y&&e.userId!==v,children:(0,t.jsx)(D.Z,{className:"h-4 w-4"})}),"admin"===y&&(0,t.jsx)("button",{onClick:()=>g(e),className:"text-sky-blue hover:text-red-500 p-1",title:"Delete User",children:(0,t.jsx)(S.Z,{className:"h-4 w-4"})})]})})]},e.userId))})]})}):(0,t.jsxs)("div",{className:"text-center py-12",children:[(0,t.jsx)("p",{className:"text-lg font-semibold text-gray-500",children:"No users found."}),(0,t.jsx)("p",{className:"text-sm text-gray-400 mt-1",children:"There are currently no users to display."})]}):(0,t.jsxs)("div",{className:"flex justify-center items-center h-64",children:[(0,t.jsx)(i.Z,{}),(0,t.jsx)("span",{className:"ml-2 text-gray-500",children:"Loading users..."})]})}P.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,r){function t(e){return e.startsWith("sky-jobs-controller-")}function a(e,s,r){return null===s?e:[...e].sort((e,t)=>e[s]<t[s]?"ascending"===r?-1:1:e[s]>t[s]?"ascending"===r?1:-1:0)}r.d(s,{R0:function(){return a},Ym:function(){return t}})}}]);
@@ -0,0 +1,50 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[984],{6826:function(e,n,t){t.d(n,{Z:function(){return r}});/**
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 r=(0,t(998).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"}]])},3685:function(e,n,t){t.d(n,{Z:function(){return r}});/**
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 r=(0,t(998).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"}]])},6741:function(e,n,t){t.d(n,{Z:function(){return r}});/**
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 r=(0,t(998).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"}]])},3936:function(e,n,t){t.d(n,{Z:function(){return r}});/**
17
+ * @license lucide-react v0.407.0 - ISC
18
+ *
19
+ * This source code is licensed under the ISC license.
20
+ * See the LICENSE file in the root directory of this source tree.
21
+ */let r=(0,t(998).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"}]])},5274:function(e,n,t){t.d(n,{Z:function(){return r}});/**
22
+ * @license lucide-react v0.407.0 - ISC
23
+ *
24
+ * This source code is licensed under the ISC license.
25
+ * See the LICENSE file in the root directory of this source tree.
26
+ */let r=(0,t(998).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"}]])},3626:function(e,n,t){t.d(n,{Z:function(){return r}});/**
27
+ * @license lucide-react v0.407.0 - ISC
28
+ *
29
+ * This source code is licensed under the ISC license.
30
+ * See the LICENSE file in the root directory of this source tree.
31
+ */let r=(0,t(998).Z)("RotateCw",[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]])},7603:function(e,n,t){t.d(n,{Z:function(){return r}});/**
32
+ * @license lucide-react v0.407.0 - ISC
33
+ *
34
+ * This source code is licensed under the ISC license.
35
+ * See the LICENSE file in the root directory of this source tree.
36
+ */let r=(0,t(998).Z)("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]])},1109:function(e,n,t){t.d(n,{Z:function(){return r}});/**
37
+ * @license lucide-react v0.407.0 - ISC
38
+ *
39
+ * This source code is licensed under the ISC license.
40
+ * See the LICENSE file in the root directory of this source tree.
41
+ */let r=(0,t(998).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"}]])},3767:function(e,n,t){t.d(n,{Z:function(){return r}});/**
42
+ * @license lucide-react v0.407.0 - ISC
43
+ *
44
+ * This source code is licensed under the ISC license.
45
+ * See the LICENSE file in the root directory of this source tree.
46
+ */let r=(0,t(998).Z)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},6327:function(e,n,t){t.d(n,{x8:function(){return el},VY:function(){return eo},dk:function(){return ea},aV:function(){return er},h_:function(){return et},fC:function(){return ee},Dx:function(){return ei},xz:function(){return en}});var r=t(7294),o=t(6206),i=t(8771),a=t(5360),l=t(1276),u=t(7342),s=t(6063),d=t(5420),c=t(2651),f=t(9981),p=e=>{let n,t;let{present:o,children:a}=e,l=function(e){var n,t;let[o,i]=r.useState(),a=r.useRef(null),l=r.useRef(e),u=r.useRef("none"),[s,d]=(n=e?"mounted":"unmounted",t={mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}},r.useReducer((e,n)=>t[e][n]??e,n));return r.useEffect(()=>{let e=y(a.current);u.current="mounted"===s?e:"none"},[s]),(0,f.b)(()=>{let n=a.current,t=l.current;if(t!==e){let r=u.current,o=y(n);e?d("MOUNT"):"none"===o||n?.display==="none"?d("UNMOUNT"):t&&r!==o?d("ANIMATION_OUT"):d("UNMOUNT"),l.current=e}},[e,d]),(0,f.b)(()=>{if(o){let e;let n=o.ownerDocument.defaultView??window,t=t=>{let r=y(a.current).includes(t.animationName);if(t.target===o&&r&&(d("ANIMATION_END"),!l.current)){let t=o.style.animationFillMode;o.style.animationFillMode="forwards",e=n.setTimeout(()=>{"forwards"===o.style.animationFillMode&&(o.style.animationFillMode=t)})}},r=e=>{e.target===o&&(u.current=y(a.current))};return o.addEventListener("animationstart",r),o.addEventListener("animationcancel",t),o.addEventListener("animationend",t),()=>{n.clearTimeout(e),o.removeEventListener("animationstart",r),o.removeEventListener("animationcancel",t),o.removeEventListener("animationend",t)}}d("ANIMATION_END")},[o,d]),{isPresent:["mounted","unmountSuspended"].includes(s),ref:r.useCallback(e=>{a.current=e?getComputedStyle(e):null,i(e)},[])}}(o),u="function"==typeof a?a({present:l.isPresent}):r.Children.only(a),s=(0,i.e)(l.ref,(n=Object.getOwnPropertyDescriptor(u.props,"ref")?.get)&&"isReactWarning"in n&&n.isReactWarning?u.ref:(n=Object.getOwnPropertyDescriptor(u,"ref")?.get)&&"isReactWarning"in n&&n.isReactWarning?u.props.ref:u.props.ref||u.ref);return"function"==typeof a||l.isPresent?r.cloneElement(u,{ref:s}):null};function y(e){return e?.animationName||"none"}p.displayName="Presence";var m=t(5320),v=t(7552),g=t(6223),h=t(3541),N=t(8426),x=t(5893),M="Dialog",[k,D]=(0,a.b)(M),[O,b]=k(M),j=e=>{let{__scopeDialog:n,children:t,open:o,defaultOpen:i,onOpenChange:a,modal:s=!0}=e,d=r.useRef(null),c=r.useRef(null),[f,p]=(0,u.T)({prop:o,defaultProp:i??!1,onChange:a,caller:M});return(0,x.jsx)(O,{scope:n,triggerRef:d,contentRef:c,contentId:(0,l.M)(),titleId:(0,l.M)(),descriptionId:(0,l.M)(),open:f,onOpenChange:p,onOpenToggle:r.useCallback(()=>p(e=>!e),[p]),modal:s,children:t})};j.displayName=M;var w="DialogTrigger",R=r.forwardRef((e,n)=>{let{__scopeDialog:t,...r}=e,a=b(w,t),l=(0,i.e)(n,a.triggerRef);return(0,x.jsx)(m.WV.button,{type:"button","aria-haspopup":"dialog","aria-expanded":a.open,"aria-controls":a.contentId,"data-state":K(a.open),...r,ref:l,onClick:(0,o.M)(e.onClick,a.onOpenToggle)})});R.displayName=w;var I="DialogPortal",[E,C]=k(I,{forceMount:void 0}),A=e=>{let{__scopeDialog:n,forceMount:t,children:o,container:i}=e,a=b(I,n);return(0,x.jsx)(E,{scope:n,forceMount:t,children:r.Children.map(o,e=>(0,x.jsx)(p,{present:t||a.open,children:(0,x.jsx)(c.h,{asChild:!0,container:i,children:e})}))})};A.displayName=I;var T="DialogOverlay",Z=r.forwardRef((e,n)=>{let t=C(T,e.__scopeDialog),{forceMount:r=t.forceMount,...o}=e,i=b(T,e.__scopeDialog);return i.modal?(0,x.jsx)(p,{present:r||i.open,children:(0,x.jsx)(F,{...o,ref:n})}):null});Z.displayName=T;var _=(0,N.Z8)("DialogOverlay.RemoveScroll"),F=r.forwardRef((e,n)=>{let{__scopeDialog:t,...r}=e,o=b(T,t);return(0,x.jsx)(g.Z,{as:_,allowPinchZoom:!0,shards:[o.contentRef],children:(0,x.jsx)(m.WV.div,{"data-state":K(o.open),...r,ref:n,style:{pointerEvents:"auto",...r.style}})})}),P="DialogContent",W=r.forwardRef((e,n)=>{let t=C(P,e.__scopeDialog),{forceMount:r=t.forceMount,...o}=e,i=b(P,e.__scopeDialog);return(0,x.jsx)(p,{present:r||i.open,children:i.modal?(0,x.jsx)(U,{...o,ref:n}):(0,x.jsx)(V,{...o,ref:n})})});W.displayName=P;var U=r.forwardRef((e,n)=>{let t=b(P,e.__scopeDialog),a=r.useRef(null),l=(0,i.e)(n,t.contentRef,a);return r.useEffect(()=>{let e=a.current;if(e)return(0,h.Ry)(e)},[]),(0,x.jsx)(L,{...e,ref:l,trapFocus:t.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:(0,o.M)(e.onCloseAutoFocus,e=>{e.preventDefault(),t.triggerRef.current?.focus()}),onPointerDownOutside:(0,o.M)(e.onPointerDownOutside,e=>{let n=e.detail.originalEvent,t=0===n.button&&!0===n.ctrlKey;(2===n.button||t)&&e.preventDefault()}),onFocusOutside:(0,o.M)(e.onFocusOutside,e=>e.preventDefault())})}),V=r.forwardRef((e,n)=>{let t=b(P,e.__scopeDialog),o=r.useRef(!1),i=r.useRef(!1);return(0,x.jsx)(L,{...e,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:n=>{e.onCloseAutoFocus?.(n),n.defaultPrevented||(o.current||t.triggerRef.current?.focus(),n.preventDefault()),o.current=!1,i.current=!1},onInteractOutside:n=>{e.onInteractOutside?.(n),n.defaultPrevented||(o.current=!0,"pointerdown"!==n.detail.originalEvent.type||(i.current=!0));let r=n.target;t.triggerRef.current?.contains(r)&&n.preventDefault(),"focusin"===n.detail.originalEvent.type&&i.current&&n.preventDefault()}})}),L=r.forwardRef((e,n)=>{let{__scopeDialog:t,trapFocus:o,onOpenAutoFocus:a,onCloseAutoFocus:l,...u}=e,c=b(P,t),f=r.useRef(null),p=(0,i.e)(n,f);return(0,v.EW)(),(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(d.M,{asChild:!0,loop:!0,trapped:o,onMountAutoFocus:a,onUnmountAutoFocus:l,children:(0,x.jsx)(s.XB,{role:"dialog",id:c.contentId,"aria-describedby":c.descriptionId,"aria-labelledby":c.titleId,"data-state":K(c.open),...u,ref:p,onDismiss:()=>c.onOpenChange(!1)})}),(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(J,{titleId:c.titleId}),(0,x.jsx)(Q,{contentRef:f,descriptionId:c.descriptionId})]})]})}),S="DialogTitle",$=r.forwardRef((e,n)=>{let{__scopeDialog:t,...r}=e,o=b(S,t);return(0,x.jsx)(m.WV.h2,{id:o.titleId,...r,ref:n})});$.displayName=S;var z="DialogDescription",q=r.forwardRef((e,n)=>{let{__scopeDialog:t,...r}=e,o=b(z,t);return(0,x.jsx)(m.WV.p,{id:o.descriptionId,...r,ref:n})});q.displayName=z;var H="DialogClose",B=r.forwardRef((e,n)=>{let{__scopeDialog:t,...r}=e,i=b(H,t);return(0,x.jsx)(m.WV.button,{type:"button",...r,ref:n,onClick:(0,o.M)(e.onClick,()=>i.onOpenChange(!1))})});function K(e){return e?"open":"closed"}B.displayName=H;var X="DialogTitleWarning",[Y,G]=(0,a.k)(X,{contentName:P,titleName:S,docsSlug:"dialog"}),J=({titleId:e})=>{let n=G(X),t=`\`${n.contentName}\` requires a \`${n.titleName}\` for the component to be accessible for screen reader users.
47
+
48
+ If you want to hide the \`${n.titleName}\`, you can wrap it with our VisuallyHidden component.
49
+
50
+ For more information, see https://radix-ui.com/primitives/docs/components/${n.docsSlug}`;return r.useEffect(()=>{e&&!document.getElementById(e)&&console.error(t)},[t,e]),null},Q=({contentRef:e,descriptionId:n})=>{let t=G("DialogDescriptionWarning"),o=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${t.contentName}}.`;return r.useEffect(()=>{let t=e.current?.getAttribute("aria-describedby");n&&t&&!document.getElementById(n)&&console.warn(o)},[o,e,n]),null},ee=j,en=R,et=A,er=Z,eo=W,ei=$,ea=q,el=B},2003:function(e,n,t){t.d(n,{j:function(){return a}});var r=t(512);let o=e=>"boolean"==typeof e?`${e}`:0===e?"0":e,i=r.W,a=(e,n)=>t=>{var r;if((null==n?void 0:n.variants)==null)return i(e,null==t?void 0:t.class,null==t?void 0:t.className);let{variants:a,defaultVariants:l}=n,u=Object.keys(a).map(e=>{let n=null==t?void 0:t[e],r=null==l?void 0:l[e];if(null===n)return null;let i=o(n)||o(r);return a[e][i]}),s=t&&Object.entries(t).reduce((e,n)=>{let[t,r]=n;return void 0===r||(e[t]=r),e},{});return i(e,u,null==n?void 0:null===(r=n.compoundVariants)||void 0===r?void 0:r.reduce((e,n)=>{let{class:t,className:r,...o}=n;return Object.entries(o).every(e=>{let[n,t]=e;return Array.isArray(t)?t.includes({...l,...s}[n]):({...l,...s})[n]===t})?[...e,t,r]:e},[]),null==t?void 0:t.class,null==t?void 0:t.className)}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[892],{7476:function(e,n,r){(window.__NEXT_P=window.__NEXT_P||[]).push(["/users",function(){return r(5126)}])},5126:function(e,n,r){"use strict";r.r(n),r.d(n,{default:function(){return o}});var t=r(5893);r(7294);var s=r(9008),u=r.n(s),i=r(5152);let c=r.n(i)()(()=>Promise.all([r.e(616),r.e(760),r.e(799),r.e(804),r.e(664),r.e(984),r.e(470),r.e(901),r.e(969),r.e(856),r.e(641)]).then(r.bind(r,2641)).then(e=>e.Users),{loadableGenerated:{webpack:()=>[2641]},ssr:!1});function o(){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u(),{children:(0,t.jsx)("title",{children:"Users | SkyPilot Dashboard"})}),(0,t.jsx)(c,{})]})}},9008:function(e,n,r){e.exports=r(7219)}},function(e){e.O(0,[888,774,179],function(){return e(e.s=7476)}),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ !function(){"use strict";var e,t,n,r,c,o,u,a,i,f={},s={};function d(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}},r=!0;try{f[e](n,n.exports,d),r=!1}finally{r&&delete s[e]}return n.exports}d.m=f,e=[],d.O=function(t,n,r,c){if(n){c=c||0;for(var o=e.length;o>0&&e[o-1][2]>c;o--)e[o]=e[o-1];e[o]=[n,r,c];return}for(var u=1/0,o=0;o<e.length;o++){for(var n=e[o][0],r=e[o][1],c=e[o][2],a=!0,i=0;i<n.length;i++)u>=c&&Object.keys(d.O).every(function(e){return d.O[e](n[i])})?n.splice(i--,1):(a=!1,c<u&&(u=c));if(a){e.splice(o--,1);var f=r();void 0!==f&&(t=f)}}return t},d.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var c=Object.create(null);d.r(c);var o={};t=t||[null,n({}),n([]),n(n)];for(var u=2&r&&e;"object"==typeof u&&!~t.indexOf(u);u=n(u))Object.getOwnPropertyNames(u).forEach(function(t){o[t]=function(){return e[t]}});return o.default=function(){return e},d.d(c,o),c},d.d=function(e,t){for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce(function(t,n){return d.f[n](e,t),t},[]))},d.u=function(e){return 350===e?"static/chunks/350.9e123a4551f68b0d.js":491===e?"static/chunks/491.b3d264269613fe09.js":937===e?"static/chunks/937.3759f538f11a0953.js":42===e?"static/chunks/42.d39e24467181b06b.js":682===e?"static/chunks/682.4dd5dc116f740b5f.js":211===e?"static/chunks/211.692afc57e812ae1a.js":984===e?"static/chunks/984.ae8c08791d274ca0.js":641===e?"static/chunks/641.c8e452bc5070a630.js":443===e?"static/chunks/443.b2242d0efcdf5f47.js":513===e?"static/chunks/513.211357a2914a34b2.js":"static/chunks/"+e+"-"+({37:"3a4d77ad62932eaf",470:"4d1a5dbe58a8a2b9",616:"d6128fa9e7cae6e6",664:"047bc03493fda379",760:"a89d354797ce7af5",798:"c0525dc3f21e488d",799:"3625946b2ec2eb30",804:"4c9fc53aa74bc191",843:"b3040e493f6e7947",856:"c2c39c0912285e54",901:"b424d293275e1fd7",938:"1493ac755eadeb35",947:"6620842ef80ae879",969:"20d54a9d998dc102",973:"db3c97c2bfbceb65"})[e]+".js"},d.miniCssF=function(e){},d.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},c="_N_E:",d.l=function(e,t,n,o){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,a,i=document.getElementsByTagName("script"),f=0;f<i.length;f++){var s=i[f];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==c+n){u=s;break}}u||(a=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,d.nc&&u.setAttribute("nonce",d.nc),u.setAttribute("data-webpack",c+n),u.src=d.tu(e)),r[e]=[t];var l=function(t,n){u.onerror=u.onload=null,clearTimeout(b);var c=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),c&&c.forEach(function(e){return e(n)}),t)return t(n)},b=setTimeout(l.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=l.bind(null,u.onerror),u.onload=l.bind(null,u.onload),a&&document.head.appendChild(u)},d.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.tt=function(){return void 0===o&&(o={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(o=trustedTypes.createPolicy("nextjs#bundler",o))),o},d.tu=function(e){return d.tt().createScriptURL(e)},d.p="/dashboard/_next/",u={272:0},d.f.j=function(e,t){var n=d.o(u,e)?u[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(272!=e){var r=new Promise(function(t,r){n=u[e]=[t,r]});t.push(n[2]=r);var c=d.p+d.u(e),o=Error();d.l(c,function(t){if(d.o(u,e)&&(0!==(n=u[e])&&(u[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;o.message="Loading chunk "+e+" failed.\n("+r+": "+c+")",o.name="ChunkLoadError",o.type=r,o.request=c,n[1](o)}},"chunk-"+e,e)}else u[e]=0}},d.O.j=function(e){return 0===u[e]},a=function(e,t){var n,r,c=t[0],o=t[1],a=t[2],i=0;if(c.some(function(e){return 0!==u[e]})){for(n in o)d.o(o,n)&&(d.m[n]=o[n]);if(a)var f=a(d)}for(e&&e(t);i<c.length;i++)r=c[i],d.o(u,r)&&u[r]&&u[r][0](),u[r]=0;return d.O(f)},(i=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(a.bind(null,0)),i.push=a.bind(null,i.push.bind(i)),d.nc=void 0}();