mujoco-mojo 2.3.6__tar.gz → 2.3.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/PKG-INFO +1 -1
  2. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/cli.py +64 -16
  3. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/reloaded.py +55 -11
  4. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.gitattributes +0 -0
  5. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.github/workflows/docs.yml +0 -0
  6. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.github/workflows/release.yml +0 -0
  7. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.gitignore +0 -0
  8. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.pre-commit-config.yaml +0 -0
  9. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.python-version +0 -0
  10. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/.vscode/settings.json +0 -0
  11. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/LICENSE +0 -0
  12. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/README.md +0 -0
  13. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/TODO.md +0 -0
  14. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/about.md +0 -0
  15. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/dark-hero-logo.png +0 -0
  16. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/dark-hero-logo.svg +0 -0
  17. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/dark-logo.svg +0 -0
  18. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/light-hero-logo.svg +0 -0
  19. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/light-logo.svg +0 -0
  20. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/logo.svg +0 -0
  21. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/bunny_original.jpg +0 -0
  22. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/bunny_with_coacd.jpg +0 -0
  23. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/bunny_without_coacd.jpg +0 -0
  24. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/frustums.jpg +0 -0
  25. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/proximity/convex_hull_wireframe.jpg +0 -0
  26. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/proximity/real_wireframe.jpg +0 -0
  27. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/with_coacd.jpg +0 -0
  28. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/mesh/without_coacd.jpg +0 -0
  29. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-export-options.jpg +0 -0
  30. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-monitor-view.jpg +0 -0
  31. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-mosaic-view.jpg +0 -0
  32. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-notes-editor.jpg +0 -0
  33. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-plot-editor.jpg +0 -0
  34. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-selector-bar.jpg +0 -0
  35. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/dark-shapes-editor.jpg +0 -0
  36. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/generate-result.jpg +0 -0
  37. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-export-options.jpg +0 -0
  38. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-monitor-view.jpg +0 -0
  39. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-mosaic-view.jpg +0 -0
  40. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-notes-editor.jpg +0 -0
  41. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-plot-editor.jpg +0 -0
  42. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-selector-bar.jpg +0 -0
  43. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/light-shapes-editor.jpg +0 -0
  44. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/assets/user-guides/runtime-anim.gif +0 -0
  45. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/index.md +0 -0
  46. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/javascripts/favicon-switcher.js +0 -0
  47. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/javascripts/mojo-highlighter.js +0 -0
  48. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/javascripts/tablesort.js +0 -0
  49. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/stylesheets/extra.css +0 -0
  50. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/MOJO_RUNTIME_REPORT.md +0 -0
  51. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/dojo.md +0 -0
  52. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/generate-script.md +0 -0
  53. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/getting-started.md +0 -0
  54. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/init.md +0 -0
  55. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/monitor.md +0 -0
  56. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/monte_carlo_example.py +0 -0
  57. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/mosaic.md +0 -0
  58. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/optimization.md +0 -0
  59. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/optimization_example.py +0 -0
  60. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/pose-context.md +0 -0
  61. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/pose_context_example.py +0 -0
  62. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/reloaded.md +0 -0
  63. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/running-jobs.md +0 -0
  64. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/docs/user-guides/runtime-script.md +0 -0
  65. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/examples/boxes_and_springs_monte_carlo.py +0 -0
  66. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/examples/boxes_and_springs_optimization.py +0 -0
  67. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/examples/tennis_racket_theorem.py +0 -0
  68. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/mkdocs.yml +0 -0
  69. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/pyproject.toml +0 -0
  70. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/requirements.txt +0 -0
  71. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/copy_docs_examples_to_examples.py +0 -0
  72. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/fix_smart_quotes.py +0 -0
  73. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/gen_ref_pages.py +0 -0
  74. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/gen_ts_models.py +0 -0
  75. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/templating/filestomake.txt +0 -0
  76. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/templating/make_sensors.py +0 -0
  77. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/scripts/templating/sensor_template.py +0 -0
  78. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/__about__.py +0 -0
  79. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/__init__.py +0 -0
  80. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/base.py +0 -0
  81. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/meta.py +0 -0
  82. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mj_state.py +0 -0
  83. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/__init__.py +0 -0
  84. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/defaults.py +0 -0
  85. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/dependency_path.py +0 -0
  86. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/extension.py +0 -0
  87. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/meta/__init__.py +0 -0
  88. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/meta/frame.py +0 -0
  89. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/meta/include.py +0 -0
  90. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/meta/replicate.py +0 -0
  91. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco.py +0 -0
  92. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/__init__.py +0 -0
  93. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator.py +0 -0
  94. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/__init__.py +0 -0
  95. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/adhesion.py +0 -0
  96. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/base.py +0 -0
  97. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/cylinder.py +0 -0
  98. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/damper.py +0 -0
  99. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/dcmotor.py +0 -0
  100. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/general.py +0 -0
  101. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/intvelocity.py +0 -0
  102. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/motor.py +0 -0
  103. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/muscle.py +0 -0
  104. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/plugin.py +0 -0
  105. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/position.py +0 -0
  106. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/actuator_attr/velocity.py +0 -0
  107. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset.py +0 -0
  108. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/__init__.py +0 -0
  109. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/hfield.py +0 -0
  110. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material.py +0 -0
  111. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/__init__.py +0 -0
  112. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/material_attr/layer.py +0 -0
  113. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/mesh.py +0 -0
  114. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/model.py +0 -0
  115. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/asset_attr/texture.py +0 -0
  116. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body.py +0 -0
  117. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/__init__.py +0 -0
  118. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/attach.py +0 -0
  119. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/camera.py +0 -0
  120. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite.py +0 -0
  121. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/__init__.py +0 -0
  122. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/geom.py +0 -0
  123. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/joint.py +0 -0
  124. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/site.py +0 -0
  125. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/composite_attr/skin.py +0 -0
  126. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp.py +0 -0
  127. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/__init__.py +0 -0
  128. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/contact.py +0 -0
  129. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/edge.py +0 -0
  130. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/elasticity.py +0 -0
  131. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/flexcomp_attr/pin.py +0 -0
  132. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/free_joint.py +0 -0
  133. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/geom.py +0 -0
  134. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/inertial.py +0 -0
  135. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/joint.py +0 -0
  136. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/light.py +0 -0
  137. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/plugin.py +0 -0
  138. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/body_attr/site.py +0 -0
  139. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/compiler.py +0 -0
  140. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/__init__.py +0 -0
  141. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/compiler_attr/lengthrange.py +0 -0
  142. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/contact.py +0 -0
  143. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/__init__.py +0 -0
  144. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/exclude.py +0 -0
  145. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/contact_attr/pair.py +0 -0
  146. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable.py +0 -0
  147. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/__init__.py +0 -0
  148. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex.py +0 -0
  149. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/__init__.py +0 -0
  150. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/contact.py +0 -0
  151. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/edge.py +0 -0
  152. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/flex_attr/elasticity.py +0 -0
  153. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin.py +0 -0
  154. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/__init__.py +0 -0
  155. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/deformable_attr/skin_attr/bone.py +0 -0
  156. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality.py +0 -0
  157. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/__init__.py +0 -0
  158. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/connect.py +0 -0
  159. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/equality_base.py +0 -0
  160. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flex.py +0 -0
  161. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexstrain.py +0 -0
  162. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/flexvert.py +0 -0
  163. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/joint.py +0 -0
  164. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/tendon.py +0 -0
  165. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/equality_attr/weld.py +0 -0
  166. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe.py +0 -0
  167. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/__init__.py +0 -0
  168. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/keyframe_attr/key.py +0 -0
  169. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/option.py +0 -0
  170. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/__init__.py +0 -0
  171. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/option_attr/flag.py +0 -0
  172. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor.py +0 -0
  173. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/__init__.py +0 -0
  174. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/accelerometer.py +0 -0
  175. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorfrc.py +0 -0
  176. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorpos.py +0 -0
  177. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/actuatorvel.py +0 -0
  178. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballangvel.py +0 -0
  179. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/ballquat.py +0 -0
  180. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base.py +0 -0
  181. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/base_collision.py +0 -0
  182. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/camprojection.py +0 -0
  183. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/clock.py +0 -0
  184. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/contact.py +0 -0
  185. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/distance.py +0 -0
  186. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_kinetic.py +0 -0
  187. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/e_potential.py +0 -0
  188. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/force.py +0 -0
  189. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangacc.py +0 -0
  190. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameangvel.py +0 -0
  191. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinacc.py +0 -0
  192. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framelinvel.py +0 -0
  193. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framepos.py +0 -0
  194. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framequat.py +0 -0
  195. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framexaxis.py +0 -0
  196. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/frameyaxis.py +0 -0
  197. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/framezaxis.py +0 -0
  198. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/fromto.py +0 -0
  199. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/gyro.py +0 -0
  200. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/insidesite.py +0 -0
  201. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointactuatorfrc.py +0 -0
  202. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitfrc.py +0 -0
  203. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitpos.py +0 -0
  204. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointlimitvel.py +0 -0
  205. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointpos.py +0 -0
  206. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/jointvel.py +0 -0
  207. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/magnetometer.py +0 -0
  208. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/normal.py +0 -0
  209. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/plugin.py +0 -0
  210. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/rangefinder.py +0 -0
  211. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreeangmom.py +0 -0
  212. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreecom.py +0 -0
  213. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/subtreelinvel.py +0 -0
  214. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tactile.py +0 -0
  215. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonactuatorfrc.py +0 -0
  216. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitfrc.py +0 -0
  217. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitpos.py +0 -0
  218. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonlimitvel.py +0 -0
  219. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonpos.py +0 -0
  220. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/tendonvel.py +0 -0
  221. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/torque.py +0 -0
  222. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/touch.py +0 -0
  223. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/user.py +0 -0
  224. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/sensor_attr/velocimeter.py +0 -0
  225. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/size.py +0 -0
  226. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/statistic.py +0 -0
  227. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon.py +0 -0
  228. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/__init__.py +0 -0
  229. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed.py +0 -0
  230. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/__init__.py +0 -0
  231. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/fixed_attr/joint.py +0 -0
  232. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial.py +0 -0
  233. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/__init__.py +0 -0
  234. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/geom.py +0 -0
  235. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/pulley.py +0 -0
  236. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/spatial_attr/site.py +0 -0
  237. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/tendon_attr/tendon_base.py +0 -0
  238. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual.py +0 -0
  239. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/__init__.py +0 -0
  240. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/global_.py +0 -0
  241. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/headlight.py +0 -0
  242. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/map.py +0 -0
  243. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/quality.py +0 -0
  244. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/rgba.py +0 -0
  245. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/mujoco_attr/visual_attr/scale.py +0 -0
  246. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/orientation.py +0 -0
  247. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/plugin.py +0 -0
  248. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/pose.py +0 -0
  249. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/pose_context.py +0 -0
  250. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/position.py +0 -0
  251. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mjcf/xml_model.py +0 -0
  252. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/mojo_model.py +0 -0
  253. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/runtime/__init__.py +0 -0
  254. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/runtime/load.py +0 -0
  255. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/runtime/runtime_manager.py +0 -0
  256. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/runtime/signal_manager.py +0 -0
  257. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/runtime/video_recorder.py +0 -0
  258. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/settings.py +0 -0
  259. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/stochas/__init__.py +0 -0
  260. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/__init__.py +0 -0
  261. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/dojo.sh +0 -0
  262. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/monte_carlo.py +0 -0
  263. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/optimization.py +0 -0
  264. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/reloaded.sh +0 -0
  265. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/run_mc.sh +0 -0
  266. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/templates/run_opt.sh +0 -0
  267. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/typing.py +0 -0
  268. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/__init__.py +0 -0
  269. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/color.py +0 -0
  270. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/dataframe.py +0 -0
  271. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/defaults.py +0 -0
  272. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/filters/__init__.py +0 -0
  273. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/filters/filters.py +0 -0
  274. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/interp.py +0 -0
  275. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/__init__.py +0 -0
  276. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/__init__.py +0 -0
  277. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/lab_executor.py +0 -0
  278. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/main.py +0 -0
  279. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/plot_config.py +0 -0
  280. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/routers/__init__.py +0 -0
  281. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/routers/monitor.py +0 -0
  282. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/routers/morph.py +0 -0
  283. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/routers/mosaic.py +0 -0
  284. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/routers/sensai.py +0 -0
  285. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/sensai/__init__.py +0 -0
  286. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/sensai/agent.py +0 -0
  287. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/shared.py +0 -0
  288. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/__init__.py +0 -0
  289. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/base.html +0 -0
  290. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/error.html +0 -0
  291. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/monitor.html +0 -0
  292. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/morph.html +0 -0
  293. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/mosaic.html +0 -0
  294. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/_sensai.html +0 -0
  295. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_chart.html +0 -0
  296. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_header.html +0 -0
  297. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_json_editor.html +0 -0
  298. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_lab_trigger.html +0 -0
  299. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_macros.html +0 -0
  300. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_media_player.html +0 -0
  301. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_overlays.html +0 -0
  302. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_series_panel.html +0 -0
  303. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_signal_lab.html +0 -0
  304. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/partials/trial_viewer/_trial_status.html +0 -0
  305. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/__init__.py +0 -0
  306. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/chime.mp3 +0 -0
  307. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/dark-logo.svg +0 -0
  308. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/__init__.py +0 -0
  309. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/main.js +0 -0
  310. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/monitor.js +0 -0
  311. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/mosaic.js +0 -0
  312. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/sensai.js +0 -0
  313. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts +0 -0
  314. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.d.ts.map +0 -0
  315. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/toast.js +0 -0
  316. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/js/trial-viewer.js +0 -0
  317. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/light-logo.svg +0 -0
  318. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/main.css +0 -0
  319. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/build.mjs +0 -0
  320. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package-lock.json +0 -0
  321. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/package.json +0 -0
  322. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/cm-bundle.ts +0 -0
  323. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/format.ts +0 -0
  324. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/options.ts +0 -0
  325. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/plot-config.generated.ts +0 -0
  326. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/lib/toast.ts +0 -0
  327. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/models.ts +0 -0
  328. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/monitor.ts +0 -0
  329. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/mosaic.ts +0 -0
  330. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/sensai.ts +0 -0
  331. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/store.ts +0 -0
  332. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/trial-viewer.ts +0 -0
  333. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/src/types/global.d.ts +0 -0
  334. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/ts/tsconfig.json +0 -0
  335. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/__init__.py +0 -0
  336. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/alpine.min.js +0 -0
  337. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/codemirror.bundle.js +0 -0
  338. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/confetti.browser.min.js +0 -0
  339. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/iro.min.js +0 -0
  340. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.css +0 -0
  341. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/litegraph.min.js +0 -0
  342. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/lz-string.min.js +0 -0
  343. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/plotly-3.4.0.min.js +0 -0
  344. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/static/vendored/tailwind.min.js +0 -0
  345. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/layers/dojo/templates/trial_viewer.html +0 -0
  346. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/log.py +0 -0
  347. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/proximity.py +0 -0
  348. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/proximity_mixin.py +0 -0
  349. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/runner.py +0 -0
  350. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/statusing.py +0 -0
  351. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/utils/utils.py +0 -0
  352. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/src/mujoco_mojo/visualization.py +0 -0
  353. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/.gitignore +0 -0
  354. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/make_skybox.py +0 -0
  355. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/meshes/ball.stl +0 -0
  356. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/meshes/bunny2.stl +0 -0
  357. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/meshes/cup.stl +0 -0
  358. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/body_test.py +0 -0
  359. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/equality_test.py +0 -0
  360. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/inertial_test.py +0 -0
  361. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/joint_test.py +0 -0
  362. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/mesh.py +0 -0
  363. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/mujoco_test.py +0 -0
  364. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/orientation_test.py +0 -0
  365. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/pos_test.py +0 -0
  366. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/pose_graph_test.py +0 -0
  367. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/pose_test.py +0 -0
  368. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/site_test.py +0 -0
  369. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/visualization_test.py +0 -0
  370. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/mjcf/xml_model_test.py +0 -0
  371. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/model_with_skybox.xml +0 -0
  372. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/monte_carlo_test/asset_image.png +0 -0
  373. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/monte_carlo_test/monte_carlo.py +0 -0
  374. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/monte_carlo_test/overrides.json +0 -0
  375. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/monte_carlo_test/running_with_slurm.sh +0 -0
  376. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/one_off/proximity/dojo.sh +0 -0
  377. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/one_off/proximity/reloaded.sh +0 -0
  378. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/one_off/proximity/run.sh +0 -0
  379. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/one_off/proximity/simulation.py +0 -0
  380. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/conftest.py +0 -0
  381. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/loads_test.py +0 -0
  382. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/mojo_model_test.py +0 -0
  383. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/monte_carlo_bumper.py +0 -0
  384. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/optimizer_bumper.py +0 -0
  385. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/runtime_manager_test.py +0 -0
  386. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/settings_test.py +0 -0
  387. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/runtime/signal_manager_test.py +0 -0
  388. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/smoke_test.py +0 -0
  389. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/test_writer.py +0 -0
  390. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/utils/color_test.py +0 -0
  391. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/utils/dataframe_test.py +0 -0
  392. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/utils/filter_test.py +0 -0
  393. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/utils/interp_test.py +0 -0
  394. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/utils/proximity_test.py +0 -0
  395. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/tests/utils/utils_test.py +0 -0
  396. {mujoco_mojo-2.3.6 → mujoco_mojo-2.3.7}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mujoco-mojo
3
- Version: 2.3.6
3
+ Version: 2.3.7
4
4
  Summary: A complete MJCF lifecycle and trial orchestration suite for MuJoCo, powered by Pydantic v2.
5
5
  Project-URL: Homepage, https://github.com/Hydrowelder/mujoco-mojo
6
6
  Project-URL: Documentation, https://hydrowelder.github.io/mujoco-mojo/
@@ -4,14 +4,18 @@ import ast
4
4
  import importlib
5
5
  import logging
6
6
  import sys
7
+ from collections.abc import Callable
7
8
  from enum import StrEnum
8
9
  from importlib.metadata import version
9
10
  from pathlib import Path
10
- from typing import Annotated, Any, Literal
11
+ from types import ModuleType
12
+ from typing import Annotated, Any, Literal, overload
11
13
 
12
14
  import typer
15
+ from rich.align import Align
13
16
  from rich.console import Console
14
17
  from rich.panel import Panel
18
+ from rich.text import Text
15
19
 
16
20
  # get logger is not called at the top of this module since it MUST be called after setup_logger is run
17
21
  # but since setup_logger doesnt know its verbosity until runtime get_logger needs to be called AS NEEDED
@@ -45,22 +49,37 @@ console = Console()
45
49
  VERSION = version("mujoco-mojo")
46
50
 
47
51
 
52
+ # "MUJOCO" and "MOJO" in the ANSI Shadow figlet font
53
+ _LOGO_LINES = [
54
+ "███╗ ███╗██╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███╗ ███╗ ██████╗ ██╗ ██████╗ ",
55
+ "████╗ ████║██║ ██║ ██║██╔═══██╗██╔════╝██╔═══██╗ ████╗ ████║██╔═══██╗ ██║██╔═══██╗",
56
+ "██╔████╔██║██║ ██║ ██║██║ ██║██║ ██║ ██║ ██╔████╔██║██║ ██║ ██║██║ ██║",
57
+ "██║╚██╔╝██║██║ ██║██ ██║██║ ██║██║ ██║ ██║ ██║╚██╔╝██║██║ ██║██ ██║██║ ██║",
58
+ "██║ ╚═╝ ██║╚██████╔╝╚█████╔╝╚██████╔╝╚██████╗╚██████╔╝ ██║ ╚═╝ ██║╚██████╔╝╚█████╔╝╚██████╔╝",
59
+ "╚═╝ ╚═╝ ╚═════╝ ╚════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚════╝ ╚═════╝ ",
60
+ ]
61
+
62
+ _SHADES = [
63
+ "#67e8f9",
64
+ "#22d3ee",
65
+ "#06b6d4",
66
+ "#0891b2",
67
+ "#0e7490",
68
+ "#155e75",
69
+ ]
70
+
71
+
48
72
  def print_logo():
49
- logo = """
50
- M M U U J OOO CCCC OOO M M OOO J OOO
51
- MM MM U U J OO OO CC OO OO MM MM OO OO J OO OO
52
- MM MM U U J O O C O O MM MM O O J O O
53
- MM MM U U J O O C O O MM MM O O J O O
54
- M M M U U J OO OO CC C OO OO M M M OO OO J OO OO
55
- M M M UUUU J OOO CCCC OOO M M M OOO J OOO
56
- J J
57
- JJ JJ
58
- """
73
+ body = Text(justify="center")
74
+ for i, (line, shade) in enumerate(zip(_LOGO_LINES, _SHADES)):
75
+ body.append(line, style=f"bold {shade}")
76
+ if i != len(_LOGO_LINES) - 1:
77
+ body.append("\n")
78
+
59
79
  console.print(
60
80
  Panel(
61
- logo,
81
+ Align.center(body),
62
82
  expand=False,
63
- style="bold cyan",
64
83
  border_style="cyan",
65
84
  subtitle=f"[dim]v{VERSION}[/dim]",
66
85
  )
@@ -72,8 +91,22 @@ def _setup_cli_logging(verbose: int, quiet: int) -> logging.Logger:
72
91
  return setup_logger(level=level)
73
92
 
74
93
 
75
- def _load_func(path: str) -> Any:
76
- """Helper to dynamically import user logic, supporting classes and methods."""
94
+ @overload
95
+ def _load_func(
96
+ path: str, _return_module: Literal[False] = False
97
+ ) -> Callable[..., Any]: ...
98
+ @overload
99
+ def _load_func(
100
+ path: str, _return_module: Literal[True]
101
+ ) -> tuple[Callable[..., Any], ModuleType]: ...
102
+ def _load_func(
103
+ path: str, _return_module: bool = False
104
+ ) -> Callable[..., Any] | tuple[Callable[..., Any], ModuleType]:
105
+ """
106
+ Helper to dynamically import user logic, supporting classes and methods.
107
+
108
+ If `_return_module` is set, returns a `(obj, module)` tuple, where `module` is the importable module the dotted path resolved against (e.g. a package `__init__` re-exporting a class), as opposed to the module the attribute is actually defined in. Reloading that module is what's needed to pick up re-exported names after an edit.
109
+ """
77
110
  if "." not in sys.path:
78
111
  sys.path.insert(0, ".")
79
112
 
@@ -104,7 +137,6 @@ def _load_func(path: str) -> Any:
104
137
  obj = mod
105
138
  for part in attr_parts:
106
139
  obj = getattr(obj, part)
107
- return obj
108
140
  except AttributeError as e:
109
141
  logger = get_logger(__name__)
110
142
  console.print(
@@ -113,6 +145,22 @@ def _load_func(path: str) -> Any:
113
145
  logger.exception(f"`{path}`not found: {e}", extra={"file_only": True})
114
146
  raise typer.Exit(code=1)
115
147
 
148
+ if not callable(obj):
149
+ logger = get_logger(__name__)
150
+ console.print(
151
+ f"[bold red]Error:[/bold red] [bold green]`{path}`[/bold green] resolved to a "
152
+ f"[bold]{type(obj).__name__}[/bold], which is not callable."
153
+ )
154
+ logger.error(
155
+ f"`{path}` resolved to a non-callable {type(obj).__name__}",
156
+ extra={"file_only": True},
157
+ )
158
+ raise typer.Exit(code=1)
159
+
160
+ if _return_module:
161
+ return obj, mod
162
+ return obj
163
+
116
164
 
117
165
  def _smart_parse(value: str) -> Any:
118
166
  """Tries to convert CLI strings to Python types (int, float, bool)."""
@@ -23,7 +23,6 @@ from mujoco_mojo.stochas import DesignValueDict, DistributionDict, NamedValueDic
23
23
  from mujoco_mojo.utils.defaults import DEFAULT_WORKDIR
24
24
  from mujoco_mojo.utils.log import get_logger
25
25
  from mujoco_mojo.utils.runner import MojoGenerator, MojoRunner, MojoRuntime
26
- from mujoco_mojo.utils.utils import write_dojo_script
27
26
  from mujoco_mojo.utils.statusing import (
28
27
  JOB_STATUS_FNAME,
29
28
  TRIAL_STATUS_FNAME,
@@ -34,6 +33,7 @@ from mujoco_mojo.utils.statusing import (
34
33
  Step,
35
34
  TrialStatus,
36
35
  )
36
+ from mujoco_mojo.utils.utils import write_dojo_script
37
37
  from mujoco_mojo.visualization import ArrowConfig, LineConfig
38
38
 
39
39
  from .cli import UserInterface
@@ -89,6 +89,44 @@ def is_dark_mode() -> bool:
89
89
  return False
90
90
 
91
91
 
92
+ def _matrix_rain(duration: float = 1.5, fps: int = 20) -> None:
93
+ """Plays a brief Matrix-style digital rain animation, e.g. on exit."""
94
+ import random
95
+
96
+ from rich.live import Live
97
+ from rich.text import Text
98
+
99
+ width, height = console.size
100
+ if width <= 0 or height <= 0:
101
+ return
102
+
103
+ drops = [random.randint(-height, 0) for _ in range(width)]
104
+ trail_length = 8
105
+
106
+ with Live(console=console, refresh_per_second=fps, screen=True) as live:
107
+ for _ in range(int(duration * fps)):
108
+ frame = Text()
109
+ for row in range(height):
110
+ for col in range(width):
111
+ head = drops[col]
112
+ if row == head:
113
+ frame.append(random.choice("01"), style="bold white")
114
+ elif 0 <= head - row <= trail_length:
115
+ frame.append(random.choice("01"), style="green")
116
+ else:
117
+ frame.append(" ")
118
+ if row < height - 1:
119
+ frame.append("\n")
120
+
121
+ for col in range(width):
122
+ drops[col] += 1
123
+ if drops[col] - height > random.randint(0, height):
124
+ drops[col] = random.randint(-height, 0)
125
+
126
+ live.update(frame)
127
+ time.sleep(1 / fps)
128
+
129
+
92
130
  def recursive_reload(module, project_root: Path, visited: set | None = None):
93
131
  """Recursively reloads modules, but only if they live inside project_root."""
94
132
  import importlib
@@ -271,9 +309,9 @@ class MojoReloaded:
271
309
  def reload_with_check(path_str: str, label: str):
272
310
  """Internal helper to validate file existance before reloading."""
273
311
  try:
274
- # attempt to find
275
- func = _load_func(path_str)
276
- mod = sys.modules.get(func.__module__)
312
+ # attempt to find the module the dotted path resolves against, which may be a
313
+ # package `__init__` re-exporting a class/function defined in a submodule
314
+ _, mod = _load_func(path_str, _return_module=True)
277
315
 
278
316
  if mod and hasattr(mod, "__file__") and mod.__file__:
279
317
  source_file = Path(mod.__file__).resolve()
@@ -289,6 +327,8 @@ class MojoReloaded:
289
327
  f"Unable to find source file for {path_str}. Did you rename or move it?"
290
328
  )
291
329
 
330
+ # reloading the entry module re-resolves any re-exported names (e.g.
331
+ # `from .robot import RobotGenerator`) after their source modules reload
292
332
  recursive_reload(module=mod, project_root=project_root)
293
333
 
294
334
  # reload to get the reference
@@ -478,6 +518,7 @@ class MojoReloaded:
478
518
  self.run_viser(initial_state)
479
519
  case _:
480
520
  console.print(f"Invalid viewer option selected {self.ui}")
521
+ _matrix_rain()
481
522
  console.print("\n[bold yellow]Exiting MuJoCo Mojo Reloaded[/bold yellow]")
482
523
 
483
524
  def _print_help(self):
@@ -523,15 +564,18 @@ class MojoReloaded:
523
564
  "Install [bold]mujoco-mojo[reloaded][/bold] to use --watch."
524
565
  )
525
566
  return None
567
+ # silence watchfiles' own "N changes detected" log; we print our own below
568
+ logging.getLogger("watchfiles").setLevel(logging.WARNING)
569
+
526
570
  evt = threading.Event()
527
571
  watch_path = Path.cwd()
528
572
 
529
573
  def _run():
530
574
  try:
531
- for _ in wf_watch(
575
+ for changes in wf_watch(
532
576
  watch_path, watch_filter=PythonFilter(), stop_event=evt
533
577
  ):
534
- event_queue.put(("reload", ""))
578
+ event_queue.put(("reload", str(len(changes))))
535
579
  except Exception:
536
580
  pass
537
581
 
@@ -566,9 +610,7 @@ class MojoReloaded:
566
610
  def print_prompt():
567
611
  watch_indicator = " [bold blue]W[/bold blue]" if self.watch else ""
568
612
  console.print(
569
- f"[bold green]Awaiting command[/bold green]"
570
- f"[dim](last: {self._last_command} | seed: {self.seed} | trial: {self.trial_num})[/dim]"
571
- f"{watch_indicator}[white] > [/white]",
613
+ f"[bold green]Awaiting command[/bold green] [dim](last: {self._last_command} | seed: {self.seed} | trial: {self.trial_num})[/dim] {watch_indicator}[white] > [/white]",
572
614
  end="",
573
615
  )
574
616
 
@@ -583,8 +625,10 @@ class MojoReloaded:
583
625
  break
584
626
 
585
627
  if event_type == "reload":
628
+ count = int(data) if data.isdigit() else 0
629
+ plural = "s" if count != 1 else ""
586
630
  console.print(
587
- "\n[dim]File change detected, reloading with last command...[/dim]"
631
+ f"\n[dim]{count} change{plural} detected, reloading with last command...[/dim]"
588
632
  )
589
633
  use_runtime = self._last_command != "gen"
590
634
  try:
@@ -682,7 +726,7 @@ class MojoReloaded:
682
726
 
683
727
  try:
684
728
  start = time.time()
685
- console.print("[bold]Processing...[/bold]")
729
+ console.print("[dim]Processing...[/dim]")
686
730
  new_state = self.generate_construct(
687
731
  use_runtime=use_runtime, on_reload_callback=on_reload_callback
688
732
  )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes