zenml-nightly 0.70.0.dev20241204__py3-none-any.whl → 0.70.0.dev20241205__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. zenml/VERSION +1 -1
  2. zenml/config/server_config.py +4 -0
  3. zenml/constants.py +10 -0
  4. zenml/orchestrators/utils.py +55 -27
  5. zenml/zen_server/auth.py +7 -2
  6. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  7. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  8. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  9. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  10. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  11. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  12. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  13. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  14. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  15. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  16. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  17. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  18. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  19. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  20. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  21. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  22. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  23. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  24. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  25. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  26. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  27. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  28. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  29. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  30. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  31. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  32. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  33. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  34. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  35. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  36. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  37. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  40. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  41. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  42. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  43. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  44. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  45. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  47. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  48. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  49. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  50. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  51. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  52. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  53. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  54. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  55. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  56. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  57. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  58. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  60. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  61. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  62. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  63. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  64. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  65. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  67. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  68. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  69. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  74. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  75. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  76. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  77. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  78. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  81. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  82. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  84. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  85. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  86. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  88. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  89. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  92. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  93. zenml/zen_server/dashboard/index.html +4 -4
  94. zenml/zen_server/routers/auth_endpoints.py +20 -2
  95. zenml/zen_server/routers/steps_endpoints.py +7 -1
  96. zenml/zen_server/template_execution/utils.py +3 -1
  97. zenml/zen_stores/rest_zen_store.py +8 -3
  98. zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
  99. zenml/zen_stores/sql_zen_store.py +5 -1
  100. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/METADATA +1 -1
  101. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/RECORD +104 -96
  102. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  103. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  104. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  105. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  106. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  107. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  108. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  109. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  110. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  111. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  112. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  113. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  114. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  115. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  116. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/LICENSE +0 -0
  117. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/WHEEL +0 -0
  118. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/entry_points.txt +0 -0
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.70.0.dev20241204
1
+ 0.70.0.dev20241205
@@ -27,6 +27,7 @@ from zenml.constants import (
27
27
  DEFAULT_ZENML_SERVER_DEVICE_AUTH_POLLING,
28
28
  DEFAULT_ZENML_SERVER_DEVICE_AUTH_TIMEOUT,
29
29
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME,
30
+ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME,
30
31
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY,
31
32
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE,
32
33
  DEFAULT_ZENML_SERVER_MAX_DEVICE_AUTH_ATTEMPTS,
@@ -269,6 +270,9 @@ class ServerConfiguration(BaseModel):
269
270
  generic_api_token_lifetime: PositiveInt = (
270
271
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME
271
272
  )
273
+ generic_api_token_max_lifetime: PositiveInt = (
274
+ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME
275
+ )
272
276
 
273
277
  external_login_url: Optional[str] = None
274
278
  external_user_info_url: Optional[str] = None
zenml/constants.py CHANGED
@@ -170,6 +170,9 @@ ENV_ZENML_DISABLE_STEP_LOGS_STORAGE = "ZENML_DISABLE_STEP_LOGS_STORAGE"
170
170
  ENV_ZENML_IGNORE_FAILURE_HOOK = "ZENML_IGNORE_FAILURE_HOOK"
171
171
  ENV_ZENML_CUSTOM_SOURCE_ROOT = "ZENML_CUSTOM_SOURCE_ROOT"
172
172
  ENV_ZENML_WHEEL_PACKAGE_NAME = "ZENML_WHEEL_PACKAGE_NAME"
173
+ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
174
+ "ZENML_PIPELINE_API_TOKEN_EXPIRATION"
175
+ )
173
176
 
174
177
  # ZenML Server environment variables
175
178
  ENV_ZENML_SERVER_PREFIX = "ZENML_SERVER_"
@@ -268,6 +271,9 @@ DEFAULT_ZENML_SERVER_PIPELINE_RUN_AUTH_WINDOW = 60 * 48 # 48 hours
268
271
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE = 5
269
272
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY = 1000
270
273
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME = 60 * 60 # 1 hour
274
+ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME = (
275
+ 60 * 60 * 24 * 7
276
+ ) # 7 days
271
277
 
272
278
  DEFAULT_ZENML_SERVER_SECURE_HEADERS_HSTS = (
273
279
  "max-age=63072000; includeSubdomains"
@@ -466,3 +472,7 @@ BANNED_NAME_CHARACTERS = "\t\n\r\v\f"
466
472
 
467
473
 
468
474
  STACK_DEPLOYMENT_API_TOKEN_EXPIRATION = 60 * 6 # 6 hours
475
+
476
+ ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = handle_int_env_var(
477
+ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION, default=0
478
+ )
@@ -26,10 +26,12 @@ from zenml.constants import (
26
26
  ENV_ZENML_ACTIVE_STACK_ID,
27
27
  ENV_ZENML_ACTIVE_WORKSPACE_ID,
28
28
  ENV_ZENML_DISABLE_CREDENTIALS_DISK_CACHING,
29
+ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
29
30
  ENV_ZENML_SERVER,
30
31
  ENV_ZENML_STORE_PREFIX,
32
+ ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
31
33
  )
32
- from zenml.enums import AuthScheme, StackComponentType, StoreType
34
+ from zenml.enums import APITokenType, AuthScheme, StackComponentType, StoreType
33
35
  from zenml.logger import get_logger
34
36
  from zenml.stack import StackComponent
35
37
 
@@ -137,37 +139,63 @@ def get_config_environment_vars(
137
139
  url = global_config.store_configuration.url
138
140
  api_token = credentials_store.get_token(url, allow_expired=False)
139
141
  if schedule_id or pipeline_run_id or step_run_id:
140
- # When connected to an authenticated ZenML server, if a schedule ID,
141
- # pipeline run ID or step run ID is supplied, we need to fetch a new
142
- # workload API token scoped to the schedule, pipeline run or step
143
- # run.
144
142
  assert isinstance(global_config.zen_store, RestZenStore)
145
143
 
146
- # If only a schedule is given, the pipeline run credentials will
147
- # be valid for the entire duration of the schedule.
148
- api_key = credentials_store.get_api_key(url)
149
- if not api_key and not pipeline_run_id and not step_run_id:
144
+ # The user has the option to manually set an expiration for the API
145
+ # token generated for a pipeline run. In this case, we generate a new
146
+ # generic API token that will be valid for the indicated duration.
147
+ if (
148
+ pipeline_run_id
149
+ and ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION != 0
150
+ ):
150
151
  logger.warning(
151
- "An API token without an expiration time will be generated "
152
- "and used to run this pipeline on a schedule. This is very "
153
- "insecure because the API token will be valid for the "
154
- "entire lifetime of the schedule and can be used to access "
155
- "your user account if accidentally leaked. When deploying "
156
- "a pipeline on a schedule, it is strongly advised to use a "
157
- "service account API key to authenticate to the ZenML "
158
- "server instead of your regular user account. For more "
159
- "information, see "
160
- "https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
152
+ f"An unscoped API token will be generated for this pipeline "
153
+ f"run that will expire after "
154
+ f"{ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION} "
155
+ f"seconds instead of being scoped to the pipeline run "
156
+ f"and not having an expiration time. This is more insecure "
157
+ f"because the API token will remain valid even after the "
158
+ f"pipeline run completes its execution. This option has "
159
+ "been explicitly enabled by setting the "
160
+ f"{ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION} environment "
161
+ f"variable"
162
+ )
163
+ new_api_token = global_config.zen_store.get_api_token(
164
+ token_type=APITokenType.GENERIC,
165
+ expires_in=ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
161
166
  )
162
167
 
163
- # The schedule, pipeline run or step run credentials are scoped to
164
- # the schedule, pipeline run or step run and will only be valid for
165
- # the duration of the schedule/pipeline run/step run.
166
- new_api_token = global_config.zen_store.get_api_token(
167
- schedule_id=schedule_id,
168
- pipeline_run_id=pipeline_run_id,
169
- step_run_id=step_run_id,
170
- )
168
+ else:
169
+ # If a schedule ID, pipeline run ID or step run ID is supplied,
170
+ # we need to fetch a new workload API token scoped to the
171
+ # schedule, pipeline run or step run.
172
+
173
+ # If only a schedule is given, the pipeline run credentials will
174
+ # be valid for the entire duration of the schedule.
175
+ api_key = credentials_store.get_api_key(url)
176
+ if not api_key and not pipeline_run_id and not step_run_id:
177
+ logger.warning(
178
+ "An API token without an expiration time will be generated "
179
+ "and used to run this pipeline on a schedule. This is very "
180
+ "insecure because the API token will be valid for the "
181
+ "entire lifetime of the schedule and can be used to access "
182
+ "your user account if accidentally leaked. When deploying "
183
+ "a pipeline on a schedule, it is strongly advised to use a "
184
+ "service account API key to authenticate to the ZenML "
185
+ "server instead of your regular user account. For more "
186
+ "information, see "
187
+ "https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
188
+ )
189
+
190
+ # The schedule, pipeline run or step run credentials are scoped to
191
+ # the schedule, pipeline run or step run and will only be valid for
192
+ # the duration of the schedule/pipeline run/step run.
193
+ new_api_token = global_config.zen_store.get_api_token(
194
+ token_type=APITokenType.WORKLOAD,
195
+ schedule_id=schedule_id,
196
+ pipeline_run_id=pipeline_run_id,
197
+ step_run_id=step_run_id,
198
+ )
171
199
 
172
200
  environment_vars[ENV_ZENML_STORE_PREFIX + "API_TOKEN"] = (
173
201
  new_api_token
zenml/zen_server/auth.py CHANGED
@@ -821,7 +821,10 @@ def generate_access_token(
821
821
  response: The FastAPI response object.
822
822
  device: The device used for authentication.
823
823
  api_key: The service account API key used for authentication.
824
- expires_in: The number of seconds until the token expires.
824
+ expires_in: The number of seconds until the token expires. If not set,
825
+ the default value is determined automatically based on the server
826
+ configuration and type of token. If set to 0, the token will not
827
+ expire.
825
828
  schedule_id: The ID of the schedule to scope the token to.
826
829
  pipeline_run_id: The ID of the pipeline run to scope the token to.
827
830
  step_run_id: The ID of the step run to scope the token to.
@@ -835,7 +838,9 @@ def generate_access_token(
835
838
  # according to the values configured in the server config. Device tokens are
836
839
  # handled separately from regular user tokens.
837
840
  expires: Optional[datetime] = None
838
- if expires_in:
841
+ if expires_in == 0:
842
+ expires_in = None
843
+ elif expires_in is not None:
839
844
  expires = datetime.utcnow() + timedelta(seconds=expires_in)
840
845
  elif device:
841
846
  # If a device was used for authentication, the token will expire
@@ -1 +1 @@
1
- import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-CCOPpudF.js";import{E as r}from"./EmptyState-BzdlCwp3.js";import{S as a}from"./help-Cc9bBIJH.js";import{L as o}from"./@react-router-B3Z5rLr2.js";import"./@tanstack-DT5WLu9C.js";import"./@reactflow-CK0KJUen.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
1
+ import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-FO-p0GU7.js";import{E as r}from"./EmptyState-BzdlCwp3.js";import{S as a}from"./help-Cc9bBIJH.js";import{L as o}from"./@react-router-B3Z5rLr2.js";import"./@tanstack-DT5WLu9C.js";import"./@reactflow-D2Y7BWwz.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};