From 7d9cabcdba317a4914c7a1c7ae98d8e531035990 Mon Sep 17 00:00:00 2001 From: Krishna_Hundekari Date: Mon, 29 Jun 2026 12:03:28 -0700 Subject: [PATCH 1/2] fix(whole-body): discover sim adapters in registry registry.discover() only scanned dimos/hardware/whole_body, so the sim adapter sim_mujoco_g1 was never imported/registered and `dimos --simulation mujoco run unitree-g1-groot-wbc` raised "Unknown whole-body adapter: sim_mujoco_g1". Also scan dimos/simulation/adapters/whole_body (flat modules), which the registry docstring already documents. ImportError is handled gracefully so hardware-only installs are unaffected. --- dimos/hardware/whole_body/registry.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/dimos/hardware/whole_body/registry.py b/dimos/hardware/whole_body/registry.py index ec841fe182..28d140ca57 100644 --- a/dimos/hardware/whole_body/registry.py +++ b/dimos/hardware/whole_body/registry.py @@ -71,15 +71,18 @@ def available(self) -> list[str]: return sorted(self._adapters.keys()) def discover(self) -> None: - """Discover and register whole-body hardware adapters. - - Walks the hardware whole-body package recursively looking for - ``adapter.py`` modules that provide a ``register(registry)`` function. - """ + """Discover and register whole-body adapters from the hardware and sim roots.""" import dimos.hardware.whole_body as hw_pkg self._discover_in("dimos.hardware.whole_body", hw_pkg.__path__[0], max_depth=2) + try: + import dimos.simulation.adapters.whole_body as sim_pkg + except ImportError as e: + logger.warning(f"Skipping sim whole-body adapters: {e}") + return + self._discover_flat("dimos.simulation.adapters.whole_body", sim_pkg.__path__[0]) + def _discover_in(self, pkg_path: str, dir_path: str, *, max_depth: int) -> None: for entry in sorted(os.listdir(dir_path)): entry_path = os.path.join(dir_path, entry) @@ -99,6 +102,18 @@ def _discover_in(self, pkg_path: str, dir_path: str, *, max_depth: int) -> None: if hasattr(mod, "register"): mod.register(self) + def _discover_flat(self, pkg_path: str, dir_path: str) -> None: + for entry in sorted(os.listdir(dir_path)): + if not entry.endswith(".py") or entry.startswith(("_", ".")): + continue + try: + mod = importlib.import_module(f"{pkg_path}.{entry[:-3]}") + except ImportError as e: + logger.warning(f"Skipping whole-body adapter {entry}: {e}") + continue + if hasattr(mod, "register"): + mod.register(self) + whole_body_adapter_registry = WholeBodyAdapterRegistry() whole_body_adapter_registry.discover() From 4a9f9fbf3d7daf17671016156dc58201cc4d6bc2 Mon Sep 17 00:00:00 2001 From: Krishna_Hundekari <113392023+KrishnaH96@users.noreply.github.com> Date: Mon, 29 Jun 2026 12:17:23 -0700 Subject: [PATCH 2/2] Update dimos/hardware/whole_body/registry.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- dimos/hardware/whole_body/registry.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dimos/hardware/whole_body/registry.py b/dimos/hardware/whole_body/registry.py index 28d140ca57..f71c8568d3 100644 --- a/dimos/hardware/whole_body/registry.py +++ b/dimos/hardware/whole_body/registry.py @@ -81,7 +81,8 @@ def discover(self) -> None: except ImportError as e: logger.warning(f"Skipping sim whole-body adapters: {e}") return - self._discover_flat("dimos.simulation.adapters.whole_body", sim_pkg.__path__[0]) + for sim_root in sim_pkg.__path__: + self._discover_flat("dimos.simulation.adapters.whole_body", sim_root) def _discover_in(self, pkg_path: str, dir_path: str, *, max_depth: int) -> None: for entry in sorted(os.listdir(dir_path)):