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.
- zenml/VERSION +1 -1
- zenml/config/server_config.py +4 -0
- zenml/constants.py +10 -0
- zenml/orchestrators/utils.py +55 -27
- zenml/zen_server/auth.py +7 -2
- zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
- zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
- zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
- zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
- zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
- zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
- zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
- zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
- zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
- zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/routers/auth_endpoints.py +20 -2
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/template_execution/utils.py +3 -1
- zenml/zen_stores/rest_zen_store.py +8 -3
- zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
- zenml/zen_stores/sql_zen_store.py +5 -1
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/METADATA +1 -1
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/RECORD +104 -96
- zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
- zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
- zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
- zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
- zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
- zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
- zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
- zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
- zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
- zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.70.0.dev20241205.dist-info}/WHEEL +0 -0
- {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.
|
1
|
+
0.70.0.dev20241205
|
zenml/config/server_config.py
CHANGED
@@ -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
|
+
)
|
zenml/orchestrators/utils.py
CHANGED
@@ -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
|
-
#
|
147
|
-
#
|
148
|
-
|
149
|
-
if
|
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
|
152
|
-
"
|
153
|
-
"
|
154
|
-
"
|
155
|
-
"
|
156
|
-
"
|
157
|
-
"
|
158
|
-
"
|
159
|
-
"
|
160
|
-
"
|
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
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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-
|
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};
|