Conversation
… Unitree Go2 Navigation & Exploration Beta Pre-Release v0.0.8: Unitree Go2 Navigation & Exploration Beta, Transport Updates, Documentation updates, Rerun fixes, Person follow, Readme updates ## What's Changed * Small docs clarification about stream getters by @leshy in #1043 * Fix split view on wide monitors by @jeff-hykin in #1048 * Docs: Install & Develop by @jeff-hykin in #1022 * Add uv to nix and fix resulting problems by @jeff-hykin in #1021 * v0.0.8 by @paul-nechifor in #1050 * Style changes in docs by @paul-nechifor in #1051 * Revert "Add uv to nix and fix resulting problems" by @leshy in #1053 * Transport benchmarks + Raw ros transport by @leshy in #1038 * feat: default to rerun-web and auto-open browser on startup (browser … by @Nabla7 in #1019 * bbox detections visual check by @leshy in #1017 * fix: only auto-open browser for rerun-web viewer backend by @Nabla7 in #1066 * move slow tests to integration by @paul-nechifor in #1063 * Streamline transport start/stop methods by @Kaweees in #1062 * Person follow skill with EdgeTAM by @paul-nechifor in #1042 * fix: increase costmap floor z_offset to avoid z-fighting by @Nabla7 in #1073 * Fixed issue #1074 by @alexlin2 in #1075 * ROS transports initial by @leshy in #1057 * Fix System Config Values for LCM on MacOS and Refactor by @jeff-hykin in #1065 * SHM Transport basic fixes by @leshy in #1041 * commented out Mem Transport test case by @leshy in #1077 * Docs/advanced streams update 2 by @leshy in #1078 * Fix more tests by @paul-nechifor in #1071 * feat: navigation docker updates from bona_local_dev by @baishibona in #1081 * Fix missing dependencies by @Kaweees in #1085 * Release readme fixes by @spomichter in #1076 ## New Contributors * @baishibona made their first contribution in #1081 **Full Changelog**: v0.0.7...v0.0.8
…HTTPS from SSH, get_data change, LFS changes v0.0.9 Release Patch: Git clone change to HTTPS from SSH, get_data change, LFS changes
Release v0.0.10: Manipulation Stack, MuJoCo Simulation, DDS Transport, Web and Native Visualization via Rerun ## Highlights 88+ commits, 20 contributors, 700+ files changed. The TLDR: **a complete manipulation stack**, **MuJoCo simulation**, **DDS transport**, and **a rewritten visualization pipeline**. Agents are no longer bolted on top — they're refactored as native modules with direct stream access. The entire ROS message dependency has been removed from core DimOS, and we've added VR, phone, and arm teleoperation stacks. You can now vibecode a pick-and-place task from natural language to motor commands. Installation has been significantly streamlined — no more direnv, simpler setup, and the web viewer is now the default. --- ## 🚀 New Features ### Simulation - **MuJoCo simulation module** — Run any DimOS blueprint in simulation with no hardware. Supports xArm and Unitree embodiments, parses MJCF/URDF for robot properties, monotonic clock timing (no `time.sleep`). `dimos --simulation run unitree-go2` ([#1035](#1035)) by @jca0 - **Simulation teleop blueprints** — Added simulation teleop blueprints for Piper, xArm6, and xArm7. ([#1308](#1308)) by @mustafab0 ### Manipulation - **Modular manipulation stack** — Full planning stack with Drake: FK/IK solvers (Jacobian + Drake optimization), RRT path planning, world model with obstacle monitoring, multi-robot management. xArm6/7 and Piper support. ([#1079](#1079)) by @mustafab0 - **Joint servo and cartesian controllers** — Joint position/velocity controllers and cartesian IK task with Pinocchio solver. PoseStamped stream input for real-time control. ([#1116](#1116)) by @mustafab0 - **GraspGen integration** — Grasp generation via Docker-hosted GPU model. Lazy container startup, thread-safe init, RPC `generate_grasps()` returns ranked PoseArray. ([#1119](#1119), [#1234](#1234)) by @JalajShuklaSS - **Gripper control** — Gripper RPC methods on control coordinator, exposed adapter property for custom implementations. ([#1213](#1213)) by @mustafab0 - **Detection3D and Object support** — Object input topics, TF support on manipulation module, pointcloud-to-convex-hull for Drake imports. ([#1236](#1236)) by @mustafab0 - **Agentic pick and place** — Reimplemented manipulation skills for agent-driven pick-and-place workflows. ([#1237](#1237)) by @mustafab0 ### Teleoperation - **Quest VR teleoperation** — Full WebXR + Deno bridge stack. Quest controller data (pose, trigger, grip) streamed to DimOS modules. Monitor-style locking for control loops. ([#1215](#1215)) by @ruthwikdasyam - **Phone teleoperation** — Control Go2 from your phone with a web-based teleop interface. ([#1280](#1280)) by @ruthwikdasyam - **Arm teleop with Pinocchio IK** — Single and dual arm teleoperation using Pinocchio inverse kinematics. Blueprints for xArm, Piper, and dual configurations. ([#1246](#1246)) by @ruthwikdasyam ### Transports & Infrastructure - **DDS transport protocol** — CycloneDDS transport with configurable QoS (high-throughput and reliable profiles). Optional install, benchmark integration. ([#1174](#1174)) by @Kaweees - **Pubsub pattern subscriptions** — Glob and regex pattern matching for topic subscriptions. `subscribe_all()` for bridge-style consumers. Topic type encoding in channel strings (`/topic#module.ClassName`). ([#1114](#1114)) by @leshy - **LCM raw bytes passthrough** — Skip `lcm_encode()` when message is already bytes. ([#1223](#1223)) by @leshy - **Unified TimeSeriesStore** — Pluggable backends (InMemory, SQLite, Pickle, PostgreSQL) with SortedKeyList for O(log n) operations. Replaces the old replay system and TimestampedCollection. Collection API with slice, range, and streaming methods. ([#1080](#1080)) by @leshy - **DimosROS benchmark tests** — Benchmark suite for ROS transport performance. ([#1087](#1087)) by @leshy ### Navigation - **FASTLIO2 support** — Hardware-verified localization with arm64 support. Docker deployment with FAR Planner, terrain analysis, and bagfile playback mode. Builds or-tools from source on arm64. ([#1149](#1149)) by @baishibona - **Native Livox + FASTLIO2 module** — First-class DimOS native module for Livox Mid-360 lidar with FASTLIO2 localization. ([#1235](#1235)) by @leshy ### Visualization - **RerunBridge module and CLI** — New bridge that subscribes to all LCM messages and logs those with `to_rerun()` to Rerun viewer. GlobalConfig singleton, web viewer support. Replaces the old rerun initialization system. ([#1154](#1154)) by @leshy - **Webcam rerun visualization** — Camera module logs to Rerun with pinhole projection for 3D visualization. ([#1117](#1117)) by @ruthwikdasyam - **Default viewer switched to rerun-web** — Browser-based viewer is now the default for broader compatibility. No native viewer install needed. ([#1324](#1324)) by @spomichter ### Agents - **Agent refactor** — Restructured agent module with cleaner imports and global config integration. ([#1211](#1211)) by @paul-nechifor - **Timestamp knowledge** — Agents now have timestamp awareness in prompts for temporal reasoning. ([#1093](#1093)) by @ClaireBookworm - **Observe skill** — Go2 can now observe (capture and describe) its environment via agent skill. ([#1109](#1109)) by @paul-nechifor ### Platform & Hardware - **G1 without ROS** — Unitree G1 blueprints decoupled from ROS dependency. Lazy imports for fast startup. ([#1221](#1221)) by @jeff-hykin - **ARM (aarch64) support** — DimOS runs on ARM hardware. Platform-conditional dependencies, open3d source builds for arm64. ([#1229](#1229)) by @jeff-hykin - **Universal joint/hardware schema** — `HardwareComponent` dataclass with `JointState`, `JointName` type aliases. Backend registry with auto-discovery for SDK adapters. ([#1040](#1040), [#1067](#1067)) by @mustafab0 --- ## 🔧 Improvements - **Optional Dask** — Start without Dask using `--no-dask` flag. Startup time reduced from ~60s to ~45s. ([#1111](#1111), [#1232](#1232)) by @paul-nechifor - **RPC rework** — Renamed `ModuleBlueprint` → `_BlueprintAtom`, `ModuleBlueprintSet` → `Blueprint`, `ModuleConnection` → `Stream`. Added `ModuleRef`, improved type hints throughout. ([#1143](#1143)) by @jeff-hykin - **Image class simplification** — Rewritten as pure NumPy dataclass. Removed CUDA backend, unused methods (solve_pnp, csrt_tracker), and image_impls/ directory. ([#1161](#1161)) by @leshy - **Odometry message cleanup** — Simplified Odometry message type. ([#1256](#1256)) by @leshy - **Remove all ROS message dependencies** — Purged ROS message types from core DimOS. Refactored rosnav to use ROSTransport. Removed dead ROS bridge code. ([#1230](#1230)) by @alexlin2 - **Removed bad function serialization** — Eliminated unnecessary serialization of Python functions. ([#1121](#1121)) by @paul-nechifor - **Benchmark IEC units** — Switched bandwidth benchmarks from SI to IEC units for accuracy. ([#1147](#1147)) by @leshy - **Pubsub typing improvements** — Thread-safety locks on `subscribe_new_topics` and `subscribe_all`. Proper type params across pubsub stack. ([#1153](#1153)) by @leshy - **Autogenerated blueprint list** — Blueprints are now auto-discovered and listed. ([#1100](#1100)) by @paul-nechifor - **Generic Buttons message** — Renamed `QuestButtons` to `Buttons` with generic field names for cross-platform teleop. ([#1261](#1261)) by @ruthwikdasyam - **Dev container uses ros-dev image** — `./bin/dev` now runs the ROS-enabled dev image. ([#1170](#1170)) by @leshy - **LSP support** — Added python-lsp-server and python-lsp-ruff to dev dependencies. ([#1169](#1169)) by @leshy - **Lazy-load pyrealsense2** — RealSense camera module uses lazy imports to avoid errors in simulation environments without the SDK. ([#1309](#1309)) by @spomichter - **Removed unused mmcv and mmengine** — Dead Detic dependencies removed, eliminating slow source builds from install. ([#1319](#1319)) by @spomichter - **Simplified installation** — Removed direnv requirement, streamlined install instructions across all platforms. ([#1315](#1315)) by @spomichter - **DDS extra excluded from --all-extras** — `cyclonedds` requires a source build, so `dds` is now excluded from `uv sync --all-extras` by default. ([#1318](#1318)) by @spomichter - **Nix pre-commit skip** — Skip pre-commit install if hooks already exist. ([#1162](#1162)) by @leshy - **Removed base-requirements** — Consolidated dependency management. ([#1098](#1098)) by @paul-nechifor - **Removed old graspnet** — Cleaned up deprecated graspnet version. ([#1248](#1248)) by @paul-nechifor - **Code cleanup** — Removed `tofix` markers ([#1216](#1216)), fixed ruff issues ([#1112](#1112)), removed old README_installation.md ([#1101](#1101)) by @paul-nechifor --- ## 🐛 Bug Fixes - Fix LFS updating (move from .local to venv) ([#1090](#1090)) by @jeff-hykin - Launch hotfixes: git clone HTTPS, get_data main branch ([#1091](#1091)) by @spomichter - Fix camera demo not showing in Rerun ([#1148](#1148)) by @jeff-hykin - Default to rerun native viewer ([#1099](#1099)) by @Nabla7 - Fix exploration blocking agent loop ([#1258](#1258)) by @paul-nechifor - Fix person-follow blocking agent loop ([#1278](#1278)) by @paul-nechifor - Skip metric3d tests on unsupported xformers GPUs (Blackwell compute capability >9.0) ([#1225](#1225)) by @leshy - Fix manipulation tests ([#1218](#1218), [#1247](#1247)) by @jeff-hykin, @paul-nechifor - Fix control coordinator e2e test ([#1212](#1212)) by @mustafab0 - Fix xarm7-sim broken e2e tests ([#1294](#1294)) by @paul-nechifor - Pin langchain to restore supported providers ([#1241](#1241)) by @spomichter - Fix missing library dependencies in Nix flake ([#1240](#1240)) by @Kaweees - Fix discord invite link ([#1122](#1122)) by @spomichter - macOS edgecase fix ([#1096](#1096)) by @jeff-hykin - Fix second N in logo ([#1250](#1250)) by @jeff-hykin - Fix Unitree Go2 minor issues ([#1307](#1307)) by @paul-nechifor - Fix broken tests ([#1305](#1305)) by @ruthwikdasyam - Fix `uv sync` for some macOS systems ([#1322](#1322)) by @jeff-hykin - Fix mmcv install ([#1313](#1313)) by @paul-nechifor - Fix mypy issues ([#1150](#1150), [#1167](#1167), [#1257](#1257)) by @leshy, @paul-nechifor, @jeff-hykin - Fix Nix install uv pip extras ([#1321](#1321)) by @spomichter --- ## 📚 Documentation - **Major docs overhaul** — New README with feature grid, hardware table, quickstart. Navigation, transports, data streams, and agent docs. ([#1295](#1295)) by @leshy - **Day 1 docs** — Comprehensive getting started guide, development docs, contributing guide, architecture overview. Executable blueprint docs via md-babel-py. ([#1064](#1064)) by @jeff-hykin - **Arm integration guide** — How-to for integrating new robotic arms with DimOS. ([#1238](#1238)) by @mustafab0 - **MCP documentation update** — Updated MCP install and usage instructions. ([#1251](#1251)) by @Kaweees - **Docker docs** — First pass on Docker deployment documentation. ([#1151](#1151)) by @leshy - **Transports documentation** — Encode/decode mixins, SHM examples, ROS/DDS transport docs. ([#1107](#1107)) by @leshy - **Rerun API examples** — Updated examples for the new RerunBridge API. ([#1262](#1262)) by @jeff-hykin - **PR template** added ([#1172](#1172)) by @christiefhyang - **Simplified install instructions** — Removed direnv, streamlined across all platforms. ([#1315](#1315)) by @spomichter - **Python example restored** — Added back the Python usage example. ([#1317](#1317)) by @jeff-hykin - **Nix install updated** — Replaced uv with pip for Nix compatibility. ([#1326](#1326)) by @ruthwikdasyam - **README improvements** ([#1311](#1311)) by @paul-nechifor - **Simplified writing docs** — Consolidated writing_docs to a single markdown file. ([#1254](#1254)) by @jeff-hykin --- ## 🏗️ CI & Build - **ci-complete gate** — Dynamic branch protection via single aggregated status check. MD-only PRs no longer blocked. ([#1279](#1279)) by @spomichter - **Path-based test filtering** — Test jobs fully skip (no container spin-up) when no relevant code changed. ([#1284](#1284), [#1286](#1286)) by @spomichter - **Navigation docker build workflow** — CI builds for the ROS navigation stack. ([#1259](#1259)) by @spomichter - **CUDA test marker** — `@pytest.mark.cuda` for GPU-dependent tests. ([#1220](#1220)) by @jeff-hykin - **e2e test marker** — Marked end-to-end tests for selective CI runs. ([#1110](#1110)) by @paul-nechifor - **pytest stdin fix** — Added `-s` to default addopts for LCM autoconf compatibility. ([#1320](#1320)) by @spomichter --- ##⚠️ Breaking Changes - **RPC renames**: `ModuleBlueprint` → `_BlueprintAtom`, `ModuleBlueprintSet` → `Blueprint`, `ModuleConnection` → `Stream` ([#1143](#1143)) - **Image class rewrite**: `CudaImage` and `NumpyImage` removed. Image is now a pure NumPy dataclass. Methods like `solve_pnp`, `csrt_tracker`, `from_depth`, `to_depth_meters` removed. ([#1161](#1161)) - **ROS messages removed from core**: All `to_ros`/`from_ros` conversion methods removed. Use `ROSTransport` instead. ([#1230](#1230)) - **QuestButtons → Buttons**: Renamed with generic field names. ([#1261](#1261)) - **RerunBridge replaces old rerun init**: `dimos.dashboard.rerun_init` removed. Use `RerunBridgeModule` or the `rerun-bridge` CLI. ([#1154](#1154)) - **Unitree directory restructuring**: `unitree_go2` → `unitree/go2`, `unitree_g1` → `unitree/g1`. Blueprint names updated. ([#1221](#1221)) - **Default viewer is now rerun-web**: Use `--viewer-backend rerun` to restore native viewer. ([#1324](#1324)) --- ## Quickstart ```bash # Install uv pip install dimos[base,unitree] # Try it (no hardware needed) # NOTE: First run downloads ~2.4 GB from LFS dimos --replay run unitree-go2 # Simulate uv pip install dimos[base,unitree,sim] dimos --simulation run unitree-go2 ``` --- ## New Contributors 🎉 - @ruthwikdasyam — Quest VR teleoperation, phone teleop, arm teleop, webcam rerun viz - @JalajShuklaSS — GraspGen integration - @jca0 — MuJoCo simulation module - @christiefhyang — PR template --- **Full Changelog**: [v0.0.9...v0.0.10](v0.0.9...v0.0.10)
docs(go2): add getting started guide (#1339)
…o jeff/fix/docker3
| "open3d>=0.18.0; platform_system != 'Linux' or platform_machine != 'aarch64'", | ||
| # these below should be removed later, right now they are needed even for running `dimos --help` (seperate non-docker issue) | ||
| "langchain-core", | ||
| "matplotlib", |
- Remove @DataClass(kw_only=True) from HelloDockerConfig (conflicts with Pydantic) - Pop global_config from kwargs before passing to config class - Store rpc_timeouts/default_rpc_timeout in PubSubRPCMixin (not Protocol) - Remove __init__ from RPCClient Protocol and RPCSpec (structural typing only) - Use short 3s timeout for readiness probe polling (was using 120s default) - Extract NavigationStrategy/VlModelName into lightweight types.py files (same fix as jeff/fix/help — prevents torch import in Docker containers)
Address Paul's review comment to use check_output with plain 'cowsay'.
a87f576 to
9668e3a
Compare
| return cfg.docker_bin or "docker" | ||
|
|
||
|
|
||
| def _image_exists(docker_bin: str, image_name: str) -> bool: |
dimos/core/module.py
Outdated
| class ModuleConfig(BaseConfig): | ||
| rpc_transport: type[RPCSpec] = LCMRPC | ||
| default_rpc_timeout: float = DEFAULT_RPC_TIMEOUT | ||
| rpc_timeouts: dict[str, float] = dict(DEFAULT_RPC_TIMEOUTS) |
There was a problem hiding this comment.
rpc_timeouts is a new API cause a better timeout API was (at one point) needed for docker. While docker doesn't need it now, the work was already done and is related
There was a problem hiding this comment.
Can't use dict as a default, because it's mutable. Defaults for class attributes need to be immutable because they're shared between all instances. I think you just need to remove the default here and add
self.rpc_timeouts = dict(DEFAULT_RPC_TIMEOUTS)in __init__.
There was a problem hiding this comment.
I did forget to change this back to an immutable dict / mapping proxy.
When users pass config values its a full overwrite, and the module class should never mutate the dict. But it would be good for me to freeze it to enforce that. Is that acceptable?
I think its important that timeouts are in the config (self.config.rpc_timeouts rather than self.rpc_timeouts)
| self.rpc = self.config.rpc_transport() | ||
| self.rpc = self.config.rpc_transport( | ||
| rpc_timeouts=self.config.rpc_timeouts, | ||
| default_rpc_timeout=self.config.default_rpc_timeout, |
There was a problem hiding this comment.
all rpc_transports now get timeouts explicitly. The module (user level) controls the default timeout value
| def configure_stream(self, stream_name: str, topic: str) -> bool: | ||
| """Configure a stream's transport by topic. Called by DockerModule for stream wiring.""" | ||
| from dimos.core.transport import pLCMTransport | ||
|
|
There was a problem hiding this comment.
no longer needed (one of the main changes)
| if sys.version_info >= (3, 11): | ||
| from typing import Self | ||
| else: | ||
| from typing_extensions import Self |
There was a problem hiding this comment.
not sure how this got past CI
| from pathlib import Path | ||
| import re | ||
| import signal | ||
| import time |
There was a problem hiding this comment.
formatting (also not sure how this got past CI)
dimos/core/module_coordinator.py
Outdated
| return | ||
| assert self._client is not None | ||
| for index, module in zip( | ||
| worker_indices, self._client.deploy_parallel(worker_specs), strict=False |
There was a problem hiding this comment.
You're using strict=False a lot, but that's the default. I assume the linter added it. It would be better to change it to strict=True.
dimos/core/docker_runner.py
Outdated
| with suppress(Exception): | ||
| self.rpc.stop() | ||
| for unsub in self._unsub_fns: | ||
| for unsub in getattr(self, "_unsub_fns", []): |
There was a problem hiding this comment.
_unsub_fns is defined in __init__. It definitely exists. No need for getattr. Below, you're using it without getattr.
dimos/core/docker_runner.py
Outdated
| # Signal remote module, stop RPC, unsubscribe handlers (ignore failures) | ||
| if not self._running: | ||
| return | ||
| self._running = False # claim shutdown before any side-effects |
There was a problem hiding this comment.
It would be nicer to use an event as booleans without a lock are not threadsafe.
There was a problem hiding this comment.
self._running was carried over from Jalaj's PR but I agree it should be switched out.
|
|
||
|
|
||
| class DockerModule: | ||
| class DockerModule(ModuleProxyProtocol): |
There was a problem hiding this comment.
I thought this was renamed to DockerRunner at one point since it's not a Module.
dimos/core/docker_runner.py
Outdated
| ) | ||
|
|
||
| # global_config is passed by deploy pipeline but isn't a config field | ||
| kwargs.pop("global_config", None) |
There was a problem hiding this comment.
This has been renamed recently to g I think. (I don't like the name, but forgot to comment on it.)
| logger.info(f"Building {config.docker_image}") | ||
| build_image(config) | ||
| # Build or pull image, launch container, wait for RPC server | ||
| try: |
There was a problem hiding this comment.
It would be nice if all of this could be done in start.
__init__ is generally for setting up the object, not doing work. If you have failures in __init__ the object is left in an invalid state and it's hard to clean up. I assume that's why you have so many with suppress(Exception): in _cleanup.
There was a problem hiding this comment.
This is an important design discussion, and the timeout changes in this PR were basically part of me trying that route (everything in start). And yes the suppresses are because of this. We have two issues. Basically any interactive questions (stdin) must be before the module is deployed - not super relevant for docker but feels bleh to tell people to put stdin-using stuff in an __init__. The second though is that things like LFS downloads, docker build, docker pull, anything that can take a super massive amount of time causes start as an RPC to timeout. We kind of need an optional build step thats allowed to have a really long timeout. Ideally it would be an RPC so that build steps could be done in parallel.
Thoughts? I'd have no problem reworking this as I would rather get it right.
Native modules have this same issue
| self._cleanup() | ||
|
|
||
| def _cleanup(self) -> None: | ||
| """Release all resources. Idempotent — safe to call from partial init or after stop().""" |
There was a problem hiding this comment.
I wouldn't say that ignoring all errors is safe and idempotent. For example what error are you expecting self._unsub_fns.clear() to throw? It's always at least an empty list. That won't throw anything.
I understand that best effort cleanup is sometimes needed, but this is complicated because so much is done in the constructor. A cleaner constructor would make the teardown cleaner too.
|
|
||
| def test_getattr_no_recursion_on_cleanup_attrs(self): | ||
| """Accessing cleanup-related attrs before they exist must raise, not recurse.""" | ||
| from dimos.core.docker_runner import DockerModule |
There was a problem hiding this comment.
Tests should have imports at the top because you're going to import them anyway.
| # Container launch fails inside __init__; DockerModule handles its own cleanup | ||
| mock_docker_module_cls.side_effect = RuntimeError("launch failed") | ||
|
|
||
| coordinator = ModuleCoordinator() |
There was a problem hiding this comment.
There's a dimos_cluster fixture you might want to use, or create your own. You shouldn't initialize it in a test because if it fails coordinator.stop() won't be called.
| docker_restart_policy: str = "on-failure:3" | ||
| docker_gpus: str | None = None | ||
| docker_shm_size: str = "4g" | ||
| docker_restart_policy: str = "no" |
There was a problem hiding this comment.
Important change to match defaults for docker CLI.
shm_size is an exception, I debated being consistent with it but it is commonly needed to be high for ML stuff and the downside is just slightly more resource usage. There are lots of complaints about dockers default value and setting it high shouldn't cause a problem (unlike the other two defaults)
- Use strict=True instead of strict=False in zip() calls (module_coordinator.py) - Fix mutable default dict for rpc_timeouts using Field(default_factory=...) (module.py) - Remove unnecessary getattr() for _unsub_fns in _cleanup() (docker_runner.py) - Use threading.Event instead of bool for _running flag (docker_runner.py) - Rename global_config kwarg to g to match ModuleConfig field name (docker_runner.py, module_coordinator.py, docker_worker_manager.py) - Move inline test imports to top of file (test_docker_deployment.py) - Sort imports in hello_docker.py example
…args - Add __init__(**kwargs) to _DummyRPC in test_sim_module.py to accept rpc_timeouts/default_rpc_timeout kwargs passed by Module.__init__ - Add type: ignore[call-arg] for RPCSpec Protocol constructor call
… failure Address Paul's review comment: if an assertion fails before coordinator.stop(), cleanup won't run. Use try/finally to ensure stop() is always called, even when tests fail.
Problem(s)
configure_streamdoes not support different transport types (Blocker for DIM-569)Closes DIM-662
Solution
ModuleCoordinatorto restore functionality: deploy docker modules in parallelconfigure_stream(not needed) in favor of usingset_transportwork as intended to allow different stream typesBreaking Changes
None
How to Test
python ./examples/docker_hello_world/hello_docker.pyContributor License Agreement