ob-metaflow 2.18.9.1__tar.gz → 2.18.9.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ob-metaflow might be problematic. Click here for more details.

Files changed (450) hide show
  1. {ob_metaflow-2.18.9.1/ob_metaflow.egg-info → ob_metaflow-2.18.9.2}/PKG-INFO +2 -2
  2. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cards.py +3 -0
  3. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/parameters.py +4 -0
  4. ob_metaflow-2.18.9.2/metaflow/plugins/cards/card_modules/bundle.css +1 -0
  5. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/components.py +341 -0
  6. ob_metaflow-2.18.9.2/metaflow/plugins/cards/card_modules/json_viewer.py +232 -0
  7. ob_metaflow-2.18.9.2/metaflow/plugins/cards/card_modules/main.js +269 -0
  8. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/click_api.py +12 -0
  9. ob_metaflow-2.18.9.2/metaflow/version.py +1 -0
  10. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2/ob_metaflow.egg-info}/PKG-INFO +2 -2
  11. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/ob_metaflow.egg-info/SOURCES.txt +1 -0
  12. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/ob_metaflow.egg-info/requires.txt +1 -1
  13. ob_metaflow-2.18.9.1/metaflow/plugins/cards/card_modules/bundle.css +0 -1
  14. ob_metaflow-2.18.9.1/metaflow/plugins/cards/card_modules/main.js +0 -254
  15. ob_metaflow-2.18.9.1/metaflow/version.py +0 -1
  16. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/LICENSE +0 -0
  17. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/MANIFEST.in +0 -0
  18. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/README.md +0 -0
  19. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/devtools/Makefile +0 -0
  20. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/devtools/Tiltfile +0 -0
  21. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/devtools/pick_services.sh +0 -0
  22. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/R.py +0 -0
  23. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/__init__.py +0 -0
  24. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/__init__.py +0 -0
  25. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/__init__.py +0 -0
  26. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  27. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/_compat.py +0 -0
  28. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/_termui_impl.py +0 -0
  29. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/_textwrap.py +0 -0
  30. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/_unicodefun.py +0 -0
  31. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/_winconsole.py +0 -0
  32. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/core.py +0 -0
  33. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/decorators.py +0 -0
  34. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/exceptions.py +0 -0
  35. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/formatting.py +0 -0
  36. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/globals.py +0 -0
  37. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/parser.py +0 -0
  38. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/termui.py +0 -0
  39. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/testing.py +0 -0
  40. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/types.py +0 -0
  41. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/click/utils.py +0 -0
  42. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/imghdr/__init__.py +0 -0
  43. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  44. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  45. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  46. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  47. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  48. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  49. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  50. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  51. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  52. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/__init__.py +0 -0
  53. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/_elffile.py +0 -0
  54. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  55. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  56. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/_parser.py +0 -0
  57. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/_structures.py +0 -0
  58. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  59. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/markers.py +0 -0
  60. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/py.typed +0 -0
  61. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/requirements.py +0 -0
  62. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/specifiers.py +0 -0
  63. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/tags.py +0 -0
  64. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/utils.py +0 -0
  65. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/packaging/version.py +0 -0
  66. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/__init__.py +0 -0
  67. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  68. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_config.py +0 -0
  69. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  70. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  71. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_functions.py +0 -0
  72. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  73. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_memo.py +0 -0
  74. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  75. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  76. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  77. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  78. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/_utils.py +0 -0
  79. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typeguard/py.typed +0 -0
  80. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/typing_extensions.py +0 -0
  81. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/__init__.py +0 -0
  82. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  83. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  84. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  85. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  86. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  87. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  88. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  89. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  90. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  91. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  92. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_6/zipp.py +0 -0
  93. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/__init__.py +0 -0
  94. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/__init__.py +0 -0
  95. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +0 -0
  96. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_collections.py +0 -0
  97. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_compat.py +0 -0
  98. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_functools.py +0 -0
  99. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +0 -0
  100. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_meta.py +0 -0
  101. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/_text.py +0 -0
  102. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
  103. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/__init__.py +0 -0
  104. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_checkers.py +0 -0
  105. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_config.py +0 -0
  106. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_decorators.py +0 -0
  107. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_exceptions.py +0 -0
  108. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_functions.py +0 -0
  109. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_importhook.py +0 -0
  110. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_memo.py +0 -0
  111. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +0 -0
  112. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_suppression.py +0 -0
  113. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_transformer.py +0 -0
  114. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_union_transformer.py +0 -0
  115. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/_utils.py +0 -0
  116. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
  117. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/typing_extensions.py +0 -0
  118. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/v3_7/zipp.py +0 -0
  119. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/__init__.py +0 -0
  120. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/composer.py +0 -0
  121. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/constructor.py +0 -0
  122. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/cyaml.py +0 -0
  123. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/dumper.py +0 -0
  124. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/emitter.py +0 -0
  125. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/error.py +0 -0
  126. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/events.py +0 -0
  127. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/loader.py +0 -0
  128. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/nodes.py +0 -0
  129. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/parser.py +0 -0
  130. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/reader.py +0 -0
  131. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/representer.py +0 -0
  132. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/resolver.py +0 -0
  133. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/scanner.py +0 -0
  134. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/serializer.py +0 -0
  135. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/yaml/tokens.py +0 -0
  136. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/_vendor/zipp.py +0 -0
  137. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli.py +0 -0
  138. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_args.py +0 -0
  139. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_components/__init__.py +0 -0
  140. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_components/dump_cmd.py +0 -0
  141. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_components/init_cmd.py +0 -0
  142. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_components/run_cmds.py +0 -0
  143. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_components/step_cmd.py +0 -0
  144. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cli_components/utils.py +0 -0
  145. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/client/__init__.py +0 -0
  146. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/client/core.py +0 -0
  147. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/client/filecache.py +0 -0
  148. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/clone_util.py +0 -0
  149. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/__init__.py +0 -0
  150. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/code/__init__.py +0 -0
  151. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/configure_cmd.py +0 -0
  152. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/develop/__init__.py +0 -0
  153. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/develop/stub_generator.py +0 -0
  154. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/develop/stubs.py +0 -0
  155. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/main_cli.py +0 -0
  156. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/make_wrapper.py +0 -0
  157. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/tutorials_cmd.py +0 -0
  158. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd/util.py +0 -0
  159. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/cmd_with_io.py +0 -0
  160. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/__init__.py +0 -0
  161. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/content_addressed_store.py +0 -0
  162. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/datastore_set.py +0 -0
  163. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/datastore_storage.py +0 -0
  164. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/exceptions.py +0 -0
  165. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/flow_datastore.py +0 -0
  166. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/inputs.py +0 -0
  167. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/datastore/task_datastore.py +0 -0
  168. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/debug.py +0 -0
  169. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/decorators.py +0 -0
  170. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/event_logger.py +0 -0
  171. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/events.py +0 -0
  172. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/exception.py +0 -0
  173. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/extension_support/__init__.py +0 -0
  174. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/extension_support/_empty_file.py +0 -0
  175. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/extension_support/cmd.py +0 -0
  176. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/extension_support/integrations.py +0 -0
  177. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/extension_support/plugins.py +0 -0
  178. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/flowspec.py +0 -0
  179. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/graph.py +0 -0
  180. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/includefile.py +0 -0
  181. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/integrations.py +0 -0
  182. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/lint.py +0 -0
  183. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/meta_files.py +0 -0
  184. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metadata_provider/__init__.py +0 -0
  185. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metadata_provider/heartbeat.py +0 -0
  186. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metadata_provider/metadata.py +0 -0
  187. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metadata_provider/util.py +0 -0
  188. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_config.py +0 -0
  189. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_config_funcs.py +0 -0
  190. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_current.py +0 -0
  191. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_environment.py +0 -0
  192. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_git.py +0 -0
  193. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_profile.py +0 -0
  194. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/metaflow_version.py +0 -0
  195. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/mflog/__init__.py +0 -0
  196. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/mflog/mflog.py +0 -0
  197. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/mflog/save_logs.py +0 -0
  198. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/mflog/save_logs_periodically.py +0 -0
  199. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/mflog/tee.py +0 -0
  200. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/monitor.py +0 -0
  201. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/multicore_utils.py +0 -0
  202. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/package/__init__.py +0 -0
  203. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/packaging_sys/__init__.py +0 -0
  204. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/packaging_sys/backend.py +0 -0
  205. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/packaging_sys/distribution_support.py +0 -0
  206. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/packaging_sys/tar_backend.py +0 -0
  207. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/packaging_sys/utils.py +0 -0
  208. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/packaging_sys/v1.py +0 -0
  209. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/__init__.py +0 -0
  210. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/__init__.py +0 -0
  211. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/airflow.py +0 -0
  212. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  213. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  214. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  215. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/dag.py +0 -0
  216. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/exception.py +0 -0
  217. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  218. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  219. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  220. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  221. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  222. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  223. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/__init__.py +0 -0
  224. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_client.py +0 -0
  225. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_events.py +0 -0
  226. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_workflows.py +0 -0
  227. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  228. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  229. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  230. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  231. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/capture_error.py +0 -0
  232. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/conditional_input_paths.py +0 -0
  233. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/exit_hooks.py +0 -0
  234. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  235. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  236. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/__init__.py +0 -0
  237. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/aws_client.py +0 -0
  238. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/aws_utils.py +0 -0
  239. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/batch/__init__.py +0 -0
  240. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/batch/batch.py +0 -0
  241. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  242. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  243. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  244. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  245. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  246. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  247. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  248. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  249. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  250. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  251. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  252. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  253. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  254. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  255. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  256. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  257. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  258. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/__init__.py +0 -0
  259. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/azure_credential.py +0 -0
  260. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  261. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  262. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/azure_tail.py +0 -0
  263. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/azure_utils.py +0 -0
  264. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  265. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/azure/includefile_support.py +0 -0
  266. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/__init__.py +0 -0
  267. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_cli.py +0 -0
  268. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_client.py +0 -0
  269. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_creator.py +0 -0
  270. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_datastore.py +0 -0
  271. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_decorator.py +0 -0
  272. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  273. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/base.html +0 -0
  274. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  275. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/card.py +0 -0
  276. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  277. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  278. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  279. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  280. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  281. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  282. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/main.css +0 -0
  283. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  284. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  285. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_resolver.py +0 -0
  286. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_server.py +0 -0
  287. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  288. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/component_serializer.py +0 -0
  289. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/exception.py +0 -0
  290. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/cards/metadata.py +0 -0
  291. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/catch_decorator.py +0 -0
  292. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datastores/__init__.py +0 -0
  293. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datastores/azure_storage.py +0 -0
  294. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datastores/gs_storage.py +0 -0
  295. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datastores/local_storage.py +0 -0
  296. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datastores/s3_storage.py +0 -0
  297. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/__init__.py +0 -0
  298. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/local.py +0 -0
  299. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  300. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/s3/s3.py +0 -0
  301. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  302. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  303. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  304. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/debug_logger.py +0 -0
  305. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/debug_monitor.py +0 -0
  306. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/__init__.py +0 -0
  307. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/client.py +0 -0
  308. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/client_modules.py +0 -0
  309. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  310. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  311. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  312. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  313. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  314. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  315. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  316. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  317. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  318. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  319. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/consts.py +0 -0
  320. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  321. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  322. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  323. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/server.py +0 -0
  324. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/stub.py +0 -0
  325. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/env_escape/utils.py +0 -0
  326. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/environment_decorator.py +0 -0
  327. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/events_decorator.py +0 -0
  328. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/exit_hook/__init__.py +0 -0
  329. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/exit_hook/exit_hook_decorator.py +0 -0
  330. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/exit_hook/exit_hook_script.py +0 -0
  331. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/frameworks/__init__.py +0 -0
  332. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/frameworks/pytorch.py +0 -0
  333. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/__init__.py +0 -0
  334. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  335. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  336. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  337. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/gs_tail.py +0 -0
  338. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/gs_utils.py +0 -0
  339. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/gcp/includefile_support.py +0 -0
  340. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/__init__.py +0 -0
  341. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  342. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  343. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  344. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  345. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
  346. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  347. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  348. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  349. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  350. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/logs_cli.py +0 -0
  351. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  352. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/metadata_providers/local.py +0 -0
  353. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/metadata_providers/service.py +0 -0
  354. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/package_cli.py +0 -0
  355. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/parallel_decorator.py +0 -0
  356. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/parsers.py +0 -0
  357. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/project_decorator.py +0 -0
  358. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/__init__.py +0 -0
  359. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/bootstrap.py +0 -0
  360. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  361. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/conda_environment.py +0 -0
  362. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/micromamba.py +0 -0
  363. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/parsers.py +0 -0
  364. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/pip.py +0 -0
  365. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  366. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  367. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/pypi/utils.py +0 -0
  368. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/resources_decorator.py +0 -0
  369. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/retry_decorator.py +0 -0
  370. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/secrets/__init__.py +0 -0
  371. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  372. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  373. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/secrets/secrets_func.py +0 -0
  374. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/secrets/secrets_spec.py +0 -0
  375. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/secrets/utils.py +0 -0
  376. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/storage_executor.py +0 -0
  377. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/tag_cli.py +0 -0
  378. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  379. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/timeout_decorator.py +0 -0
  380. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/uv/__init__.py +0 -0
  381. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/uv/bootstrap.py +0 -0
  382. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/plugins/uv/uv_environment.py +0 -0
  383. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/procpoll.py +0 -0
  384. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/py.typed +0 -0
  385. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/pylint_wrapper.py +0 -0
  386. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/__init__.py +0 -0
  387. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/deployer.py +0 -0
  388. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/deployer_impl.py +0 -0
  389. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/metaflow_runner.py +0 -0
  390. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/nbdeploy.py +0 -0
  391. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/nbrun.py +0 -0
  392. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/subprocess_manager.py +0 -0
  393. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runner/utils.py +0 -0
  394. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/runtime.py +0 -0
  395. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/sidecar/__init__.py +0 -0
  396. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/sidecar/sidecar.py +0 -0
  397. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/sidecar/sidecar_messages.py +0 -0
  398. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  399. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/sidecar/sidecar_worker.py +0 -0
  400. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/system/__init__.py +0 -0
  401. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/system/system_logger.py +0 -0
  402. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/system/system_monitor.py +0 -0
  403. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/system/system_utils.py +0 -0
  404. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tagging_util.py +0 -0
  405. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/task.py +0 -0
  406. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tracing/__init__.py +0 -0
  407. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tracing/propagator.py +0 -0
  408. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tracing/span_exporter.py +0 -0
  409. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tracing/tracing_modules.py +0 -0
  410. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tuple_util.py +0 -0
  411. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/00-helloworld/README.md +0 -0
  412. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  413. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/01-playlist/README.md +0 -0
  414. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  415. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  416. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  417. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/02-statistics/README.md +0 -0
  418. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  419. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  420. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/02-statistics/stats.py +0 -0
  421. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  422. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  423. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  424. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  425. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  426. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  427. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  428. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  429. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  430. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/07-worldview/README.md +0 -0
  431. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  432. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/08-autopilot/README.md +0 -0
  433. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  434. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/unbounded_foreach.py +0 -0
  435. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_configs/__init__.py +0 -0
  436. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_configs/config_options.py +0 -0
  437. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_configs/config_parameters.py +0 -0
  438. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_decorators/__init__.py +0 -0
  439. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_decorators/common.py +0 -0
  440. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_decorators/mutable_flow.py +0 -0
  441. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_decorators/mutable_step.py +0 -0
  442. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_decorators/user_flow_decorator.py +0 -0
  443. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/user_decorators/user_step_decorator.py +0 -0
  444. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/util.py +0 -0
  445. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/metaflow/vendor.py +0 -0
  446. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  447. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/ob_metaflow.egg-info/entry_points.txt +0 -0
  448. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/ob_metaflow.egg-info/top_level.txt +0 -0
  449. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/setup.cfg +0 -0
  450. {ob_metaflow-2.18.9.1 → ob_metaflow-2.18.9.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-metaflow
3
- Version: 2.18.9.1
3
+ Version: 2.18.9.2
4
4
  Summary: Metaflow: More AI and ML, Less Engineering
5
5
  Author: Netflix, Outerbounds & the Metaflow Community
6
6
  Author-email: help@outerbounds.co
@@ -12,7 +12,7 @@ Requires-Dist: boto3
12
12
  Requires-Dist: pylint
13
13
  Requires-Dist: kubernetes
14
14
  Provides-Extra: stubs
15
- Requires-Dist: metaflow-stubs==2.18.9.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.18.9.2; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -10,6 +10,9 @@ from metaflow.plugins.cards.card_modules.components import (
10
10
  ProgressBar,
11
11
  ValueBox,
12
12
  PythonCode,
13
+ EventsTimeline,
14
+ JSONViewer,
15
+ YAMLViewer,
13
16
  )
14
17
  from metaflow.plugins.cards.card_modules.basic import (
15
18
  DefaultCard,
@@ -495,6 +495,10 @@ def add_custom_parameters(deploy_mode=False):
495
495
  # deploy_mode determines whether deploy-time functions should or should
496
496
  # not be evaluated for this command
497
497
  def wrapper(cmd):
498
+ # Save the original params once, if they haven't been saved before.
499
+ if not hasattr(cmd, "original_params"):
500
+ cmd.original_params = list(cmd.params)
501
+
498
502
  cmd.has_flow_params = True
499
503
  # Iterate over parameters in reverse order so cmd.params lists options
500
504
  # in the order they are defined in the FlowSpec subclass
@@ -0,0 +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-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}
@@ -12,6 +12,7 @@ from .basic import (
12
12
  from .card import MetaflowCardComponent, with_default_component_id
13
13
  from .convert_to_native_type import TaskToDict, _full_classname
14
14
  from .renderer_tools import render_safely
15
+ from .json_viewer import JSONViewer as _JSONViewer, YAMLViewer as _YAMLViewer
15
16
  import uuid
16
17
  import inspect
17
18
 
@@ -1099,3 +1100,343 @@ class PythonCode(UserComponent):
1099
1100
  _code_component = PythonCodeComponent(self._code_string)
1100
1101
  _code_component.component_id = self.component_id
1101
1102
  return _code_component.render()
1103
+
1104
+
1105
+ class EventsTimeline(UserComponent):
1106
+ """
1107
+ An events timeline component for displaying structured log messages in real-time.
1108
+
1109
+ This component displays events in a timeline format with the latest events at the top.
1110
+ Each event can contain structured data including other UserComponents for rich display.
1111
+
1112
+ Example: Basic usage
1113
+ ```python
1114
+ @card
1115
+ @step
1116
+ def my_step(self):
1117
+ from metaflow.cards import EventsTimeline
1118
+ from metaflow import current
1119
+
1120
+ # Create an events component
1121
+ events = EventsTimeline(title="Processing Events")
1122
+ current.card.append(events)
1123
+
1124
+ # Add events during processing
1125
+ for i in range(10):
1126
+ events.update(
1127
+ event_data={
1128
+ "timestamp": datetime.now().isoformat(),
1129
+ "event_type": "processing",
1130
+ "item_id": i,
1131
+ "status": "completed",
1132
+ "duration_ms": random.randint(100, 500)
1133
+ }
1134
+ )
1135
+ time.sleep(1)
1136
+ ```
1137
+
1138
+ Example: With styling and rich components
1139
+ ```python
1140
+ from metaflow.cards import EventsTimeline, Markdown, PythonCode
1141
+
1142
+ events = EventsTimeline(title="Agent Actions")
1143
+ current.card.append(events)
1144
+
1145
+ # Event with styling
1146
+ events.update(
1147
+ event_data={
1148
+ "action": "tool_call",
1149
+ "function": "get_weather",
1150
+ "result": "Success"
1151
+ },
1152
+ style_theme="success"
1153
+ )
1154
+
1155
+ # Event with rich components
1156
+ events.update(
1157
+ event_data={
1158
+ "action": "code_execution",
1159
+ "status": "completed"
1160
+ },
1161
+ payloads={
1162
+ "code": PythonCode(code_string="print('Hello World')"),
1163
+ "notes": Markdown("**Important**: This ran successfully")
1164
+ },
1165
+ style_theme="info"
1166
+ )
1167
+ ```
1168
+
1169
+ Parameters
1170
+ ----------
1171
+ title : str, optional
1172
+ Title for the events timeline.
1173
+ max_events : int, default 100
1174
+ Maximum number of events to display. Older events are removed from display
1175
+ but total count is still tracked. Stats and relative time display are always enabled.
1176
+ """
1177
+
1178
+ type = "eventsTimeline"
1179
+
1180
+ REALTIME_UPDATABLE = True
1181
+
1182
+ # Valid style themes
1183
+ VALID_THEMES = {
1184
+ "default",
1185
+ "success",
1186
+ "warning",
1187
+ "error",
1188
+ "info",
1189
+ "primary",
1190
+ "secondary",
1191
+ "tool_call",
1192
+ "ai_response",
1193
+ }
1194
+
1195
+ def __init__(
1196
+ self,
1197
+ title: Optional[str] = None,
1198
+ max_events: int = 100,
1199
+ ):
1200
+ self._title = title
1201
+ self._max_events = max_events
1202
+ self._events = []
1203
+
1204
+ # Metadata tracking
1205
+ self._total_events_count = 0
1206
+ self._first_event_time = None
1207
+ self._last_update_time = None
1208
+ self._finished = False
1209
+
1210
+ def update(
1211
+ self,
1212
+ event_data: dict,
1213
+ style_theme: Optional[str] = None,
1214
+ priority: Optional[str] = None,
1215
+ payloads: Optional[dict] = None,
1216
+ finished: Optional[bool] = None,
1217
+ ):
1218
+ """
1219
+ Add a new event to the timeline.
1220
+
1221
+ Parameters
1222
+ ----------
1223
+ event_data : dict
1224
+ Basic event metadata (strings, numbers, simple values only).
1225
+ This appears in the main event display area.
1226
+ style_theme : str, optional
1227
+ Visual theme for this event. Valid values: 'default', 'success', 'warning',
1228
+ 'error', 'info', 'primary', 'secondary', 'tool_call', 'ai_response'.
1229
+ priority : str, optional
1230
+ Priority level for the event ('low', 'normal', 'high', 'critical').
1231
+ Affects visual prominence.
1232
+ payloads : dict, optional
1233
+ Rich payload components that will be displayed in collapsible sections.
1234
+ Values must be UserComponent instances: ValueBox, Image, Markdown,
1235
+ Artifact, JSONViewer, YAMLViewer. VegaChart is not supported inside EventsTimeline.
1236
+ finished : bool, optional
1237
+ Mark the timeline as finished. When True, the status indicator will show
1238
+ "Finished" in the header.
1239
+ """
1240
+ import time
1241
+
1242
+ # Validate style_theme
1243
+ if style_theme is not None and style_theme not in self.VALID_THEMES:
1244
+ import re
1245
+
1246
+ if not re.match(r"^[a-zA-Z][a-zA-Z0-9_-]*$", style_theme):
1247
+ raise ValueError(
1248
+ f"Invalid style_theme '{style_theme}'. Must be a valid CSS class name."
1249
+ )
1250
+
1251
+ # Validate payloads contain only allowed UserComponents
1252
+ if payloads is not None:
1253
+ allowed_components = (
1254
+ ValueBox,
1255
+ Image,
1256
+ Markdown,
1257
+ Artifact,
1258
+ PythonCode,
1259
+ _JSONViewer,
1260
+ _YAMLViewer,
1261
+ )
1262
+ for key, payload in payloads.items():
1263
+ if not isinstance(payload, allowed_components):
1264
+ raise TypeError(
1265
+ f"Payload '{key}' must be one of: ValueBox, Image, Markdown, "
1266
+ f"Artifact, JSONViewer, YAMLViewer. Got {type(payload).__name__}"
1267
+ )
1268
+
1269
+ # Add timestamp if not provided
1270
+ if "timestamp" not in event_data:
1271
+ event_data["timestamp"] = time.time()
1272
+
1273
+ # Create event object with metadata and payloads
1274
+ event = {
1275
+ "metadata": event_data,
1276
+ "payloads": payloads or {},
1277
+ "event_id": f"event_{self._total_events_count}",
1278
+ "received_at": time.time(),
1279
+ }
1280
+
1281
+ # Add styling metadata if provided
1282
+ if style_theme is not None:
1283
+ event["style_theme"] = style_theme
1284
+ if priority is not None:
1285
+ event["priority"] = priority
1286
+
1287
+ # Update metadata
1288
+ self._total_events_count += 1
1289
+ self._last_update_time = time.time()
1290
+ if self._first_event_time is None:
1291
+ self._first_event_time = time.time()
1292
+
1293
+ # Update finished status if provided
1294
+ if finished is not None:
1295
+ self._finished = finished
1296
+
1297
+ # Add the event to the beginning of the list (latest first)
1298
+ self._events.insert(0, event)
1299
+
1300
+ # Trim displayed events if we exceed max_events
1301
+ if len(self._events) > self._max_events:
1302
+ self._events = self._events[: self._max_events]
1303
+
1304
+ def get_stats(self) -> dict:
1305
+ """
1306
+ Get timeline statistics.
1307
+
1308
+ Returns
1309
+ -------
1310
+ dict
1311
+ Statistics including total events, display count, timing info, etc.
1312
+ """
1313
+ import time
1314
+
1315
+ current_time = time.time()
1316
+
1317
+ stats = {
1318
+ "total_events": self._total_events_count,
1319
+ "displayed_events": len(self._events),
1320
+ "last_update": self._last_update_time,
1321
+ "first_event": self._first_event_time,
1322
+ }
1323
+
1324
+ # seconds_since_last_update removed; UI derives recency from last event timestamp
1325
+
1326
+ # Add finished status
1327
+ stats["finished"] = self._finished
1328
+
1329
+ if self._first_event_time and self._total_events_count > 1:
1330
+ runtime = self._last_update_time - self._first_event_time
1331
+ if runtime > 0:
1332
+ stats["events_per_minute"] = round(
1333
+ (self._total_events_count / runtime) * 60, 1
1334
+ )
1335
+ stats["total_runtime_seconds"] = round(runtime, 1)
1336
+
1337
+ return stats
1338
+
1339
+ def _render_subcomponents(self):
1340
+ """
1341
+ Render any UserComponents within event payloads.
1342
+ """
1343
+ rendered_events = []
1344
+
1345
+ for event in self._events:
1346
+ rendered_event = dict(event) # Copy event metadata
1347
+
1348
+ # Event metadata should only contain simple values (no components)
1349
+ rendered_event["metadata"] = event["metadata"]
1350
+
1351
+ # Render payload components
1352
+ rendered_payloads = {}
1353
+ for key, payload in event["payloads"].items():
1354
+ if isinstance(payload, MetaflowCardComponent):
1355
+ # Render the component
1356
+ rendered_payloads[key] = payload.render()
1357
+ else:
1358
+ # This shouldn't happen due to validation, but handle gracefully
1359
+ rendered_payloads[key] = str(payload)
1360
+
1361
+ rendered_event["payloads"] = rendered_payloads
1362
+ rendered_events.append(rendered_event)
1363
+
1364
+ return rendered_events
1365
+
1366
+ @with_default_component_id
1367
+ @render_safely
1368
+ def render(self):
1369
+ data = {
1370
+ "type": self.type,
1371
+ "id": self.component_id,
1372
+ "events": self._render_subcomponents(),
1373
+ "config": {
1374
+ "show_stats": True,
1375
+ "show_relative_time": True,
1376
+ "max_events": self._max_events,
1377
+ },
1378
+ }
1379
+
1380
+ if self._title is not None:
1381
+ data["title"] = self._title
1382
+
1383
+ # Always include stats
1384
+ data["stats"] = self.get_stats()
1385
+
1386
+ return data
1387
+
1388
+
1389
+ # Rich viewer components
1390
+ class JSONViewer(_JSONViewer, UserComponent):
1391
+ """
1392
+ A component for displaying JSON data with syntax highlighting and collapsible sections.
1393
+
1394
+ This component provides a rich view of JSON data with proper formatting, syntax highlighting,
1395
+ and the ability to collapse/expand sections for better readability.
1396
+
1397
+ Example:
1398
+ ```python
1399
+ from metaflow.cards import JSONViewer, EventsTimeline
1400
+ from metaflow import current
1401
+
1402
+ # Use in events timeline
1403
+ events = EventsTimeline(title="API Calls")
1404
+ events.update({
1405
+ "action": "api_request",
1406
+ "endpoint": "/users",
1407
+ "payload": JSONViewer({"user_id": 123, "fields": ["name", "email"]})
1408
+ })
1409
+
1410
+ # Use standalone
1411
+ data = {"config": {"debug": True, "timeout": 30}}
1412
+ current.card.append(JSONViewer(data, collapsible=True))
1413
+ ```
1414
+ """
1415
+
1416
+ pass
1417
+
1418
+
1419
+ class YAMLViewer(_YAMLViewer, UserComponent):
1420
+ """
1421
+ A component for displaying YAML data with syntax highlighting and collapsible sections.
1422
+
1423
+ This component provides a rich view of YAML data with proper formatting and syntax highlighting.
1424
+
1425
+ Example:
1426
+ ```python
1427
+ from metaflow.cards import YAMLViewer, EventsTimeline
1428
+ from metaflow import current
1429
+
1430
+ # Use in events timeline
1431
+ events = EventsTimeline(title="Configuration Changes")
1432
+ events.update({
1433
+ "action": "config_update",
1434
+ "config": YAMLViewer({
1435
+ "database": {"host": "localhost", "port": 5432},
1436
+ "features": ["auth", "logging"]
1437
+ })
1438
+ })
1439
+ ```
1440
+ """
1441
+
1442
+ pass
@@ -0,0 +1,232 @@
1
+ """
2
+ JSONViewer component for displaying JSON data with syntax highlighting and collapsible sections.
3
+ """
4
+
5
+ from typing import Any, Optional, Union
6
+ from .card import MetaflowCardComponent, with_default_component_id
7
+ from .renderer_tools import render_safely
8
+ import json
9
+ from metaflow._vendor import yaml
10
+
11
+
12
+ class JSONViewer(MetaflowCardComponent):
13
+ """
14
+ A component for displaying JSON data with syntax highlighting and collapsible sections.
15
+
16
+ This component provides a rich view of JSON data with proper formatting, syntax highlighting,
17
+ and the ability to collapse/expand sections for better readability.
18
+
19
+ Example:
20
+ ```python
21
+ from metaflow.cards import JSONViewer
22
+ from metaflow import current
23
+
24
+ data = {
25
+ "user": {"name": "Alice", "age": 30},
26
+ "items": [{"id": 1, "name": "Item 1"}, {"id": 2, "name": "Item 2"}],
27
+ "metadata": {"created": "2024-01-01", "version": "1.0"}
28
+ }
29
+
30
+ json_viewer = JSONViewer(data, collapsible=True, max_height="400px")
31
+ current.card.append(json_viewer)
32
+ ```
33
+
34
+ Parameters
35
+ ----------
36
+ data : Any
37
+ The data to display as JSON. Will be serialized using json.dumps().
38
+ collapsible : bool, default True
39
+ Whether to make the JSON viewer collapsible.
40
+ max_height : str, optional
41
+ Maximum height for the viewer (CSS value like "300px" or "20rem").
42
+ show_copy_button : bool, default True
43
+ Whether to show a copy-to-clipboard button.
44
+ """
45
+
46
+ type = "jsonViewer"
47
+
48
+ REALTIME_UPDATABLE = True
49
+
50
+ def __init__(
51
+ self,
52
+ data: Any,
53
+ collapsible: bool = True,
54
+ max_height: Optional[str] = None,
55
+ show_copy_button: bool = True,
56
+ title: Optional[str] = None,
57
+ ):
58
+ self._data = data
59
+ self._collapsible = collapsible
60
+ self._max_height = max_height
61
+ self._show_copy_button = show_copy_button
62
+ self._title = title
63
+
64
+ def update(self, data: Any):
65
+ """
66
+ Update the JSON data.
67
+
68
+ Parameters
69
+ ----------
70
+ data : Any
71
+ New data to display as JSON.
72
+ """
73
+ self._data = data
74
+
75
+ @with_default_component_id
76
+ @render_safely
77
+ def render(self):
78
+ # Serialize data to JSON string
79
+ try:
80
+ if isinstance(self._data, str):
81
+ # If already a string, try to parse and re-serialize for formatting
82
+ try:
83
+ parsed = json.loads(self._data)
84
+ json_string = json.dumps(parsed, indent=2, ensure_ascii=False)
85
+ except json.JSONDecodeError:
86
+ # If not valid JSON, treat as plain string
87
+ json_string = json.dumps(self._data, indent=2, ensure_ascii=False)
88
+ else:
89
+ json_string = json.dumps(
90
+ self._data, indent=2, ensure_ascii=False, default=str
91
+ )
92
+ except Exception as e:
93
+ # Fallback for non-serializable objects
94
+ json_string = json.dumps(
95
+ {"error": f"Could not serialize data: {str(e)}"}, indent=2
96
+ )
97
+
98
+ data = {
99
+ "type": self.type,
100
+ "id": self.component_id,
101
+ "json_string": json_string,
102
+ "collapsible": self._collapsible,
103
+ "show_copy_button": self._show_copy_button,
104
+ "title": self._title or "JSON",
105
+ }
106
+
107
+ if self._max_height:
108
+ data["max_height"] = self._max_height
109
+
110
+ return data
111
+
112
+
113
+ class YAMLViewer(MetaflowCardComponent):
114
+ """
115
+ A component for displaying YAML data with syntax highlighting and collapsible sections.
116
+
117
+ This component provides a rich view of YAML data with proper formatting and syntax highlighting.
118
+
119
+ Example:
120
+ ```python
121
+ from metaflow.cards import YAMLViewer
122
+ from metaflow import current
123
+
124
+ data = {
125
+ "database": {
126
+ "host": "localhost",
127
+ "port": 5432,
128
+ "credentials": {"username": "admin", "password": "secret"}
129
+ },
130
+ "features": ["auth", "logging", "monitoring"]
131
+ }
132
+
133
+ yaml_viewer = YAMLViewer(data, collapsible=True)
134
+ current.card.append(yaml_viewer)
135
+ ```
136
+
137
+ Parameters
138
+ ----------
139
+ data : Any
140
+ The data to display as YAML. Will be serialized to YAML format.
141
+ collapsible : bool, default True
142
+ Whether to make the YAML viewer collapsible.
143
+ max_height : str, optional
144
+ Maximum height for the viewer (CSS value like "300px" or "20rem").
145
+ show_copy_button : bool, default True
146
+ Whether to show a copy-to-clipboard button.
147
+ """
148
+
149
+ type = "yamlViewer"
150
+
151
+ REALTIME_UPDATABLE = True
152
+
153
+ def __init__(
154
+ self,
155
+ data: Any,
156
+ collapsible: bool = True,
157
+ max_height: Optional[str] = None,
158
+ show_copy_button: bool = True,
159
+ title: Optional[str] = None,
160
+ ):
161
+ self._data = data
162
+ self._collapsible = collapsible
163
+ self._max_height = max_height
164
+ self._show_copy_button = show_copy_button
165
+ self._title = title
166
+
167
+ def update(self, data: Any):
168
+ """
169
+ Update the YAML data.
170
+
171
+ Parameters
172
+ ----------
173
+ data : Any
174
+ New data to display as YAML.
175
+ """
176
+ self._data = data
177
+
178
+ def _to_yaml_string(self, data: Any) -> str:
179
+ """
180
+ Convert data to YAML string format using vendored YAML module.
181
+ """
182
+ try:
183
+ if isinstance(data, str):
184
+ # Try to parse as JSON first, then convert to YAML
185
+ try:
186
+ import json
187
+
188
+ parsed = json.loads(data)
189
+ yaml_result = yaml.dump(
190
+ parsed, default_flow_style=False, indent=2, sort_keys=False
191
+ )
192
+ return (
193
+ str(yaml_result)
194
+ if yaml_result is not None
195
+ else "# Empty YAML result"
196
+ )
197
+ except json.JSONDecodeError:
198
+ # If not JSON, return as-is
199
+ return data
200
+ else:
201
+ yaml_result = yaml.dump(
202
+ data, default_flow_style=False, indent=2, sort_keys=False
203
+ )
204
+ return (
205
+ str(yaml_result)
206
+ if yaml_result is not None
207
+ else "# Empty YAML result"
208
+ )
209
+ except Exception as e:
210
+ # Fallback to JSON on any error
211
+ import json
212
+
213
+ return f"# Error converting to YAML: {str(e)}\n{json.dumps(data, indent=2, default=str)}"
214
+
215
+ @with_default_component_id
216
+ @render_safely
217
+ def render(self):
218
+ yaml_string = self._to_yaml_string(self._data)
219
+
220
+ data = {
221
+ "type": self.type,
222
+ "id": self.component_id,
223
+ "yaml_string": yaml_string,
224
+ "collapsible": self._collapsible,
225
+ "show_copy_button": self._show_copy_button,
226
+ "title": self._title or "YAML",
227
+ }
228
+
229
+ if self._max_height:
230
+ data["max_height"] = self._max_height
231
+
232
+ return data