ob-metaflow 2.15.13.1__py2.py3-none-any.whl → 2.19.7.1rc0__py2.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.
- metaflow/__init__.py +10 -3
- metaflow/_vendor/imghdr/__init__.py +186 -0
- metaflow/_vendor/yaml/__init__.py +427 -0
- metaflow/_vendor/yaml/composer.py +139 -0
- metaflow/_vendor/yaml/constructor.py +748 -0
- metaflow/_vendor/yaml/cyaml.py +101 -0
- metaflow/_vendor/yaml/dumper.py +62 -0
- metaflow/_vendor/yaml/emitter.py +1137 -0
- metaflow/_vendor/yaml/error.py +75 -0
- metaflow/_vendor/yaml/events.py +86 -0
- metaflow/_vendor/yaml/loader.py +63 -0
- metaflow/_vendor/yaml/nodes.py +49 -0
- metaflow/_vendor/yaml/parser.py +589 -0
- metaflow/_vendor/yaml/reader.py +185 -0
- metaflow/_vendor/yaml/representer.py +389 -0
- metaflow/_vendor/yaml/resolver.py +227 -0
- metaflow/_vendor/yaml/scanner.py +1435 -0
- metaflow/_vendor/yaml/serializer.py +111 -0
- metaflow/_vendor/yaml/tokens.py +104 -0
- metaflow/cards.py +4 -0
- metaflow/cli.py +125 -21
- metaflow/cli_components/init_cmd.py +1 -0
- metaflow/cli_components/run_cmds.py +204 -40
- metaflow/cli_components/step_cmd.py +160 -4
- metaflow/client/__init__.py +1 -0
- metaflow/client/core.py +198 -130
- metaflow/client/filecache.py +59 -32
- metaflow/cmd/code/__init__.py +2 -1
- metaflow/cmd/develop/stub_generator.py +49 -18
- metaflow/cmd/develop/stubs.py +9 -27
- metaflow/cmd/make_wrapper.py +30 -0
- metaflow/datastore/__init__.py +1 -0
- metaflow/datastore/content_addressed_store.py +40 -9
- metaflow/datastore/datastore_set.py +10 -1
- metaflow/datastore/flow_datastore.py +124 -4
- metaflow/datastore/spin_datastore.py +91 -0
- metaflow/datastore/task_datastore.py +92 -6
- metaflow/debug.py +5 -0
- metaflow/decorators.py +331 -82
- metaflow/extension_support/__init__.py +414 -356
- metaflow/extension_support/_empty_file.py +2 -2
- metaflow/flowspec.py +322 -82
- metaflow/graph.py +178 -15
- metaflow/includefile.py +25 -3
- metaflow/lint.py +94 -3
- metaflow/meta_files.py +13 -0
- metaflow/metadata_provider/metadata.py +13 -2
- metaflow/metaflow_config.py +66 -4
- metaflow/metaflow_environment.py +91 -25
- metaflow/metaflow_profile.py +18 -0
- metaflow/metaflow_version.py +16 -1
- metaflow/package/__init__.py +673 -0
- metaflow/packaging_sys/__init__.py +880 -0
- metaflow/packaging_sys/backend.py +128 -0
- metaflow/packaging_sys/distribution_support.py +153 -0
- metaflow/packaging_sys/tar_backend.py +99 -0
- metaflow/packaging_sys/utils.py +54 -0
- metaflow/packaging_sys/v1.py +527 -0
- metaflow/parameters.py +6 -2
- metaflow/plugins/__init__.py +6 -0
- metaflow/plugins/airflow/airflow.py +11 -1
- metaflow/plugins/airflow/airflow_cli.py +16 -5
- metaflow/plugins/argo/argo_client.py +42 -20
- metaflow/plugins/argo/argo_events.py +6 -6
- metaflow/plugins/argo/argo_workflows.py +1023 -344
- metaflow/plugins/argo/argo_workflows_cli.py +396 -94
- metaflow/plugins/argo/argo_workflows_decorator.py +9 -0
- metaflow/plugins/argo/argo_workflows_deployer_objects.py +75 -49
- metaflow/plugins/argo/capture_error.py +5 -2
- metaflow/plugins/argo/conditional_input_paths.py +35 -0
- metaflow/plugins/argo/exit_hooks.py +209 -0
- metaflow/plugins/argo/param_val.py +19 -0
- metaflow/plugins/aws/aws_client.py +6 -0
- metaflow/plugins/aws/aws_utils.py +33 -1
- metaflow/plugins/aws/batch/batch.py +72 -5
- metaflow/plugins/aws/batch/batch_cli.py +24 -3
- metaflow/plugins/aws/batch/batch_decorator.py +57 -6
- metaflow/plugins/aws/step_functions/step_functions.py +28 -3
- metaflow/plugins/aws/step_functions/step_functions_cli.py +49 -4
- metaflow/plugins/aws/step_functions/step_functions_deployer.py +3 -0
- metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +30 -0
- metaflow/plugins/cards/card_cli.py +20 -1
- metaflow/plugins/cards/card_creator.py +24 -1
- metaflow/plugins/cards/card_datastore.py +21 -49
- metaflow/plugins/cards/card_decorator.py +58 -6
- metaflow/plugins/cards/card_modules/basic.py +38 -9
- metaflow/plugins/cards/card_modules/bundle.css +1 -1
- metaflow/plugins/cards/card_modules/chevron/renderer.py +1 -1
- metaflow/plugins/cards/card_modules/components.py +592 -3
- metaflow/plugins/cards/card_modules/convert_to_native_type.py +34 -5
- metaflow/plugins/cards/card_modules/json_viewer.py +232 -0
- metaflow/plugins/cards/card_modules/main.css +1 -0
- metaflow/plugins/cards/card_modules/main.js +56 -41
- metaflow/plugins/cards/card_modules/test_cards.py +22 -6
- metaflow/plugins/cards/component_serializer.py +1 -8
- metaflow/plugins/cards/metadata.py +22 -0
- metaflow/plugins/catch_decorator.py +9 -0
- metaflow/plugins/datastores/local_storage.py +12 -6
- metaflow/plugins/datastores/spin_storage.py +12 -0
- metaflow/plugins/datatools/s3/s3.py +49 -17
- metaflow/plugins/datatools/s3/s3op.py +113 -66
- metaflow/plugins/env_escape/client_modules.py +102 -72
- metaflow/plugins/events_decorator.py +127 -121
- metaflow/plugins/exit_hook/__init__.py +0 -0
- metaflow/plugins/exit_hook/exit_hook_decorator.py +46 -0
- metaflow/plugins/exit_hook/exit_hook_script.py +52 -0
- metaflow/plugins/kubernetes/kubernetes.py +12 -1
- metaflow/plugins/kubernetes/kubernetes_cli.py +11 -0
- metaflow/plugins/kubernetes/kubernetes_decorator.py +25 -6
- metaflow/plugins/kubernetes/kubernetes_job.py +12 -4
- metaflow/plugins/kubernetes/kubernetes_jobsets.py +31 -30
- metaflow/plugins/metadata_providers/local.py +76 -82
- metaflow/plugins/metadata_providers/service.py +13 -9
- metaflow/plugins/metadata_providers/spin.py +16 -0
- metaflow/plugins/package_cli.py +36 -24
- metaflow/plugins/parallel_decorator.py +11 -2
- metaflow/plugins/parsers.py +16 -0
- metaflow/plugins/pypi/bootstrap.py +7 -1
- metaflow/plugins/pypi/conda_decorator.py +41 -82
- metaflow/plugins/pypi/conda_environment.py +14 -6
- metaflow/plugins/pypi/micromamba.py +9 -1
- metaflow/plugins/pypi/pip.py +41 -5
- metaflow/plugins/pypi/pypi_decorator.py +4 -4
- metaflow/plugins/pypi/utils.py +22 -0
- metaflow/plugins/secrets/__init__.py +3 -0
- metaflow/plugins/secrets/secrets_decorator.py +14 -178
- metaflow/plugins/secrets/secrets_func.py +49 -0
- metaflow/plugins/secrets/secrets_spec.py +101 -0
- metaflow/plugins/secrets/utils.py +74 -0
- metaflow/plugins/test_unbounded_foreach_decorator.py +2 -2
- metaflow/plugins/timeout_decorator.py +0 -1
- metaflow/plugins/uv/bootstrap.py +29 -1
- metaflow/plugins/uv/uv_environment.py +5 -3
- metaflow/pylint_wrapper.py +5 -1
- metaflow/runner/click_api.py +79 -26
- metaflow/runner/deployer.py +208 -6
- metaflow/runner/deployer_impl.py +32 -12
- metaflow/runner/metaflow_runner.py +266 -33
- metaflow/runner/subprocess_manager.py +21 -1
- metaflow/runner/utils.py +27 -16
- metaflow/runtime.py +660 -66
- metaflow/task.py +255 -26
- metaflow/user_configs/config_options.py +33 -21
- metaflow/user_configs/config_parameters.py +220 -58
- metaflow/user_decorators/__init__.py +0 -0
- metaflow/user_decorators/common.py +144 -0
- metaflow/user_decorators/mutable_flow.py +512 -0
- metaflow/user_decorators/mutable_step.py +424 -0
- metaflow/user_decorators/user_flow_decorator.py +264 -0
- metaflow/user_decorators/user_step_decorator.py +749 -0
- metaflow/util.py +197 -7
- metaflow/vendor.py +23 -7
- metaflow/version.py +1 -1
- {ob_metaflow-2.15.13.1.data → ob_metaflow-2.19.7.1rc0.data}/data/share/metaflow/devtools/Makefile +13 -2
- {ob_metaflow-2.15.13.1.data → ob_metaflow-2.19.7.1rc0.data}/data/share/metaflow/devtools/Tiltfile +107 -7
- {ob_metaflow-2.15.13.1.data → ob_metaflow-2.19.7.1rc0.data}/data/share/metaflow/devtools/pick_services.sh +1 -0
- {ob_metaflow-2.15.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/METADATA +2 -3
- {ob_metaflow-2.15.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/RECORD +162 -121
- {ob_metaflow-2.15.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/WHEEL +1 -1
- metaflow/_vendor/v3_5/__init__.py +0 -1
- metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -644
- metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -152
- metaflow/_vendor/v3_5/zipp.py +0 -329
- metaflow/info_file.py +0 -25
- metaflow/package.py +0 -203
- metaflow/user_configs/config_decorators.py +0 -568
- {ob_metaflow-2.15.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/entry_points.txt +0 -0
- {ob_metaflow-2.15.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/licenses/LICENSE +0 -0
- {ob_metaflow-2.15.13.1.dist-info → ob_metaflow-2.19.7.1rc0.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
1
|
from collections import namedtuple
|
|
6
2
|
from io import BytesIO
|
|
7
3
|
import os
|
|
@@ -13,10 +9,10 @@ from metaflow.metaflow_config import (
|
|
|
13
9
|
CARD_S3ROOT,
|
|
14
10
|
CARD_LOCALROOT,
|
|
15
11
|
DATASTORE_LOCAL_DIR,
|
|
12
|
+
DATASTORE_SPIN_LOCAL_DIR,
|
|
16
13
|
CARD_SUFFIX,
|
|
17
14
|
CARD_AZUREROOT,
|
|
18
15
|
CARD_GSROOT,
|
|
19
|
-
SKIP_CARD_DUALWRITE,
|
|
20
16
|
)
|
|
21
17
|
import metaflow.metaflow_config as metaflow_config
|
|
22
18
|
|
|
@@ -63,25 +59,28 @@ class CardDatastore(object):
|
|
|
63
59
|
return CARD_AZUREROOT
|
|
64
60
|
elif storage_type == "gs":
|
|
65
61
|
return CARD_GSROOT
|
|
66
|
-
elif storage_type == "local":
|
|
62
|
+
elif storage_type == "local" or storage_type == "spin":
|
|
67
63
|
# Borrowing some of the logic from LocalStorage.get_storage_root
|
|
68
64
|
result = CARD_LOCALROOT
|
|
65
|
+
local_dir = (
|
|
66
|
+
DATASTORE_SPIN_LOCAL_DIR
|
|
67
|
+
if storage_type == "spin"
|
|
68
|
+
else DATASTORE_LOCAL_DIR
|
|
69
|
+
)
|
|
69
70
|
if result is None:
|
|
70
71
|
current_path = os.getcwd()
|
|
71
|
-
check_dir = os.path.join(current_path,
|
|
72
|
+
check_dir = os.path.join(current_path, local_dir)
|
|
72
73
|
check_dir = os.path.realpath(check_dir)
|
|
73
74
|
orig_path = check_dir
|
|
74
75
|
while not os.path.isdir(check_dir):
|
|
75
76
|
new_path = os.path.dirname(current_path)
|
|
76
77
|
if new_path == current_path:
|
|
77
|
-
|
|
78
|
+
# No longer making upward progress so we
|
|
79
|
+
# return the top level path
|
|
80
|
+
return os.path.join(orig_path, CARD_SUFFIX)
|
|
78
81
|
current_path = new_path
|
|
79
|
-
check_dir = os.path.join(
|
|
80
|
-
|
|
81
|
-
)
|
|
82
|
-
result = orig_path
|
|
83
|
-
|
|
84
|
-
return result
|
|
82
|
+
check_dir = os.path.join(current_path, local_dir)
|
|
83
|
+
return os.path.join(check_dir, CARD_SUFFIX)
|
|
85
84
|
else:
|
|
86
85
|
# Let's make it obvious we need to update this block for each new datastore backend...
|
|
87
86
|
raise NotImplementedError(
|
|
@@ -231,23 +230,6 @@ class CardDatastore(object):
|
|
|
231
230
|
|
|
232
231
|
def save_card(self, uuid, card_type, card_html, card_id=None, overwrite=True):
|
|
233
232
|
card_file_name = card_type
|
|
234
|
-
# TEMPORARY_WORKAROUND: FIXME (LATER) : Fix the duplication of below block in a few months.
|
|
235
|
-
# Check file blame to understand the age of this temporary workaround.
|
|
236
|
-
|
|
237
|
-
# This function will end up saving cards at two locations.
|
|
238
|
-
# Thereby doubling the number of cards. (Which is a temporary fix)
|
|
239
|
-
# Why do this ? :
|
|
240
|
-
# When cards were introduced there was an assumption made about task-ids being unique.
|
|
241
|
-
# This assumption was incorrect.
|
|
242
|
-
# Only the pathspec needs to be unique but there is no such guarantees about task-ids.
|
|
243
|
-
# When task-ids are non-unique, card read would result in finding incorrect cards.
|
|
244
|
-
# This happens because cards were stored based on task-ids.
|
|
245
|
-
# If we immediately switch from storing based on task-ids to a step-name abstraction folder,
|
|
246
|
-
# then card reading will crash for many users.
|
|
247
|
-
# It would especially happen for users who are accessing cards created by a newer
|
|
248
|
-
# MF client from an older version of MF client.
|
|
249
|
-
# It will also easily end up breaking the metaflow-ui (which maybe using a client from an older version).
|
|
250
|
-
# Hence, we are writing cards to both paths so that we can introduce breaking changes later in the future.
|
|
251
233
|
card_path_with_steps = self.get_card_location(
|
|
252
234
|
self._get_card_write_path(),
|
|
253
235
|
card_file_name,
|
|
@@ -255,24 +237,10 @@ class CardDatastore(object):
|
|
|
255
237
|
card_id=card_id,
|
|
256
238
|
suffix=CardNameSuffix.CARD,
|
|
257
239
|
)
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
)
|
|
263
|
-
else:
|
|
264
|
-
card_path_without_steps = self.get_card_location(
|
|
265
|
-
self._get_card_read_path(with_steps=False),
|
|
266
|
-
card_file_name,
|
|
267
|
-
uuid,
|
|
268
|
-
card_id=card_id,
|
|
269
|
-
suffix=CardNameSuffix.CARD,
|
|
270
|
-
)
|
|
271
|
-
for cp in [card_path_with_steps, card_path_without_steps]:
|
|
272
|
-
self._backend.save_bytes(
|
|
273
|
-
[(cp, BytesIO(bytes(card_html, "utf-8")))], overwrite=overwrite
|
|
274
|
-
)
|
|
275
|
-
|
|
240
|
+
self._backend.save_bytes(
|
|
241
|
+
[(card_path_with_steps, BytesIO(bytes(card_html, "utf-8")))],
|
|
242
|
+
overwrite=overwrite,
|
|
243
|
+
)
|
|
276
244
|
return self.info_from_path(card_path_with_steps, suffix=CardNameSuffix.CARD)
|
|
277
245
|
|
|
278
246
|
def _list_card_paths(self, card_type=None, card_hash=None, card_id=None):
|
|
@@ -283,6 +251,10 @@ class CardDatastore(object):
|
|
|
283
251
|
)
|
|
284
252
|
|
|
285
253
|
if len(card_paths_with_steps) == 0:
|
|
254
|
+
# The listing logic is reading the cards with steps and without steps
|
|
255
|
+
# because earlier versions of clients (ones that wrote cards before June 2022),
|
|
256
|
+
# would have written cards without steps. So as a fallback we will try to check for the
|
|
257
|
+
# cards without steps.
|
|
286
258
|
card_paths_without_steps = self._backend.list_content(
|
|
287
259
|
[self._get_card_read_path(with_steps=False)]
|
|
288
260
|
)
|
|
@@ -2,8 +2,10 @@ import json
|
|
|
2
2
|
import os
|
|
3
3
|
import re
|
|
4
4
|
import tempfile
|
|
5
|
+
from typing import Tuple, Dict
|
|
5
6
|
|
|
6
7
|
from metaflow.decorators import StepDecorator
|
|
8
|
+
from metaflow.metadata_provider import MetaDatum
|
|
7
9
|
from metaflow.metaflow_current import current
|
|
8
10
|
from metaflow.user_configs.config_options import ConfigInput
|
|
9
11
|
from metaflow.user_configs.config_parameters import dump_config_values
|
|
@@ -22,6 +24,24 @@ def warning_message(message, logger=None, ts=False):
|
|
|
22
24
|
logger(msg, timestamp=ts, bad=True)
|
|
23
25
|
|
|
24
26
|
|
|
27
|
+
class MetadataStateManager(object):
|
|
28
|
+
def __init__(self, info_func):
|
|
29
|
+
self._info_func = info_func
|
|
30
|
+
self._metadata_registered = {}
|
|
31
|
+
|
|
32
|
+
def register_metadata(self, card_uuid) -> Tuple[bool, Dict]:
|
|
33
|
+
info = self._info_func()
|
|
34
|
+
# Check that metadata was not written yet. We only want to write once.
|
|
35
|
+
if (
|
|
36
|
+
info is None
|
|
37
|
+
or info.get(card_uuid) is None
|
|
38
|
+
or self._metadata_registered.get(card_uuid)
|
|
39
|
+
):
|
|
40
|
+
return False, {}
|
|
41
|
+
self._metadata_registered[card_uuid] = True
|
|
42
|
+
return True, info.get(card_uuid)
|
|
43
|
+
|
|
44
|
+
|
|
25
45
|
class CardDecorator(StepDecorator):
|
|
26
46
|
"""
|
|
27
47
|
Creates a human-readable report, a Metaflow Card, after this step completes.
|
|
@@ -55,11 +75,14 @@ class CardDecorator(StepDecorator):
|
|
|
55
75
|
The or one of the cards attached to this step.
|
|
56
76
|
"""
|
|
57
77
|
|
|
78
|
+
_GLOBAL_CARD_INFO = {}
|
|
79
|
+
|
|
58
80
|
name = "card"
|
|
59
81
|
defaults = {
|
|
60
82
|
"type": "default",
|
|
61
83
|
"options": {},
|
|
62
84
|
"scope": "task",
|
|
85
|
+
"rank": None, # Can be one of "high", "medium", "low". Can help derive ordering on the UI.
|
|
63
86
|
"timeout": 45,
|
|
64
87
|
"id": None,
|
|
65
88
|
"save_errors": True,
|
|
@@ -91,6 +114,7 @@ class CardDecorator(StepDecorator):
|
|
|
91
114
|
self._is_editable = False
|
|
92
115
|
self._card_uuid = None
|
|
93
116
|
self._user_set_card_id = None
|
|
117
|
+
self._metadata_registered = False
|
|
94
118
|
|
|
95
119
|
@classmethod
|
|
96
120
|
def _set_card_creator(cls, card_creator):
|
|
@@ -131,12 +155,23 @@ class CardDecorator(StepDecorator):
|
|
|
131
155
|
json.dump(config_value, config_file)
|
|
132
156
|
cls._config_file_name = config_file.name
|
|
133
157
|
|
|
158
|
+
@classmethod
|
|
159
|
+
def _register_card_info(cls, **kwargs):
|
|
160
|
+
if not kwargs.get("card_uuid"):
|
|
161
|
+
raise ValueError("card_uuid is required")
|
|
162
|
+
cls._GLOBAL_CARD_INFO[kwargs["card_uuid"]] = kwargs
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def all_cards_info(cls):
|
|
166
|
+
return cls._GLOBAL_CARD_INFO.copy()
|
|
167
|
+
|
|
134
168
|
def step_init(
|
|
135
169
|
self, flow, graph, step_name, decorators, environment, flow_datastore, logger
|
|
136
170
|
):
|
|
137
171
|
self._flow_datastore = flow_datastore
|
|
138
172
|
self._environment = environment
|
|
139
173
|
self._logger = logger
|
|
174
|
+
|
|
140
175
|
self.card_options = None
|
|
141
176
|
|
|
142
177
|
# We check for configuration options. We do this here before they are
|
|
@@ -191,6 +226,11 @@ class CardDecorator(StepDecorator):
|
|
|
191
226
|
# we need to ensure that a single config file is being referenced for all card create commands.
|
|
192
227
|
# This config file will be removed when the last card decorator has finished creating its card.
|
|
193
228
|
self._set_config_file_name(flow)
|
|
229
|
+
# The MetadataStateManager is used to track the state of the metadata registration.
|
|
230
|
+
# It is there to ensure that we only register metadata for the card once. This is so that we
|
|
231
|
+
# avoid any un-necessary metadata writes because the create command can be called multiple times during the
|
|
232
|
+
# card creation process.
|
|
233
|
+
self._metadata_state_manager = MetadataStateManager(self.all_cards_info)
|
|
194
234
|
|
|
195
235
|
card_type = self.attributes["type"]
|
|
196
236
|
card_class = get_card_class(card_type)
|
|
@@ -225,7 +265,12 @@ class CardDecorator(StepDecorator):
|
|
|
225
265
|
# we need to ensure that `current.card` has `CardComponentCollector` instantiated only once.
|
|
226
266
|
if not self._is_event_registered("pre-step"):
|
|
227
267
|
self._register_event("pre-step")
|
|
228
|
-
self._set_card_creator(
|
|
268
|
+
self._set_card_creator(
|
|
269
|
+
CardCreator(
|
|
270
|
+
self._create_top_level_args(flow),
|
|
271
|
+
self._metadata_state_manager.register_metadata,
|
|
272
|
+
)
|
|
273
|
+
)
|
|
229
274
|
|
|
230
275
|
current._update_env(
|
|
231
276
|
{"card": CardComponentCollector(self._logger, self.card_creator)}
|
|
@@ -248,6 +293,18 @@ class CardDecorator(StepDecorator):
|
|
|
248
293
|
)
|
|
249
294
|
self._card_uuid = card_metadata["uuid"]
|
|
250
295
|
|
|
296
|
+
self._register_card_info(
|
|
297
|
+
card_uuid=self._card_uuid,
|
|
298
|
+
rank=self.attributes["rank"],
|
|
299
|
+
type=self.attributes["type"],
|
|
300
|
+
options=self.card_options,
|
|
301
|
+
is_editable=self._is_editable,
|
|
302
|
+
is_runtime_card=self._is_runtime_card,
|
|
303
|
+
refresh_interval=self.attributes["refresh_interval"],
|
|
304
|
+
customize=customize,
|
|
305
|
+
id=self._user_set_card_id,
|
|
306
|
+
)
|
|
307
|
+
|
|
251
308
|
# This means that we are calling `task_pre_step` on the last card decorator.
|
|
252
309
|
# We can now `finalize` method in the CardComponentCollector object.
|
|
253
310
|
# This will set up the `current.card` object for usage inside `@step` code.
|
|
@@ -305,11 +362,6 @@ class CardDecorator(StepDecorator):
|
|
|
305
362
|
|
|
306
363
|
return list(self._options(top_level_options))
|
|
307
364
|
|
|
308
|
-
def task_exception(
|
|
309
|
-
self, exception, step_name, flow, graph, retry_count, max_user_code_retries
|
|
310
|
-
):
|
|
311
|
-
self._cleanup(step_name)
|
|
312
|
-
|
|
313
365
|
def _cleanup(self, step_name):
|
|
314
366
|
self._increment_completed_counter()
|
|
315
367
|
if self.task_finished_decos == self.total_decos_on_step[step_name]:
|
|
@@ -2,7 +2,7 @@ import base64
|
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
4
|
from .card import MetaflowCard, MetaflowCardComponent, with_default_component_id
|
|
5
|
-
from .convert_to_native_type import TaskToDict
|
|
5
|
+
from .convert_to_native_type import TaskToDict, MAX_ARTIFACT_SIZE
|
|
6
6
|
import uuid
|
|
7
7
|
import inspect
|
|
8
8
|
|
|
@@ -20,12 +20,15 @@ def transform_flow_graph(step_info):
|
|
|
20
20
|
return "split"
|
|
21
21
|
elif node_type == "split-parallel" or node_type == "split-foreach":
|
|
22
22
|
return "foreach"
|
|
23
|
+
elif node_type == "split-switch":
|
|
24
|
+
return "switch"
|
|
23
25
|
return "unknown" # Should never happen
|
|
24
26
|
|
|
25
27
|
graph_dict = {}
|
|
26
28
|
for stepname in step_info:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
node_type = node_to_type(step_info[stepname]["type"])
|
|
30
|
+
node_info = {
|
|
31
|
+
"type": node_type,
|
|
29
32
|
"box_next": step_info[stepname]["type"] not in ("linear", "join"),
|
|
30
33
|
"box_ends": (
|
|
31
34
|
None
|
|
@@ -35,6 +38,15 @@ def transform_flow_graph(step_info):
|
|
|
35
38
|
"next": step_info[stepname]["next"],
|
|
36
39
|
"doc": step_info[stepname]["doc"],
|
|
37
40
|
}
|
|
41
|
+
|
|
42
|
+
if node_type == "switch":
|
|
43
|
+
if "condition" in step_info[stepname]:
|
|
44
|
+
node_info["condition"] = step_info[stepname]["condition"]
|
|
45
|
+
if "switch_cases" in step_info[stepname]:
|
|
46
|
+
node_info["switch_cases"] = step_info[stepname]["switch_cases"]
|
|
47
|
+
|
|
48
|
+
graph_dict[stepname] = node_info
|
|
49
|
+
|
|
38
50
|
return graph_dict
|
|
39
51
|
|
|
40
52
|
|
|
@@ -364,9 +376,14 @@ class TaskInfoComponent(MetaflowCardComponent):
|
|
|
364
376
|
components=[],
|
|
365
377
|
runtime=False,
|
|
366
378
|
flow=None,
|
|
379
|
+
max_artifact_size=None,
|
|
367
380
|
):
|
|
368
381
|
self._task = task
|
|
369
382
|
self._only_repr = only_repr
|
|
383
|
+
# Use the global MAX_ARTIFACT_SIZE constant if not specified
|
|
384
|
+
self._max_artifact_size = (
|
|
385
|
+
max_artifact_size if max_artifact_size is not None else MAX_ARTIFACT_SIZE
|
|
386
|
+
)
|
|
370
387
|
self._graph = graph
|
|
371
388
|
self._components = components
|
|
372
389
|
self._page_title = page_title
|
|
@@ -382,9 +399,9 @@ class TaskInfoComponent(MetaflowCardComponent):
|
|
|
382
399
|
a dictionary of form:
|
|
383
400
|
dict(metadata = {},components= [])
|
|
384
401
|
"""
|
|
385
|
-
task_data_dict = TaskToDict(
|
|
386
|
-
self.
|
|
387
|
-
)
|
|
402
|
+
task_data_dict = TaskToDict(
|
|
403
|
+
only_repr=self._only_repr, max_artifact_size=self._max_artifact_size
|
|
404
|
+
)(self._task, graph=self._graph)
|
|
388
405
|
# ignore the name as an artifact
|
|
389
406
|
if "name" in task_data_dict["data"]:
|
|
390
407
|
del task_data_dict["data"]["name"]
|
|
@@ -418,6 +435,7 @@ class TaskInfoComponent(MetaflowCardComponent):
|
|
|
418
435
|
"Task Finished On": task_data_dict["finished_at"],
|
|
419
436
|
# Remove Microseconds from timedelta
|
|
420
437
|
"Tags": ", ".join(tags),
|
|
438
|
+
"Attempt": self._task.current_attempt,
|
|
421
439
|
}
|
|
422
440
|
if not self.runtime:
|
|
423
441
|
task_metadata_dict["Task Duration"] = str(
|
|
@@ -478,9 +496,15 @@ class TaskInfoComponent(MetaflowCardComponent):
|
|
|
478
496
|
)
|
|
479
497
|
|
|
480
498
|
# ignore the name as a parameter
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
499
|
+
if "_parameters" not in self._task.parent.parent:
|
|
500
|
+
# In case of spin steps, there is no _parameters task
|
|
501
|
+
param_ids = []
|
|
502
|
+
else:
|
|
503
|
+
param_ids = [
|
|
504
|
+
p.id
|
|
505
|
+
for p in self._task.parent.parent["_parameters"].task
|
|
506
|
+
if p.id != "name"
|
|
507
|
+
]
|
|
484
508
|
if len(param_ids) > 0:
|
|
485
509
|
# Extract parameter from the Parameter Task. That is less brittle.
|
|
486
510
|
parameter_data = TaskToDict(
|
|
@@ -680,10 +704,14 @@ class DefaultCard(MetaflowCard):
|
|
|
680
704
|
**kwargs
|
|
681
705
|
):
|
|
682
706
|
self._only_repr = True
|
|
707
|
+
# Default max artifact size uses the global MAX_ARTIFACT_SIZE constant (200MB)
|
|
708
|
+
self._max_artifact_size = MAX_ARTIFACT_SIZE
|
|
683
709
|
self._graph = None if graph is None else transform_flow_graph(graph)
|
|
684
710
|
self._flow = flow
|
|
685
711
|
if "only_repr" in options:
|
|
686
712
|
self._only_repr = options["only_repr"]
|
|
713
|
+
if "max_artifact_size" in options:
|
|
714
|
+
self._max_artifact_size = options["max_artifact_size"]
|
|
687
715
|
self._components = components
|
|
688
716
|
|
|
689
717
|
def render(self, task, runtime=False):
|
|
@@ -697,6 +725,7 @@ class DefaultCard(MetaflowCard):
|
|
|
697
725
|
components=self._components,
|
|
698
726
|
runtime=runtime,
|
|
699
727
|
flow=self._flow,
|
|
728
|
+
max_artifact_size=self._max_artifact_size,
|
|
700
729
|
).render()
|
|
701
730
|
pt = self._get_mustache()
|
|
702
731
|
data_dict = dict(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@import"https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap";code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:#ffffff80}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--bg: #ffffff;--black: #333;--blue: #0c66de;--dk-grey: #767676;--dk-primary: #ef863b;--dk-secondary: #13172d;--dk-tertiary: #0f426e;--error: #cf483e;--grey: rgba(0, 0, 0, .125);--highlight: #f8d9d8;--lt-blue: #4fa7ff;--lt-grey: #f3f3f3;--lt-lt-grey: #f9f9f9;--lt-primary: #ffcb8b;--lt-secondary: #434d81;--lt-tertiary: #4189c9;--primary: #faab4a;--quadrary: #f8d9d8;--secondary: #2e3454;--tertiary: #2a679d;--white: #ffffff;--component-spacer: 3rem;--aside-width: 20rem;--embed-card-min-height: 12rem;--mono-font: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", monospace}html,body{margin:0;min-height:100vh;overflow-y:visible;padding:0;width:100%}.card_app{width:100%;min-height:100vh}.embed .card_app{min-height:var(--embed-card-min-height)}.mf-card *{box-sizing:border-box}.mf-card{background:var(--bg);color:var(--black);font-family:Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:14px;font-weight:400;line-height:1.5;text-size-adjust:100%;margin:0;min-height:100vh;overflow-y:visible;padding:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;width:100%}.embed .mf-card{min-height:var(--embed-card-min-height)}.mf-card :is(.mono,code.mono,pre.mono){font-family:var(--mono-font);font-weight:lighter}.mf-card :is(table,th,td){border-spacing:1px;text-align:center;color:var(--black)}.mf-card table{position:relative;min-width:100%;table-layout:inherit!important}.mf-card td{padding:.66rem 1.25rem;background:var(--lt-lt-grey);border:none}.mf-card th{border:none;color:var(--dk-grey);font-weight:400;padding:.5rem}.mf-card :is(h1,h2,h3,h4,h5){font-weight:700;margin:.5rem 0}.mf-card ul{margin:0;padding:0}.mf-card p{margin:0 0 1rem}.mf-card p:last-of-type{margin:0}.mf-card button{font-size:1rem}.mf-card .textButton{cursor:pointer;text-align:left;background:none;border:1px solid transparent;outline:none;padding:0}.mf-card :is(button.textButton:focus,a:focus,button.textButton:active){border:1px dashed var(--grey);background:transparent}.mf-card button.textButton:hover{color:var(--blue);text-decoration:none}.mf-card :is(:not(pre)>code[class*=language-],pre[class*=language-]){background:transparent!important;text-shadow:none;-webkit-user-select:auto;user-select:auto}aside.svelte-1okdv0e{display:none;line-height:2;text-align:left}@media (min-width: 60rem){aside.svelte-1okdv0e{display:flex;flex-direction:column;height:100vh;justify-content:space-between;padding:2.5rem 0 1.5rem 1.5rem;position:fixed;width:var(--aside-width)}}.embed aside{display:none}aside ul{list-style-type:none}aside a,aside button,aside a:visited{text-decoration:none;cursor:pointer;font-weight:700;color:var(--black)}aside a:hover,aside button:hover{text-decoration:underline}.logoContainer svg{width:100%;max-width:140px;margin-bottom:3.75rem;height:auto}.idCell.svelte-pt8vzv{font-weight:700;text-align:right;background:var(--lt-grey);width:12%}.codeCell.svelte-pt8vzv{text-align:left;-webkit-user-select:all;user-select:all}.container.svelte-ubs992{width:100%;overflow:auto}table.svelte-ubs992{width:100%}:root{--dag-border: #282828;--dag-bg-static: var(--lt-grey);--dag-bg-success: #a5d46a;--dag-bg-running: #ffdf80;--dag-bg-error: #ffa080;--dag-connector: #cccccc;--dag-gap: 5rem;--dag-step-height: 6.25rem;--dag-step-width: 11.25rem;--dag-selected: #ffd700}.connectorwrapper.svelte-1hyaq5f{transform-origin:0 0;position:absolute;z-index:0;min-width:var(--strokeWidth)}.flip.svelte-1hyaq5f{transform:scaleX(-1)}.path.svelte-1hyaq5f{--strokeWidth:.5rem;--strokeColor:var(--dag-connector);--borderRadius:1.25rem;box-sizing:border-box}.straightLine.svelte-1hyaq5f{position:absolute;top:0;bottom:0;left:0;right:0;border-left:var(--strokeWidth) solid var(--strokeColor)}.topLeft.svelte-1hyaq5f{position:absolute;top:0;left:0;right:50%;bottom:calc(var(--dag-gap) / 2 - var(--strokeWidth) / 2);border-radius:0 0 0 var(--borderRadius);border-left:var(--strokeWidth) solid var(--strokeColor);border-bottom:var(--strokeWidth) solid var(--strokeColor)}.bottomRight.svelte-1hyaq5f{position:absolute;top:calc(100% - (var(--dag-gap) / 2 + var(--strokeWidth) / 2));left:50%;right:0;bottom:0;border-radius:0 var(--borderRadius) 0 0;border-top:var(--strokeWidth) solid var(--strokeColor);border-right:var(--strokeWidth) solid var(--strokeColor)}.wrapper.svelte-117ceti.svelte-117ceti{position:relative;z-index:1}.step.svelte-117ceti.svelte-117ceti{font-size:.75rem;padding:.5rem;color:var(--dk-grey)}.rectangle.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-static);border:1px solid var(--dag-border);box-sizing:border-box;position:relative;height:var(--dag-step-height);width:var(--dag-step-width)}.rectangle.error.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-error)}.rectangle.success.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-success)}.rectangle.running.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-running)}.level.svelte-117ceti.svelte-117ceti{z-index:-1;filter:contrast(.5);position:absolute}.inner.svelte-117ceti.svelte-117ceti{position:relative;height:100%;width:100%}.name.svelte-117ceti.svelte-117ceti{font-weight:700;overflow:hidden;text-overflow:ellipsis;display:block}.description.svelte-117ceti.svelte-117ceti{position:absolute;max-height:4rem;bottom:0;left:0;right:0;overflow:hidden;-webkit-line-clamp:4;line-clamp:4;display:-webkit-box;-webkit-box-orient:vertical}.overflown.description.svelte-117ceti.svelte-117ceti{cursor:help}.current.svelte-117ceti .rectangle.svelte-117ceti{box-shadow:0 0 10px var(--dag-selected)}.levelstoshow.svelte-117ceti.svelte-117ceti{position:absolute;bottom:100%;right:0;font-size:.75rem;font-weight:100;text-align:right}.stepwrapper.svelte-18aex7a{display:flex;align-items:center;flex-direction:column;width:100%;position:relative;min-width:var(--dag-step-width)}.childwrapper.svelte-18aex7a{display:flex;width:100%}.gap.svelte-18aex7a{height:var(--dag-gap)}.title.svelte-117s0ws{text-align:left}.subtitle.svelte-lu9pnn{font-size:1rem;text-align:left}header.svelte-1ugmt5d{margin-bottom:var(--component-spacer)}figure.svelte-1x96yvr{background:var(--lt-grey);padding:1rem;border-radius:5px;text-align:center;margin:0 auto var(--component-spacer)}@media (min-width: 60rem){figure.svelte-1x96yvr{margin-bottom:0}}img.svelte-1x96yvr{max-width:100%;max-height:500px}.label.svelte-1x96yvr{font-weight:700;margin:.5rem 0}.description.svelte-1x96yvr{font-size:.9rem;font-style:italic;text-align:center;margin:.5rem 0}.log.svelte-1jhmsu{background:var(--lt-grey)!important;font-size:.9rem;padding:2rem}.page.svelte-v7ihqd:last-of-type{margin-bottom:var(--component-spacer)}.page:last-of-type section:last-of-type hr{display:none}progress.svelte-ljrmzp::-webkit-progress-bar{background-color:#fff!important;min-width:100%}progress.svelte-ljrmzp{background-color:#fff;color:#326cded9!important}progress.svelte-ljrmzp::-moz-progress-bar{background-color:#326cde!important}table .container{background:transparent!important;font-size:10px!important;padding:0!important}table progress{height:4px!important}.container.svelte-ljrmzp{display:flex;align-items:center;justify-content:center;font-size:12px;border-radius:3px;background:#edf5ff;padding:3rem}.inner.svelte-ljrmzp{max-width:410px;width:100%;text-align:center}.info.svelte-ljrmzp{display:flex;justify-content:space-between}table .info{text-align:left;flex-direction:column}label.svelte-ljrmzp{font-weight:700}.labelValue.svelte-ljrmzp{border-left:1px solid rgba(0,0,0,.1);margin-left:.25rem;padding-left:.5rem}.details.svelte-ljrmzp{font-family:var(--mono-font);font-size:8px;color:#333433;line-height:18px;overflow:hidden;white-space:nowrap}progress.svelte-ljrmzp{width:100%;border:none;border-radius:5px;height:8px;background:#fff}.heading.svelte-17n0qr8{margin-bottom:1.5rem}.sectionItems.svelte-17n0qr8{display:block}.sectionItems .imageContainer{max-height:500px}.container.svelte-17n0qr8{scroll-margin:var(--component-spacer)}hr.svelte-17n0qr8{background:var(--grey);border:none;height:1px;margin:var(--component-spacer) 0;padding:0}@media (min-width: 60rem){.sectionItems.svelte-17n0qr8{display:grid;grid-gap:2rem}}td.svelte-gl9h79{text-align:left}td.labelColumn.svelte-gl9h79{text-align:right;background-color:var(--lt-grey);font-weight:700;width:12%;white-space:nowrap}.tableContainer.svelte-q3hq57{overflow:auto}th.svelte-q3hq57{position:sticky;top:-1px;z-index:2;white-space:nowrap;background:var(--white)}.mainContainer.svelte-mqeomk{max-width:110rem}main.svelte-mqeomk{flex:0 1 auto;max-width:100rem;padding:1.5rem}@media (min-width: 60rem){main.svelte-mqeomk{margin-left:var(--aside-width)}}.embed main{margin:0 auto;min-width:80%}.modal.svelte-1hhf5ym{align-items:center;background:#00000080;bottom:0;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;width:100%;z-index:100}.modalContainer>*{background-color:#fff;border-radius:5px;cursor:default;flex:0 1 auto;padding:1rem;position:relative}.modal img{max-height:80vh!important}.cancelButton.svelte-1hhf5ym{color:#fff;cursor:pointer;font-size:2rem;position:absolute;right:1rem;top:1rem}.cancelButton.svelte-1hhf5ym:hover{color:var(--blue)}.nav.svelte-1kdpgko.svelte-1kdpgko{border-radius:0 0 5px;display:none;margin:0;top:0}ul.navList.svelte-1kdpgko.svelte-1kdpgko{list-style-type:none}ul.navList.svelte-1kdpgko ul.svelte-1kdpgko{margin:.5rem 1rem 2rem}.navList.svelte-1kdpgko li.svelte-1kdpgko{display:block;margin:0}.navItem.svelte-1kdpgko li.svelte-1kdpgko:hover{color:var(--blue)}.pageId.svelte-1kdpgko.svelte-1kdpgko{display:block;border-bottom:1px solid var(--grey);padding:0 .5rem;margin-bottom:1rem}@media (min-width: 60rem){.nav.svelte-1kdpgko.svelte-1kdpgko{display:block}ul.navList.svelte-1kdpgko.svelte-1kdpgko{text-align:left}.navList.svelte-1kdpgko li.svelte-1kdpgko{display:block;margin:.5rem 0}}.container.svelte-teyund{width:100%;display:flex;flex-direction:column;position:relative}
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap";code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:#ffffff80}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}:root{--bg: #ffffff;--black: #333;--blue: #0c66de;--dk-grey: #767676;--dk-primary: #ef863b;--dk-secondary: #13172d;--dk-tertiary: #0f426e;--error: #cf483e;--grey: rgba(0, 0, 0, .125);--highlight: #f8d9d8;--lt-blue: #4fa7ff;--lt-grey: #f3f3f3;--lt-lt-grey: #f9f9f9;--lt-primary: #ffcb8b;--lt-secondary: #434d81;--lt-tertiary: #4189c9;--primary: #faab4a;--quadrary: #f8d9d8;--secondary: #2e3454;--tertiary: #2a679d;--white: #ffffff;--component-spacer: 3rem;--aside-width: 20rem;--embed-card-min-height: 12rem;--mono-font: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", monospace}html,body{margin:0;min-height:100vh;overflow-y:visible;padding:0;width:100%}.card_app{width:100%;min-height:100vh}.embed .card_app{min-height:var(--embed-card-min-height)}.mf-card *{box-sizing:border-box}.mf-card{background:var(--bg);color:var(--black);font-family:Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:14px;font-weight:400;line-height:1.5;text-size-adjust:100%;margin:0;min-height:100vh;overflow-y:visible;padding:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;width:100%}.embed .mf-card{min-height:var(--embed-card-min-height)}.mf-card :is(.mono,code.mono,pre.mono){font-family:var(--mono-font);font-weight:lighter}.mf-card :is(table,th,td){border-spacing:1px;text-align:center;color:var(--black)}.mf-card table{position:relative;min-width:100%;table-layout:inherit!important}.mf-card td{padding:.66rem 1.25rem;background:var(--lt-lt-grey);border:none}.mf-card th{border:none;color:var(--dk-grey);font-weight:400;padding:.5rem}.mf-card :is(h1,h2,h3,h4,h5){font-weight:700;margin:.5rem 0}.mf-card ul{margin:0;padding:0}.mf-card p{margin:0 0 1rem}.mf-card p:last-of-type{margin:0}.mf-card button{font-size:1rem}.mf-card .textButton{cursor:pointer;text-align:left;background:none;border:1px solid transparent;outline:none;padding:0}.mf-card :is(button.textButton:focus,a:focus,button.textButton:active){border:1px dashed var(--grey);background:transparent}.mf-card button.textButton:hover{color:var(--blue);text-decoration:none}.mf-card :is(:not(pre)>code[class*=language-],pre[class*=language-]){background:transparent!important;text-shadow:none;-webkit-user-select:auto;user-select:auto}aside.svelte-1okdv0e{display:none;line-height:2;text-align:left}@media (min-width: 60rem){aside.svelte-1okdv0e{display:flex;flex-direction:column;height:100vh;justify-content:space-between;padding:2.5rem 0 1.5rem 1.5rem;position:fixed;width:var(--aside-width)}}.embed aside{display:none}aside ul{list-style-type:none}aside a,aside button,aside a:visited{text-decoration:none;cursor:pointer;font-weight:700;color:var(--black)}aside a:hover,aside button:hover{text-decoration:underline}.logoContainer svg{width:100%;max-width:140px;margin-bottom:3.75rem;height:auto}.idCell.svelte-pt8vzv{font-weight:700;text-align:right;background:var(--lt-grey);width:12%}.codeCell.svelte-pt8vzv{text-align:left;-webkit-user-select:all;user-select:all}.container.svelte-ubs992{width:100%;overflow:auto}table.svelte-ubs992{width:100%}:root{--dag-border: #282828;--dag-bg-static: var(--lt-grey);--dag-bg-success: #a5d46a;--dag-bg-running: #ffdf80;--dag-bg-error: #ffa080;--dag-connector: #cccccc;--dag-gap: 5rem;--dag-step-height: 6.25rem;--dag-step-width: 11.25rem;--dag-selected: #ffd700}.connectorwrapper.svelte-19jpdwh{transform-origin:0 0;position:absolute;z-index:0;min-width:var(--strokeWidth)}.flip.svelte-19jpdwh{transform:scaleX(-1)}.path.svelte-19jpdwh{--strokeWidth:.5rem;--strokeColor:var(--dag-connector);--borderRadius:1.25rem;box-sizing:border-box}.straightLine.svelte-19jpdwh{position:absolute;top:0;bottom:0;left:0;right:0;border-left:var(--strokeWidth) solid var(--strokeColor)}.loop.svelte-19jpdwh{position:absolute;top:-50%;left:0;width:100%;height:100%;border-radius:var(--borderRadius);border:var(--strokeWidth) solid var(--strokeColor)}.topLeft.svelte-19jpdwh{position:absolute;top:0;left:0;right:50%;bottom:calc(var(--dag-gap) / 2 - var(--strokeWidth) / 2);border-radius:0 0 0 var(--borderRadius);border-left:var(--strokeWidth) solid var(--strokeColor);border-bottom:var(--strokeWidth) solid var(--strokeColor)}.bottomRight.svelte-19jpdwh{position:absolute;top:calc(100% - (var(--dag-gap) / 2 + var(--strokeWidth) / 2));left:50%;right:0;bottom:0;border-radius:0 var(--borderRadius) 0 0;border-top:var(--strokeWidth) solid var(--strokeColor);border-right:var(--strokeWidth) solid var(--strokeColor)}.wrapper.svelte-117ceti.svelte-117ceti{position:relative;z-index:1}.step.svelte-117ceti.svelte-117ceti{font-size:.75rem;padding:.5rem;color:var(--dk-grey)}.rectangle.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-static);border:1px solid var(--dag-border);box-sizing:border-box;position:relative;height:var(--dag-step-height);width:var(--dag-step-width)}.rectangle.error.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-error)}.rectangle.success.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-success)}.rectangle.running.svelte-117ceti.svelte-117ceti{background-color:var(--dag-bg-running)}.level.svelte-117ceti.svelte-117ceti{z-index:-1;filter:contrast(.5);position:absolute}.inner.svelte-117ceti.svelte-117ceti{position:relative;height:100%;width:100%}.name.svelte-117ceti.svelte-117ceti{font-weight:700;overflow:hidden;text-overflow:ellipsis;display:block}.description.svelte-117ceti.svelte-117ceti{position:absolute;max-height:4rem;bottom:0;left:0;right:0;overflow:hidden;-webkit-line-clamp:4;line-clamp:4;display:-webkit-box;-webkit-box-orient:vertical}.overflown.description.svelte-117ceti.svelte-117ceti{cursor:help}.current.svelte-117ceti .rectangle.svelte-117ceti{box-shadow:0 0 10px var(--dag-selected)}.levelstoshow.svelte-117ceti.svelte-117ceti{position:absolute;bottom:100%;right:0;font-size:.75rem;font-weight:100;text-align:right}.stepwrapper.svelte-18aex7a{display:flex;align-items:center;flex-direction:column;width:100%;position:relative;min-width:var(--dag-step-width)}.childwrapper.svelte-18aex7a{display:flex;width:100%}.gap.svelte-18aex7a{height:var(--dag-gap)}.title.svelte-117s0ws{text-align:left}.subtitle.svelte-lu9pnn{font-size:1rem;text-align:left}header.svelte-1ugmt5d{margin-bottom:var(--component-spacer)}figure.svelte-1x96yvr{background:var(--lt-grey);padding:1rem;border-radius:5px;text-align:center;margin:0 auto var(--component-spacer)}@media (min-width: 60rem){figure.svelte-1x96yvr{margin-bottom:0}}img.svelte-1x96yvr{max-width:100%;max-height:500px}.label.svelte-1x96yvr{font-weight:700;margin:.5rem 0}.description.svelte-1x96yvr{font-size:.9rem;font-style:italic;text-align:center;margin:.5rem 0}.log.svelte-1jhmsu{background:var(--lt-grey)!important;font-size:.9rem;padding:2rem}.page.svelte-v7ihqd:last-of-type{margin-bottom:var(--component-spacer)}.page:last-of-type section:last-of-type hr{display:none}progress.svelte-ljrmzp::-webkit-progress-bar{background-color:#fff!important;min-width:100%}progress.svelte-ljrmzp{background-color:#fff;color:#326cded9!important}progress.svelte-ljrmzp::-moz-progress-bar{background-color:#326cde!important}table .container{background:transparent!important;font-size:10px!important;padding:0!important}table progress{height:4px!important}.container.svelte-ljrmzp{display:flex;align-items:center;justify-content:center;font-size:12px;border-radius:3px;background:#edf5ff;padding:3rem}.inner.svelte-ljrmzp{max-width:410px;width:100%;text-align:center}.info.svelte-ljrmzp{display:flex;justify-content:space-between}table .info{text-align:left;flex-direction:column}label.svelte-ljrmzp{font-weight:700}.labelValue.svelte-ljrmzp{border-left:1px solid rgba(0,0,0,.1);margin-left:.25rem;padding-left:.5rem}.details.svelte-ljrmzp{font-family:var(--mono-font);font-size:8px;color:#333433;line-height:18px;overflow:hidden;white-space:nowrap}progress.svelte-ljrmzp{width:100%;border:none;border-radius:5px;height:8px;background:#fff}.heading.svelte-17n0qr8{margin-bottom:1.5rem}.sectionItems.svelte-17n0qr8{display:block}.sectionItems .imageContainer{max-height:500px}.container.svelte-17n0qr8{scroll-margin:var(--component-spacer)}hr.svelte-17n0qr8{background:var(--grey);border:none;height:1px;margin:var(--component-spacer) 0;padding:0}@media (min-width: 60rem){.sectionItems.svelte-17n0qr8{display:grid;grid-gap:2rem}}.value-box.svelte-175x1n5.svelte-175x1n5{border-radius:.5rem;padding:1.5rem;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;border:1px solid #e5e7eb;background:#fff;min-height:120px;display:flex;align-items:center}.value-box-content.svelte-175x1n5.svelte-175x1n5{width:100%}.value-box-title.svelte-175x1n5.svelte-175x1n5{font-size:.875rem;font-weight:500;color:#6b7280;margin:0 0 .5rem;text-transform:uppercase;letter-spacing:.025em}.value-box-value.svelte-175x1n5.svelte-175x1n5{font-size:2rem;font-weight:700;color:#111827;line-height:1.2;margin:0 0 .5rem}.value-box-subtitle.svelte-175x1n5.svelte-175x1n5{font-size:.875rem;color:#6b7280;margin:0 0 .5rem}.value-box-change.svelte-175x1n5.svelte-175x1n5{font-size:.75rem;font-weight:500;color:#059669;text-transform:uppercase;letter-spacing:.025em}.value-box.default.svelte-175x1n5.svelte-175x1n5{background:#fff;border-color:#e5e7eb}.value-box.bg-gradient-indigo-purple.svelte-175x1n5.svelte-175x1n5{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none}.value-box.bg-gradient-indigo-purple.svelte-175x1n5 .value-box-title.svelte-175x1n5,.value-box.bg-gradient-indigo-purple.svelte-175x1n5 .value-box-subtitle.svelte-175x1n5{color:#fffc}.value-box.bg-gradient-indigo-purple.svelte-175x1n5 .value-box-value.svelte-175x1n5{color:#fff}.value-box.bg-gradient-indigo-purple.svelte-175x1n5 .value-box-change.svelte-175x1n5{color:#ffffffe6}.value-box.success.svelte-175x1n5.svelte-175x1n5{background:#f0fdf4;border-color:#bbf7d0}.value-box.success.svelte-175x1n5 .value-box-value.svelte-175x1n5{color:#065f46}.value-box.success.svelte-175x1n5 .value-box-change.svelte-175x1n5{color:#059669}.value-box.warning.svelte-175x1n5.svelte-175x1n5{background:#fffbeb;border-color:#fed7aa}.value-box.warning.svelte-175x1n5 .value-box-value.svelte-175x1n5{color:#92400e}.value-box.warning.svelte-175x1n5 .value-box-change.svelte-175x1n5{color:#d97706}.value-box.danger.svelte-175x1n5.svelte-175x1n5{background:#fef2f2;border-color:#fecaca}.value-box.danger.svelte-175x1n5 .value-box-value.svelte-175x1n5{color:#991b1b}.value-box.danger.svelte-175x1n5 .value-box-change.svelte-175x1n5{color:#dc2626}@media (max-width: 640px){.value-box.svelte-175x1n5.svelte-175x1n5{padding:1rem;min-height:100px}.value-box-value.svelte-175x1n5.svelte-175x1n5{font-size:1.5rem}}table .value-box{min-height:auto;padding:.75rem;margin:.25rem 0}table .value-box-value{font-size:1.25rem}.events-container.svelte-11m3hns.svelte-11m3hns{border:1px solid #e5e7eb;border-radius:.5rem;background:#fff;padding:1rem;margin-bottom:1rem}.events-title.svelte-11m3hns.svelte-11m3hns{font-size:1.25rem;font-weight:600;color:#111827;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:2px solid #e5e7eb}.stats-header.svelte-11m3hns.svelte-11m3hns{display:flex;justify-content:space-between;align-items:center;padding:.5rem .75rem;margin-bottom:1rem;border-radius:.375rem;font-size:.875rem;border:1px solid #e5e7eb}.stats-header.live.svelte-11m3hns.svelte-11m3hns{background:#f0fdf4;border-color:#bbf7d0}.stats-header.recent.svelte-11m3hns.svelte-11m3hns{background:#fffbeb;border-color:#fed7aa}.stats-header.stale.svelte-11m3hns.svelte-11m3hns{background:#fef2f2;border-color:#fecaca}.stats-indicator.svelte-11m3hns.svelte-11m3hns{display:flex;align-items:center;gap:.5rem}.live-dot.svelte-11m3hns.svelte-11m3hns{width:10px;height:10px;border-radius:50%;background:#10b981;box-shadow:0 0 0 2px #10b98133;transition:all .3s ease}.stats-header.live.svelte-11m3hns .live-dot.svelte-11m3hns{background:#10b981;box-shadow:0 0 0 2px #10b9814d,0 0 8px #10b98166;animation:svelte-11m3hns-livePulse 2s infinite}.stats-header.recent.svelte-11m3hns .live-dot.svelte-11m3hns{background:#f59e0b;box-shadow:0 0 0 2px #f59e0b33}.stats-header.stale.svelte-11m3hns .live-dot.svelte-11m3hns{background:#ef4444;box-shadow:0 0 0 2px #ef444433}.stats-header.finished.svelte-11m3hns.svelte-11m3hns{background:#f0f9ff;border-color:#bae6fd}.stats-header.finished.svelte-11m3hns .live-dot.svelte-11m3hns{background:#0ea5e9;box-shadow:0 0 0 2px #0ea5e933}.status-text.svelte-11m3hns.svelte-11m3hns{font-weight:500;color:#374151}.stats-info.svelte-11m3hns.svelte-11m3hns{display:flex;gap:1rem;font-size:.8125rem;color:#6b7280}.stat-item.svelte-11m3hns.svelte-11m3hns{white-space:nowrap}.no-events.svelte-11m3hns.svelte-11m3hns{text-align:center;padding:2rem;color:#6b7280;font-style:italic}.events-timeline.svelte-11m3hns.svelte-11m3hns{position:relative;padding-left:2rem}.events-timeline.svelte-11m3hns.svelte-11m3hns:before{content:"";position:absolute;left:.75rem;top:0;bottom:0;width:2px;background:linear-gradient(to bottom,#3b82f6,#e5e7eb)}.event-item.svelte-11m3hns.svelte-11m3hns{position:relative;margin-bottom:1.5rem;padding-left:1rem}.event-item.svelte-11m3hns.svelte-11m3hns:last-child{margin-bottom:0}.event-marker.svelte-11m3hns.svelte-11m3hns{position:absolute;left:-1.525rem;top:0;width:.75rem;height:.75rem;border-radius:50%;background:#3b82f6;border:2px solid white;box-shadow:0 0 0 2px #3b82f6;z-index:1}.event-item.latest.svelte-11m3hns .event-marker.svelte-11m3hns{background:#10b981;box-shadow:0 0 0 2px #10b9814d;animation:svelte-11m3hns-markerPulse 2s infinite}@keyframes svelte-11m3hns-livePulse{0%,to{transform:scale(1);box-shadow:0 0 0 2px #10b9814d,0 0 8px #10b98166}50%{transform:scale(1.1);box-shadow:0 0 0 4px #10b98133,0 0 12px #10b98199}}@keyframes svelte-11m3hns-markerPulse{0%,to{box-shadow:0 0 0 2px #10b9814d}50%{box-shadow:0 0 0 4px #10b98180}}.event-content.svelte-11m3hns.svelte-11m3hns{background:#f9fafb;border:1px solid #e5e7eb;border-radius:.375rem;padding:.75rem;box-shadow:0 1px 2px #0000000d}.event-item.latest.svelte-11m3hns .event-content.svelte-11m3hns{background:#f0f9ff;border-color:#3b82f6}.event-item.theme-success.svelte-11m3hns .event-content.svelte-11m3hns{background:#f0fdf4;border-color:#bbf7d0}.event-item.theme-success.svelte-11m3hns .event-marker.svelte-11m3hns{background:#10b981;box-shadow:0 0 0 2px #10b981}.event-item.theme-error.svelte-11m3hns .event-content.svelte-11m3hns{background:#fef2f2;border-color:#fecaca}.event-item.theme-error.svelte-11m3hns .event-marker.svelte-11m3hns{background:#ef4444;box-shadow:0 0 0 2px #ef4444}.event-item.theme-warning.svelte-11m3hns .event-content.svelte-11m3hns{background:#fffbeb;border-color:#fed7aa}.event-item.theme-warning.svelte-11m3hns .event-marker.svelte-11m3hns{background:#f59e0b;box-shadow:0 0 0 2px #f59e0b}.event-item.theme-info.svelte-11m3hns .event-content.svelte-11m3hns{background:#eff6ff;border-color:#bfdbfe}.event-item.theme-info.svelte-11m3hns .event-marker.svelte-11m3hns{background:#3b82f6;box-shadow:0 0 0 2px #3b82f6}.event-item.theme-tool_call.svelte-11m3hns .event-content.svelte-11m3hns{background:#f3e8ff;border-color:#c4b5fd}.event-item.theme-tool_call.svelte-11m3hns .event-marker.svelte-11m3hns{background:#8b5cf6;box-shadow:0 0 0 2px #8b5cf6}.event-item.theme-ai_response.svelte-11m3hns .event-content.svelte-11m3hns{background:#fdf4ff;border-color:#e9d5ff}.event-item.theme-ai_response.svelte-11m3hns .event-marker.svelte-11m3hns{background:#a855f7;box-shadow:0 0 0 2px #a855f7}.event-item.priority-high.svelte-11m3hns.svelte-11m3hns{border-left:4px solid #f59e0b}.event-item.priority-critical.svelte-11m3hns.svelte-11m3hns{border-left:4px solid #ef4444}.event-meta.svelte-11m3hns.svelte-11m3hns{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;font-size:.75rem;color:#6b7280}.event-time.svelte-11m3hns.svelte-11m3hns{font-weight:500}.event-id.svelte-11m3hns.svelte-11m3hns{font-family:Monaco,Menlo,Ubuntu Mono,monospace;opacity:.7}.event-metadata.svelte-11m3hns.svelte-11m3hns{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:.5rem}.event-payloads.svelte-11m3hns.svelte-11m3hns{margin-top:1rem;border-top:1px solid #e5e7eb;padding-top:.75rem}.payload-section.svelte-11m3hns.svelte-11m3hns{margin-bottom:.75rem;border:1px solid #e5e7eb;border-radius:.375rem;overflow:hidden}.payload-section.svelte-11m3hns.svelte-11m3hns:last-child{margin-bottom:0}.payload-header.svelte-11m3hns.svelte-11m3hns{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;background:#f9fafb;cursor:pointer;-webkit-user-select:none;user-select:none;border-bottom:1px solid #e5e7eb;font-weight:500}.payload-header.svelte-11m3hns.svelte-11m3hns:hover{background:#f3f4f6}.payload-title.svelte-11m3hns.svelte-11m3hns{font-size:.875rem;color:#374151}.payload-type.svelte-11m3hns.svelte-11m3hns{font-size:.75rem;color:#6b7280;background:#e5e7eb;padding:.125rem .5rem;border-radius:.25rem;text-transform:uppercase;letter-spacing:.025em}.payload-content.svelte-11m3hns.svelte-11m3hns{padding:1rem;background:#fff;font-size:inherit;line-height:inherit;color:inherit}.payload-content.svelte-11m3hns>*{margin-bottom:0}.payload-content.svelte-11m3hns>*:not(:last-child){margin-bottom:1rem}.payload-content.svelte-11m3hns pre[data-component=pythonCode]{margin:0;overflow-x:auto}.payload-content.svelte-11m3hns pre[data-component=pythonCode] code{display:block}.payload-content.svelte-11m3hns code:not(pre code){font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.875rem;background:#f1f5f9;padding:.125rem .25rem;border-radius:.25rem}.event-field.svelte-11m3hns.svelte-11m3hns{display:flex;flex-direction:column;gap:.125rem}.field-key.svelte-11m3hns.svelte-11m3hns{font-size:.75rem;font-weight:500;color:#6b7280;text-transform:uppercase;letter-spacing:.025em}.field-value.svelte-11m3hns.svelte-11m3hns{font-size:.875rem;font-weight:400;color:#111827;word-break:break-word;display:inline-block;width:auto}.field-value.timestamp.svelte-11m3hns.svelte-11m3hns{font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.8125rem;color:#6366f1}.field-value.number.svelte-11m3hns.svelte-11m3hns{font-family:Monaco,Menlo,Ubuntu Mono,monospace;color:#059669}.field-value.status.svelte-11m3hns.svelte-11m3hns,.field-value.status-success.svelte-11m3hns.svelte-11m3hns,.field-value.status-error.svelte-11m3hns.svelte-11m3hns,.field-value.status-warning.svelte-11m3hns.svelte-11m3hns,.field-value.status-milestone.svelte-11m3hns.svelte-11m3hns,.field-value.status-completed.svelte-11m3hns.svelte-11m3hns,.field-value.status-finished.svelte-11m3hns.svelte-11m3hns{font-weight:500;text-transform:uppercase;font-size:.75rem;letter-spacing:.025em;padding:.125rem .375rem;border-radius:.25rem;display:inline-flex!important;align-items:center;justify-content:center;background:#f3f4f6;color:#374151;width:fit-content!important;max-width:fit-content!important;min-width:auto!important;flex-shrink:0;white-space:nowrap}.field-value.status-success.svelte-11m3hns.svelte-11m3hns{color:#059669;background:#d1fae5}.field-value.status-error.svelte-11m3hns.svelte-11m3hns{color:#dc2626;background:#fee2e2}.field-value.status-warning.svelte-11m3hns.svelte-11m3hns{color:#d97706;background:#fef3c7}.field-value.status-milestone.svelte-11m3hns.svelte-11m3hns{color:#7c3aed;background:#ede9fe}.field-value.status-completed.svelte-11m3hns.svelte-11m3hns{color:#059669;background:#d1fae5}.field-value.status-finished.svelte-11m3hns.svelte-11m3hns{color:#0ea5e9;background:#e0f2fe}@media (max-width: 640px){.events-container.svelte-11m3hns.svelte-11m3hns{padding:.75rem}.events-timeline.svelte-11m3hns.svelte-11m3hns{padding-left:1.5rem}.stats-info.svelte-11m3hns.svelte-11m3hns{flex-direction:column;gap:.25rem;align-items:flex-end}.event-metadata.svelte-11m3hns.svelte-11m3hns{grid-template-columns:1fr;gap:.375rem}.event-field.svelte-11m3hns.svelte-11m3hns{flex-direction:row;align-items:flex-start;gap:.5rem}.field-key.svelte-11m3hns.svelte-11m3hns{min-width:80px;flex-shrink:0}}table .events-container{margin:.25rem 0;border:none;background:transparent;padding:.5rem}table .events-timeline{padding-left:1rem}table .event-content{padding:.5rem}table .stats-header{font-size:.75rem;padding:.375rem .5rem}.json-viewer.svelte-1b8g4ty.svelte-1b8g4ty{border:1px solid #e5e7eb;border-radius:.375rem;background:#f9fafb;margin:.5rem 0;overflow:hidden}.json-header.svelte-1b8g4ty.svelte-1b8g4ty{display:flex;justify-content:space-between;align-items:center;padding:.5rem .75rem;background:#f3f4f6;border-bottom:1px solid #e5e7eb;font-size:.875rem;font-weight:500}.collapse-button.svelte-1b8g4ty.svelte-1b8g4ty{display:flex;align-items:center;gap:.5rem;background:none;border:none;color:#374151;cursor:pointer;font-size:.875rem;font-weight:500}.collapse-button.svelte-1b8g4ty.svelte-1b8g4ty:hover{color:#111827}.collapse-icon.svelte-1b8g4ty.svelte-1b8g4ty{transition:transform .2s ease;font-size:.75rem}.collapse-icon.collapsed.svelte-1b8g4ty.svelte-1b8g4ty{transform:rotate(-90deg)}.json-label.svelte-1b8g4ty.svelte-1b8g4ty{color:#374151;font-weight:500}.copy-button.svelte-1b8g4ty.svelte-1b8g4ty{background:#3b82f6;color:#fff;border:none;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;cursor:pointer;transition:all .2s ease}.copy-button.svelte-1b8g4ty.svelte-1b8g4ty:hover{background:#2563eb}.copy-button.success.svelte-1b8g4ty.svelte-1b8g4ty{background:#10b981}.json-content.svelte-1b8g4ty.svelte-1b8g4ty{overflow:auto;max-height:400px}.json-code.svelte-1b8g4ty.svelte-1b8g4ty{margin:0;padding:0;background:transparent;border:none;overflow:visible}.json-code.svelte-1b8g4ty code.svelte-1b8g4ty{display:block;padding:1rem;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.8125rem;line-height:1.5;background:transparent;color:#374151;white-space:pre-wrap;word-break:break-word;border:none}@media (max-width: 640px){.json-header.svelte-1b8g4ty.svelte-1b8g4ty{padding:.375rem .5rem;font-size:.8125rem}.json-code.svelte-1b8g4ty.svelte-1b8g4ty{padding:.75rem .5rem;font-size:.75rem}.copy-button.svelte-1b8g4ty.svelte-1b8g4ty{padding:.1875rem .375rem;font-size:.6875rem}}table .json-viewer{margin:.25rem 0;font-size:.75rem}table .json-content{max-height:200px}table .json-code{padding:.5rem;font-size:.6875rem}.yaml-viewer.svelte-yn00t6.svelte-yn00t6{border:1px solid #e5e7eb;border-radius:.375rem;background:#f9fafb;margin:.5rem 0;overflow:hidden}.yaml-header.svelte-yn00t6.svelte-yn00t6{display:flex;justify-content:space-between;align-items:center;padding:.5rem .75rem;background:#f3f4f6;border-bottom:1px solid #e5e7eb;font-size:.875rem;font-weight:500}.collapse-button.svelte-yn00t6.svelte-yn00t6{display:flex;align-items:center;gap:.5rem;background:none;border:none;color:#374151;cursor:pointer;font-size:.875rem;font-weight:500}.collapse-button.svelte-yn00t6.svelte-yn00t6:hover{color:#111827}.collapse-icon.svelte-yn00t6.svelte-yn00t6{transition:transform .2s ease;font-size:.75rem}.collapse-icon.collapsed.svelte-yn00t6.svelte-yn00t6{transform:rotate(-90deg)}.yaml-label.svelte-yn00t6.svelte-yn00t6{color:#374151;font-weight:500}.copy-button.svelte-yn00t6.svelte-yn00t6{background:#3b82f6;color:#fff;border:none;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;cursor:pointer;transition:all .2s ease}.copy-button.svelte-yn00t6.svelte-yn00t6:hover{background:#2563eb}.copy-button.success.svelte-yn00t6.svelte-yn00t6{background:#10b981}.yaml-content.svelte-yn00t6.svelte-yn00t6{overflow:auto;max-height:400px}.yaml-code.svelte-yn00t6.svelte-yn00t6{margin:0;padding:0;background:transparent;border:none;overflow:visible}.yaml-code.svelte-yn00t6 code.svelte-yn00t6{display:block;padding:1rem;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.8125rem;line-height:1.6;background:transparent;color:#374151;white-space:pre-wrap;word-break:break-word;border:none}@media (max-width: 640px){.yaml-header.svelte-yn00t6.svelte-yn00t6{padding:.375rem .5rem;font-size:.8125rem}.yaml-code.svelte-yn00t6.svelte-yn00t6{padding:.75rem .5rem;font-size:.75rem}.copy-button.svelte-yn00t6.svelte-yn00t6{padding:.1875rem .375rem;font-size:.6875rem}}table .yaml-viewer{margin:.25rem 0;font-size:.75rem}table .yaml-content{max-height:200px}table .yaml-code{padding:.5rem;font-size:.6875rem}td.svelte-gl9h79{text-align:left}td.labelColumn.svelte-gl9h79{text-align:right;background-color:var(--lt-grey);font-weight:700;width:12%;white-space:nowrap}.tableContainer.svelte-q3hq57{overflow:auto}th.svelte-q3hq57{position:sticky;top:-1px;z-index:2;white-space:nowrap;background:var(--white)}.mainContainer.svelte-mqeomk{max-width:110rem}main.svelte-mqeomk{flex:0 1 auto;max-width:100rem;padding:1.5rem}@media (min-width: 60rem){main.svelte-mqeomk{margin-left:var(--aside-width)}}.embed main{margin:0 auto;min-width:80%}.modal.svelte-1hhf5ym{align-items:center;background:#00000080;bottom:0;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;width:100%;z-index:100}.modalContainer>*{background-color:#fff;border-radius:5px;cursor:default;flex:0 1 auto;padding:1rem;position:relative}.modal img{max-height:80vh!important}.cancelButton.svelte-1hhf5ym{color:#fff;cursor:pointer;font-size:2rem;position:absolute;right:1rem;top:1rem}.cancelButton.svelte-1hhf5ym:hover{color:var(--blue)}.nav.svelte-1kdpgko.svelte-1kdpgko{border-radius:0 0 5px;display:none;margin:0;top:0}ul.navList.svelte-1kdpgko.svelte-1kdpgko{list-style-type:none}ul.navList.svelte-1kdpgko ul.svelte-1kdpgko{margin:.5rem 1rem 2rem}.navList.svelte-1kdpgko li.svelte-1kdpgko{display:block;margin:0}.navItem.svelte-1kdpgko li.svelte-1kdpgko:hover{color:var(--blue)}.pageId.svelte-1kdpgko.svelte-1kdpgko{display:block;border-bottom:1px solid var(--grey);padding:0 .5rem;margin-bottom:1rem}@media (min-width: 60rem){.nav.svelte-1kdpgko.svelte-1kdpgko{display:block}ul.navList.svelte-1kdpgko.svelte-1kdpgko{text-align:left}.navList.svelte-1kdpgko li.svelte-1kdpgko{display:block;margin:.5rem 0}}.container.svelte-teyund{width:100%;display:flex;flex-direction:column;position:relative}
|