diff --git a/Makefile b/Makefile index fefe83842..ce461aa7d 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,10 @@ build: docs: uv run --extra docs sphinx-build docs docs/_build +.PHONY: docs-watch +docs-watch: + uv run --extra docs sphinx-autobuild docs docs/_build + .PHONY: docker-build docker-build: docker build -t mjlab:latest . diff --git a/README.md b/README.md index 59e6c63d7..eaaf9a345 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ Launch the demo directly in your browser with an interactive Viser viewer. ## Installation +> **Note:** `mujoco-warp` is not yet on PyPI, so it must be installed from GitHub. +> Once it becomes available on PyPI, the installation commands below will simplify. + **From source:** ```bash @@ -169,7 +172,7 @@ make format Compile documentation locally: ```bash -uv pip install -r docs/requirements.txt +uv sync --extra docs make docs ``` diff --git a/docs/conf.py b/docs/conf.py index e3469829b..c02d55577 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -122,11 +122,9 @@ html_last_updated_fmt = "" html_static_path = ["source/_static"] -html_css_files = ["custom.css"] html_theme_options = { "path_to_docs": "docs/", - "collapse_navigation": True, "repository_url": "https://github.com/mujocolab/mjlab", "use_repository_button": True, "use_issues_button": True, @@ -146,7 +144,7 @@ { "name": "mjlab", "url": "https://github.com/mujocolab/mjlab", - "icon": "https://img.shields.io/badge/mjlab-0.1.0-silver.svg", + "icon": "https://img.shields.io/badge/mjlab-1.0.0-silver.svg", "type": "url", }, { diff --git a/docs/index.rst b/docs/index.rst index d485b1aa5..e7bd4b453 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -23,7 +23,7 @@ You can try mjlab *without installing anything* by using `uvx`: # Run the mjlab demo (no local installation needed) uvx --from mjlab \ - --with "mujoco-warp @ git+https://github.com/google-deepmind/mujoco_warp@9fc294d86955a303619a254cefae809a41adb274" \ + --with "mujoco-warp @ git+https://github.com/google-deepmind/mujoco_warp@f2f795796fc433adf8e235f01fae3747585ae5db" \ demo If this runs, your setup is compatible with mjlab *for evaluation*. @@ -44,7 +44,7 @@ If you use mjlab in your research, we would appreciate a citation: month = sep, title = {{mjlab: Isaac Lab API, powered by MuJoCo-Warp, for RL and robotics research.}}, url = {https://github.com/mujocolab/mjlab}, - version = {0.1.0}, + version = {1.0.0}, year = {2025} } @@ -62,32 +62,63 @@ Table of Contents ================= .. toctree:: - :maxdepth: 1 + :maxdepth: 2 :caption: Getting Started + :titlesonly: - source/installation - source/migration_isaac_lab + source/getting_started/installation + source/getting_started/motivation + source/getting_started/walkthrough/index .. toctree:: - :maxdepth: 1 - :caption: About the Project + :maxdepth: 2 + :caption: Architecture + :titlesonly: - source/motivation - source/faq + source/architecture/manager_based_env + source/architecture/scene + source/architecture/control_flow .. toctree:: :maxdepth: 2 - :caption: API Reference + :caption: Components + :titlesonly: + + source/components/entities + source/components/actuators + source/components/sensors + source/components/terrains + +.. toctree:: + :maxdepth: 2 + :caption: Environment Guide + :titlesonly: + + source/environment_guide/observations + source/environment_guide/domain_randomization + +.. toctree:: + :maxdepth: 2 + :caption: Features + :titlesonly: + + source/features/configuration + source/features/distributed_training + source/features/nan_guard + +.. toctree:: + :maxdepth: 1 + :caption: API + :titlesonly: source/api/index .. toctree:: :maxdepth: 1 - :caption: Core Concepts - - source/randomization - source/nan_guard - source/observation - source/actuators - source/sensors - source/distributed_training + :caption: References + :titlesonly: + + source/references/changelog + source/references/contributing + source/references/faq + source/references/migration_isaac_lab diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index ef4cbb3f6..3686442c0 100644 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -1,16 +1,15 @@ API Reference ============= -This section provides detailed API documentation for all public modules in mjlab. - .. toctree:: - :maxdepth: 1 + :maxdepth: 2 + :titlesonly: + actuator + entity envs + managers scene - sim - entity - actuator sensor - managers + sim terrains diff --git a/docs/source/architecture/control_flow.rst b/docs/source/architecture/control_flow.rst new file mode 100644 index 000000000..80e8e81a7 --- /dev/null +++ b/docs/source/architecture/control_flow.rst @@ -0,0 +1,5 @@ +.. _control-flow: + +Control Flow +============ + diff --git a/docs/source/architecture/manager_based_env.rst b/docs/source/architecture/manager_based_env.rst new file mode 100644 index 000000000..c6d737453 --- /dev/null +++ b/docs/source/architecture/manager_based_env.rst @@ -0,0 +1,5 @@ +.. _manager-based-env: + +Manager-Based Environment +========================= + diff --git a/docs/source/architecture/scene.rst b/docs/source/architecture/scene.rst new file mode 100644 index 000000000..5cf94152c --- /dev/null +++ b/docs/source/architecture/scene.rst @@ -0,0 +1,5 @@ +.. _scene-architecture: + +Scene +===== + diff --git a/docs/source/actuators.rst b/docs/source/components/actuators.rst similarity index 100% rename from docs/source/actuators.rst rename to docs/source/components/actuators.rst diff --git a/docs/source/components/entities.rst b/docs/source/components/entities.rst new file mode 100644 index 000000000..3975f26e0 --- /dev/null +++ b/docs/source/components/entities.rst @@ -0,0 +1,4 @@ +.. _entities: + +Entities +======== diff --git a/docs/source/sensors.rst b/docs/source/components/sensors.rst similarity index 100% rename from docs/source/sensors.rst rename to docs/source/components/sensors.rst diff --git a/docs/source/components/terrains.rst b/docs/source/components/terrains.rst new file mode 100644 index 000000000..ae2c38f61 --- /dev/null +++ b/docs/source/components/terrains.rst @@ -0,0 +1,5 @@ +.. _terrains: + +Terrains +======== + diff --git a/docs/source/randomization.rst b/docs/source/environment_guide/domain_randomization.rst similarity index 99% rename from docs/source/randomization.rst rename to docs/source/environment_guide/domain_randomization.rst index d1983dd0a..47de63199 100644 --- a/docs/source/randomization.rst +++ b/docs/source/environment_guide/domain_randomization.rst @@ -1,3 +1,5 @@ +.. _domain-randomization: + Domain Randomization ==================== @@ -172,7 +174,7 @@ Center of Mass (COM) (startup) "ranges": {0: (-0.02, 0.02), 1: (-0.02, 0.02)}, "operation": "add", }, - ) + ) Custom Class-Based Event Terms ------------------------------ diff --git a/docs/source/observation.rst b/docs/source/environment_guide/observations.rst similarity index 100% rename from docs/source/observation.rst rename to docs/source/environment_guide/observations.rst diff --git a/docs/source/features/configuration.rst b/docs/source/features/configuration.rst new file mode 100644 index 000000000..e9df93f22 --- /dev/null +++ b/docs/source/features/configuration.rst @@ -0,0 +1,6 @@ +.. _configuration: + +Configuration System +==================== + +tyro diff --git a/docs/source/distributed_training.rst b/docs/source/features/distributed_training.rst similarity index 100% rename from docs/source/distributed_training.rst rename to docs/source/features/distributed_training.rst diff --git a/docs/source/nan_guard.rst b/docs/source/features/nan_guard.rst similarity index 98% rename from docs/source/nan_guard.rst rename to docs/source/features/nan_guard.rst index cbc7cb465..eeff332e3 100644 --- a/docs/source/nan_guard.rst +++ b/docs/source/features/nan_guard.rst @@ -85,7 +85,7 @@ Use the interactive viewer to scrub through captured states: uv run viz-nan /tmp/mjlab/nan_dumps/nan_dump_20251014_123456.npz -.. figure:: _static/content/nan_debug.gif +.. figure:: ../_static/content/nan_debug.gif :alt: NaN Debug Viewer NaN debug viewer. diff --git a/docs/source/installation.rst b/docs/source/getting_started/installation.rst similarity index 94% rename from docs/source/installation.rst rename to docs/source/getting_started/installation.rst index c461a7bcb..559fb848c 100644 --- a/docs/source/installation.rst +++ b/docs/source/getting_started/installation.rst @@ -3,9 +3,8 @@ Installation Guide ================== -``mjlab`` is in active **beta** and tightly coupled to MuJoCo Warp. -This guide presents different installation paths so you can -choose the one that best fits your use case. +``mjlab`` is tightly coupled to MuJoCo Warp. This guide presents different +installation paths so you can choose the one that best fits your use case. .. contents:: :local: @@ -92,7 +91,7 @@ install. These options are interchangeable: you can switch at any time. .. code:: bash - uv add mjlab "mujoco-warp @ git+https://github.com/google-deepmind/mujoco_warp@9fc294d86955a303619a254cefae809a41adb274" + uv add mjlab "mujoco-warp @ git+https://github.com/google-deepmind/mujoco_warp@f2f795796fc433adf8e235f01fae3747585ae5db" .. note:: @@ -104,7 +103,7 @@ install. These options are interchangeable: you can switch at any time. .. code:: bash - uv add "mjlab @ git+https://github.com/mujocolab/mjlab" "mujoco-warp @ git+https://github.com/google-deepmind/mujoco_warp@9fc294d86955a303619a254cefae809a41adb274" + uv add "mjlab @ git+https://github.com/mujocolab/mjlab" "mujoco-warp @ git+https://github.com/google-deepmind/mujoco_warp@f2f795796fc433adf8e235f01fae3747585ae5db" .. note:: @@ -201,7 +200,7 @@ Install mjlab and dependencies via pip .. code:: bash - pip install git+https://github.com/google-deepmind/mujoco_warp@9fc294d86955a303619a254cefae809a41adb274 + pip install git+https://github.com/google-deepmind/mujoco_warp@f2f795796fc433adf8e235f01fae3747585ae5db pip install mjlab .. tab-item:: Source @@ -210,7 +209,7 @@ Install mjlab and dependencies via pip .. code:: bash - pip install git+https://github.com/google-deepmind/mujoco_warp@9fc294d86955a303619a254cefae809a41adb274 + pip install git+https://github.com/google-deepmind/mujoco_warp@f2f795796fc433adf8e235f01fae3747585ae5db git clone https://github.com/mujocolab/mjlab.git cd mjlab pip install -e . diff --git a/docs/source/motivation.rst b/docs/source/getting_started/motivation.rst similarity index 100% rename from docs/source/motivation.rst rename to docs/source/getting_started/motivation.rst diff --git a/docs/source/getting_started/walkthrough/evaluate_policy.rst b/docs/source/getting_started/walkthrough/evaluate_policy.rst new file mode 100644 index 000000000..6860191a3 --- /dev/null +++ b/docs/source/getting_started/walkthrough/evaluate_policy.rst @@ -0,0 +1,28 @@ +Evaluating the Policy +===================== + +This section shows how to evaluate and visualize your trained policy. + +Running Evaluation +------------------ + +TODO: Show the command to evaluate a trained policy. + +.. code-block:: bash + + uv run play --task CartPole --checkpoint /path/to/model.pt + +Visualization +------------- + +TODO: Show how to visualize the policy execution (MuJoCo viewer, Viser, video recording). + +Analyzing Performance +--------------------- + +TODO: Explain how to analyze the policy's performance and identify issues. + +Next Steps +---------- + +TODO: Suggest next steps (tuning hyperparameters, trying different tasks, customization). diff --git a/docs/source/getting_started/walkthrough/index.rst b/docs/source/getting_started/walkthrough/index.rst new file mode 100644 index 000000000..3a58ee352 --- /dev/null +++ b/docs/source/getting_started/walkthrough/index.rst @@ -0,0 +1,25 @@ +Walkthrough +=========== + +This walkthrough guides you through creating a complete RL task from scratch +and training a policy using mjlab. We'll use a CartPole task as an example +to demonstrate the full workflow. + +By the end of this tutorial, you'll understand how to: + +- Define a new task environment +- Configure observations, actions, and rewards +- Set up training parameters +- Train an RL policy +- Evaluate and visualize the trained policy + +.. toctree:: + :maxdepth: 1 + :titlesonly: + + task_setup + observations_actions + rewards_terminations + training_config + run_training + evaluate_policy diff --git a/docs/source/getting_started/walkthrough/observations_actions.rst b/docs/source/getting_started/walkthrough/observations_actions.rst new file mode 100644 index 000000000..749eb45a3 --- /dev/null +++ b/docs/source/getting_started/walkthrough/observations_actions.rst @@ -0,0 +1,23 @@ +Observations and Actions +======================== + +This section explains how to configure observations and actions for your task. + +Observation Space +----------------- + +TODO: Explain what observations the agent needs (cart position, velocity, pole angle, etc.) + +TODO: Show how to configure observation managers. + +Action Space +------------ + +TODO: Explain the action space (force applied to cart). + +TODO: Show how to configure action managers and actuators. + +Code Example +------------ + +TODO: Provide complete code example for observation and action configuration. diff --git a/docs/source/getting_started/walkthrough/rewards_terminations.rst b/docs/source/getting_started/walkthrough/rewards_terminations.rst new file mode 100644 index 000000000..9b469d763 --- /dev/null +++ b/docs/source/getting_started/walkthrough/rewards_terminations.rst @@ -0,0 +1,23 @@ +Rewards and Terminations +======================== + +This section covers how to define reward functions and termination conditions. + +Reward Function +--------------- + +TODO: Explain the reward structure for CartPole (staying upright, penalizing extreme positions). + +TODO: Show how to implement custom reward functions. + +Termination Conditions +---------------------- + +TODO: Explain when episodes should terminate (pole falls over, cart out of bounds, time limit). + +TODO: Show how to configure termination managers. + +Code Example +------------ + +TODO: Provide complete code example for rewards and terminations. diff --git a/docs/source/getting_started/walkthrough/run_training.rst b/docs/source/getting_started/walkthrough/run_training.rst new file mode 100644 index 000000000..ca64ac561 --- /dev/null +++ b/docs/source/getting_started/walkthrough/run_training.rst @@ -0,0 +1,28 @@ +Running Training +================ + +This section shows how to run the training process. + +Starting Training +----------------- + +TODO: Show the command to start training. + +.. code-block:: bash + + uv run train --task CartPole + +Monitoring Progress +------------------- + +TODO: Explain how to monitor training (tensorboard, wandb, console output). + +Training Metrics +---------------- + +TODO: Explain key metrics to watch during training. + +Checkpoints +----------- + +TODO: Explain how model checkpoints are saved and where to find them. diff --git a/docs/source/getting_started/walkthrough/task_setup.rst b/docs/source/getting_started/walkthrough/task_setup.rst new file mode 100644 index 000000000..e9bf78f65 --- /dev/null +++ b/docs/source/getting_started/walkthrough/task_setup.rst @@ -0,0 +1,24 @@ +Setting Up the Task +=================== + +This section covers how to define a new task environment in mjlab. + +Task Overview +------------- + +TODO: Describe the CartPole task and what we're trying to achieve. + +Creating the Task File +---------------------- + +TODO: Show how to create a new task file and basic structure. + +Defining the Scene +------------------ + +TODO: Show how to set up the MuJoCo scene with the robot/environment. + +MJCF Model +---------- + +TODO: Reference or include the CartPole MJCF model. diff --git a/docs/source/getting_started/walkthrough/training_config.rst b/docs/source/getting_started/walkthrough/training_config.rst new file mode 100644 index 000000000..3998f2822 --- /dev/null +++ b/docs/source/getting_started/walkthrough/training_config.rst @@ -0,0 +1,24 @@ +Training Configuration +====================== + +This section shows how to configure the RL training parameters. + +RL Algorithm +------------ + +TODO: Explain which algorithm we're using (PPO via rsl_rl). + +Training Parameters +------------------- + +TODO: Show key training parameters (learning rate, batch size, num environments, etc.) + +Environment Configuration +------------------------- + +TODO: Show how to configure the environment wrapper for training. + +Code Example +------------ + +TODO: Provide complete training configuration code. diff --git a/docs/source/references/changelog.rst b/docs/source/references/changelog.rst new file mode 100644 index 000000000..1f6e155ad --- /dev/null +++ b/docs/source/references/changelog.rst @@ -0,0 +1,7 @@ +.. _changelog: + +Changelog +========= + +v1.0.0 (December 27, 2025) +-------------------------- diff --git a/docs/source/references/contributing.rst b/docs/source/references/contributing.rst new file mode 100644 index 000000000..1c8a87315 --- /dev/null +++ b/docs/source/references/contributing.rst @@ -0,0 +1,4 @@ +.. _contributing: + +Contribution Guidelines +======================= diff --git a/docs/source/faq.rst b/docs/source/references/faq.rst similarity index 97% rename from docs/source/faq.rst rename to docs/source/references/faq.rst index dc448e1a9..170fca720 100644 --- a/docs/source/faq.rst +++ b/docs/source/references/faq.rst @@ -53,7 +53,7 @@ Does mjlab support multi-GPU training? - Use ``--gpu-ids 0 1`` (or ``--gpu-ids all``) when running the ``train`` command. - - See the :doc:`distributed_training` for configuration details and examples. + - See the :doc:`../features/distributed_training` for configuration details and examples. Training & Debugging -------------------- @@ -113,7 +113,7 @@ My training crashes with NaN errors uv run train.py --enable-nan-guard True - See the :doc:`NaN Guard documentation ` for details. + See the :doc:`NaN Guard documentation <../features/nan_guard>` for details. The ``nan_guard`` tool makes it easier to: diff --git a/docs/source/migration_isaac_lab.rst b/docs/source/references/migration_isaac_lab.rst similarity index 100% rename from docs/source/migration_isaac_lab.rst rename to docs/source/references/migration_isaac_lab.rst diff --git a/pyproject.toml b/pyproject.toml index 4e04d2d0a..d263d2e4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,6 +76,7 @@ docs = [ "myst-parser>=4.0.1", "sphinx>=8.1.3", "sphinx-autodoc-typehints>=3.0.1", + "sphinx-autobuild>=2024.10.3", "sphinx-book-theme>=1.1.4", "sphinx-copybutton>=0.5.2", "sphinx-design>=0.6.1", diff --git a/uv.lock b/uv.lock index 6dd34f94d..6568552a0 100644 --- a/uv.lock +++ b/uv.lock @@ -1262,6 +1262,8 @@ docs = [ { name = "myst-parser" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx-autobuild", version = "2024.10.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "sphinx-autobuild", version = "2025.8.25", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-autodoc-typehints", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx-autodoc-typehints", version = "3.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "sphinx-book-theme" }, @@ -1295,6 +1297,7 @@ requires-dist = [ { name = "prettytable" }, { name = "rsl-rl-lib", specifier = "==3.1.0" }, { name = "sphinx", marker = "extra == 'docs'", specifier = ">=8.1.3" }, + { name = "sphinx-autobuild", marker = "extra == 'docs'", specifier = ">=2024.10.3" }, { name = "sphinx-autodoc-typehints", marker = "extra == 'docs'", specifier = ">=3.0.1" }, { name = "sphinx-book-theme", marker = "extra == 'docs'", specifier = ">=1.1.4" }, { name = "sphinx-copybutton", marker = "extra == 'docs'", specifier = ">=0.5.2" }, @@ -3119,6 +3122,60 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, ] +[[package]] +name = "sphinx-autobuild" +version = "2024.10.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'linux'", + "python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 'arm64' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'arm64' and sys_platform == 'darwin'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.11'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "starlette", marker = "python_full_version < '3.11'" }, + { name = "uvicorn", marker = "python_full_version < '3.11'" }, + { name = "watchfiles", marker = "python_full_version < '3.11'" }, + { name = "websockets", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023, upload-time = "2024-10-02T23:15:30.172Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908, upload-time = "2024-10-02T23:15:28.739Z" }, +] + +[[package]] +name = "sphinx-autobuild" +version = "2025.8.25" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and sys_platform == 'linux'", + "python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 'arm64' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine != 'arm64' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine != 'arm64' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'arm64' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'arm64' and sys_platform == 'darwin'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "8.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "starlette", marker = "python_full_version >= '3.11'" }, + { name = "uvicorn", marker = "python_full_version >= '3.11'" }, + { name = "watchfiles", marker = "python_full_version >= '3.11'" }, + { name = "websockets", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/3c/a59a3a453d4133777f7ed2e83c80b7dc817d43c74b74298ca0af869662ad/sphinx_autobuild-2025.8.25.tar.gz", hash = "sha256:9cf5aab32853c8c31af572e4fecdc09c997e2b8be5a07daf2a389e270e85b213", size = 15200, upload-time = "2025-08-25T18:44:55.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/20/56411b52f917696995f5ad27d2ea7e9492c84a043c5b49a3a3173573cd93/sphinx_autobuild-2025.8.25-py3-none-any.whl", hash = "sha256:b750ac7d5a18603e4665294323fd20f6dcc0a984117026d1986704fa68f0379a", size = 12535, upload-time = "2025-08-25T18:44:54.164Z" }, +] + [[package]] name = "sphinx-autodoc-typehints" version = "3.0.1" @@ -3343,6 +3400,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] +[[package]] +name = "starlette" +version = "0.50.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, +] + [[package]] name = "svg-path" version = "7.0" @@ -3763,6 +3833,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] +[[package]] +name = "uvicorn" +version = "0.40.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, +] + [[package]] name = "vhacdx" version = "0.0.8.post2" @@ -3885,6 +3969,86 @@ wheels = [ { url = "https://pypi.nvidia.com/warp-lang/warp_lang-1.11.0.dev20251211-py3-none-win_amd64.whl", hash = "sha256:5a8c6203863a596ab730e1c57fefc36a00c6687647bcef29d11cb0c78f800930" }, ] +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", size = 407318, upload-time = "2025-10-14T15:04:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", size = 394478, upload-time = "2025-10-14T15:04:20.297Z" }, + { url = "https://files.pythonhosted.org/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", size = 449894, upload-time = "2025-10-14T15:04:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", size = 459065, upload-time = "2025-10-14T15:04:22.795Z" }, + { url = "https://files.pythonhosted.org/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", size = 488377, upload-time = "2025-10-14T15:04:24.138Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", size = 595837, upload-time = "2025-10-14T15:04:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", size = 473456, upload-time = "2025-10-14T15:04:26.497Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", size = 455614, upload-time = "2025-10-14T15:04:27.539Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", size = 630690, upload-time = "2025-10-14T15:04:28.495Z" }, + { url = "https://files.pythonhosted.org/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", size = 622459, upload-time = "2025-10-14T15:04:29.491Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", size = 272663, upload-time = "2025-10-14T15:04:30.435Z" }, + { url = "https://files.pythonhosted.org/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", size = 287453, upload-time = "2025-10-14T15:04:31.53Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", size = 409611, upload-time = "2025-10-14T15:06:05.809Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", size = 396889, upload-time = "2025-10-14T15:06:07.035Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", size = 451616, upload-time = "2025-10-14T15:06:08.072Z" }, + { url = "https://files.pythonhosted.org/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", size = 458413, upload-time = "2025-10-14T15:06:09.209Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +] + [[package]] name = "wcwidth" version = "0.2.14"