Skip to content

feat: use individual module connections - #2049

Closed
paul-nechifor wants to merge 2 commits into
mainfrom
paul/feat/simulation-modules
Closed

paul-nechifor wants to merge 2 commits into
mainfrom
paul/feat/simulation-modules

Conversation

@paul-nechifor

@paul-nechifor paul-nechifor commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Closes DIM-XXX

Solution

How to Test

Contributor License Agreement

  • I have read and approved the CLA.

@greptile-apps

greptile-apps Bot commented May 12, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR refactors the Unitree connection layer from a single monolithic class into per-backend modules (connection_webrtc.py, connection_mujoco.py, connection_replay.py, connection_dimsim.py), introduces a connection_registry with a @connection decorator, and adds Blueprint.with_backend() so the CLI can swap connection atoms at startup based on --simulation / --replay flags via the new GlobalConfig.effective_simulator property.

  • UnitreeWebRtcSession is extracted as a shared transport helper; MujocoConnectionBase is promoted to a Module subclass with correct start/stop hooks and a properly-gated _publish_camera_info_loop (unlike the equivalent loops in the WebRTC/replay/dimsim variants).
  • Blueprint.with_backend() validates stream surface and kwarg compatibility before committing the swap, with full test coverage in test_blueprints.py.
  • Go2FleetConnection now inherits from Go2WebRtcConnection, picking up its _connection_tag; a with_backend() call on a fleet blueprint will therefore replace it with the bare single-robot backend, silently discarding fleet logic.

Confidence Score: 3/5

Several real-hardware paths remain broken: camera-info threads never exit so teardown always times out; the WebRTC handshake blocks forever on connection failure; and Go2FleetConnection silently loses fleet behaviour when with_backend() is called.

The registry and Blueprint.with_backend() machinery is clean and well-tested. However, three confirmed defects from the prior review remain unaddressed: the infinite camera-info loop preventing clean shutdown, the indefinitely-blocking WebRTC handshake, and the fleet-connection tag-inheritance problem. Together these make the production robot paths unreliable.

dimos/robot/unitree/go2/connection_webrtc.py, connection_replay.py, connection_dimsim.py (infinite camera-info loops); dimos/robot/unitree/webrtc_session.py (blocking handshake); dimos/robot/unitree/go2/fleet_connection.py (inherited _connection_tag); dimos/robot/unitree/g1/init.py (incompatible stream surfaces)

Important Files Changed

Filename Overview
dimos/robot/connection_registry.py New registry mapping (robot, backend) → connection class via @connection decorator; includes duplicate-registration guard and lookup helpers used by Blueprint.with_backend()
dimos/core/coordination/blueprints.py Adds Blueprint.with_backend(), _check_stream_parity(), and _check_kwargs_compat(); parity check only compares (name, direction) and silently passes type-mismatched streams
dimos/robot/cli/dimos.py Wires global_config.effective_simulator into blueprint.with_backend(); adds a second global_config.update() call that is already performed earlier in the same function
dimos/robot/unitree/go2/connection_webrtc.py New file: real-hardware Go2 WebRTC connection; _publish_camera_info loops forever with no exit condition (stop() will always time out joining the thread)
dimos/robot/unitree/webrtc_session.py New shared WebRTC session; start() blocks indefinitely on _connection_ready.wait() — any exception in async_connect() before the event is set will hang the calling thread forever
dimos/robot/unitree/go2/fleet_connection.py Refactored to use _FleetMemberClient + Go2WebRtcConnection base; inherits _connection_tag from Go2WebRtcConnection so with_backend() would silently swap fleet logic away
dimos/robot/unitree/go2/connection_replay.py New replay connection; _publish_camera_info has same infinite-loop pattern as connection_webrtc.py — stop() join will always timeout
dimos/robot/unitree/mujoco_connection.py MujocoConnection promoted to MujocoConnectionBase (a Module subclass) with proper start/stop/stream wiring; _publish_camera_info_loop correctly checks _stop_event
dimos/robot/unitree/g1/init.py Eagerly imports both G1 backends to populate the registry; G1WebRtcConnection (1 stream) and G1MujocoConnection (5 streams) have mismatched surfaces making with_backend("mujoco") always raise Stream surface drift
dimos/core/global_config.py Adds effective_simulator property that correctly maps both --replay and --simulation flags to backend strings for Blueprint.with_backend()

Sequence Diagram

sequenceDiagram
    participant CLI as dimos.py CLI
    participant GC as GlobalConfig
    participant ABP as all_blueprints
    participant CR as connection_registry
    participant WB as with_backend()
    participant SC as _check_stream_parity
    participant KC as _check_kwargs_compat

    CLI->>GC: "update(**cli_config_overrides)"
    CLI->>ABP: "autoconnect(*robot_types)"
    ABP-->>CLI: Blueprint (with tagged atoms)
    CLI->>GC: effective_simulator
    GC-->>CLI: mujoco / replay / None
    alt backend is not None
        CLI->>WB: blueprint.with_backend(backend)
        loop each atom in blueprint.blueprints
            WB->>WB: getattr(atom.module, _connection_tag)
            alt "tag.backend != requested"
                WB->>CR: get_connection(tag.robot, backend)
                CR-->>WB: target class
                WB->>SC: _check_stream_parity(old, target, atom)
                SC->>SC: compare name+direction sets only
                WB->>KC: _check_kwargs_compat(target, atom.kwargs)
                KC->>KC: check model_fields vs kwargs keys
                WB->>WB: BlueprintAtom.create(target, atom.kwargs)
            end
        end
        WB-->>CLI: new Blueprint
    end
    CLI->>CLI: blueprint.start()
Loading

Reviews (9): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment thread dimos/core/coordination/blueprints.py
Comment thread dimos/robot/unitree/go2/connection_webrtc.py
Comment thread dimos/robot/unitree/go2/fleet_connection.py Outdated
@codecov

codecov Bot commented May 12, 2026 •

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
1 1 0 2
View the top 1 failed test(s) by shortest run time
::dimos.agents
Stack Traces | 0s run time
dimos/agents/conftest.py:24: in <module>
    from dimos.agents.mcp.mcp_client import McpClient
        AgentTestRunner = <class 'dimos.agents.agent_test_runner.AgentTestRunner'>
        BaseMessage = <class 'langchain_core.messages.base.BaseMessage'>
        Event      = <class 'threading.Event'>
        Path       = <class 'pathlib.Path'>
        __builtins__ = <builtins>
        __cached__ = '.../agents/__pycache__/conftest.cpython-312.pyc'
        __doc__    = None
        __file__   = '.../dimos/agents/conftest.py'
        __loader__ = <_pytest.assertion.rewrite.AssertionRewritingHook object at 0x102ee0200>
        __name__   = 'dimos.agents.conftest'
        __package__ = 'dimos.agents'
        __spec__   = ModuleSpec(name='dimos.agents.conftest', loader=<_pytest.assertion.rewrite.AssertionRewritingHook object at 0x102ee0200>, origin='.../dimos/agents/conftest.py')
        load_dotenv = <function load_dotenv at 0x1091baf20>
        os         = <module 'os' (frozen)>
        pytest     = <module 'pytest' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/pytest/__init__.py'>
.../agents/mcp/mcp_client.py:23: in <module>
    from langchain.agents import create_agent
        Any        = typing.Any
        Callable   = <class 'collections.abc.Callable'>
        Empty      = <class '_queue.Empty'>
        Event      = <class 'threading.Event'>
        Queue      = <class 'queue.Queue'>
        RLock      = <function RLock at 0x102c2efc0>
        Thread     = <class 'threading.Thread'>
        __builtins__ = <builtins>
        __cached__ = '.../mcp/__pycache__/mcp_client.cpython-312.pyc'
        __doc__    = None
        __file__   = '/Users/ec2-user/actions-runner/_work/dimos/dimos/.../agents/mcp/mcp_client.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x10ae91a30>
        __name__   = 'dimos.agents.mcp.mcp_client'
        __package__ = 'dimos.agents.mcp'
        __spec__   = ModuleSpec(name='dimos.agents.mcp.mcp_client', loader=<_frozen_importlib_external.SourceFileLoader object at 0x10ae91a30>, origin='/Users/ec2-user/actions-runner/_work/dimos/dimos/.../agents/mcp/mcp_client.py')
        httpx      = <module 'httpx' from '.../dimos/dimos/.venv/lib/python3.12.../site-packages/httpx/__init__.py'>
        time       = <module 'time' (built-in)>
        uuid       = <module 'uuid' from '................../Users/ec2-user/.local.../uv/python/cpython-3.12.13-macos-aarch64-none/lib/python3.12/uuid.py'>
.venv/lib/python3.12.../langchain/agents/__init__.py:3: in <module>
    from langchain.agents.factory import create_agent
        __builtins__ = <builtins>
        __cached__ = '.../dimos/dimos/.venv/lib/python3.12.../agents/__pycache__/__init__.cpython-312.pyc'
        __doc__    = 'Entrypoint to building [Agents](https://docs.langchain..../python/langchain/agents) with LangChain.'
        __file__   = '.../dimos/dimos/.venv/lib/python3.12.../langchain/agents/__init__.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x10ae918b0>
        __name__   = 'langchain.agents'
        __package__ = 'langchain.agents'
        __path__   = ['.../dimos/dimos/.venv/lib/python3.12....../site-packages/langchain/agents']
        __spec__   = ModuleSpec(name='langchain.agents', loader=<_frozen_importlib_external.SourceFileLoader object at 0x10ae918b0>, origin...rch_locations=['.../dimos/dimos/.venv/lib/python3.12....../site-packages/langchain/agents'])
.venv/lib/python3.12........./langchain/agents/factory.py:22: in <module>
    from langgraph.prebuilt.tool_node import ToolCallWithContext, ToolNode
        AIMessage  = <class 'langchain_core.messages.ai.AIMessage'>
        Annotated  = <class 'typing.Annotated'>
        Any        = typing.Any
        AnyMessage = typing.Annotated[typing.Union[typing.Annotated[langchain_core.messages.ai.AIMessage, Tag(tag='ai')], typing.Annotated[...or=<function _get_type at 0x10b245800>, custom_error_type=None, custom_error_message=None, custom_error_context=None))]
        BaseChatModel = <class 'langchain_core.language_models.chat_models.BaseChatModel'>
        BaseTool   = <class 'langchain_core.tools.base.BaseTool'>
        END        = '__end__'
        RunnableCallable = <class 'langgraph._internal._runnable.RunnableCallable'>
        START      = '__start__'
        StateGraph = <class 'langgraph.graph.state.StateGraph'>
        SystemMessage = <class 'langchain_core.messages.system.SystemMessage'>
        TYPE_CHECKING = False
        ToolMessage = <class 'langchain_core.messages.tool.ToolMessage'>
        __builtins__ = <builtins>
        __cached__ = '.../dimos/dimos/.venv/lib/python3.12........./agents/__pycache__/factory.cpython-312.pyc'
        __doc__    = 'Agent factory for creating agents with middleware support.'
        __file__   = '.../dimos/dimos/.venv/lib/python3.12........./langchain/agents/factory.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x10ae91fd0>
        __name__   = 'langchain.agents.factory'
        __package__ = 'langchain.agents'
        __spec__   = ModuleSpec(name='langchain.agents.factory', loader=<_frozen_importlib_external.SourceFileLoader object at 0x10ae91fd0>...igin='.../dimos/dimos/.venv/lib/python3.12........./langchain/agents/factory.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        cast       = <function cast at 0x1029a0ea0>
        get_args   = <function get_args at 0x1029a11c0>
        get_origin = <function get_origin at 0x1029a1120>
        get_type_hints = <function get_type_hints at 0x1029a0fe0>
        itertools  = <module 'itertools' (built-in)>
.venv/lib/python3.12.../langgraph/prebuilt/__init__.py:3: in <module>
    from langgraph.prebuilt.chat_agent_executor import create_react_agent
        __builtins__ = <builtins>
        __cached__ = '.../dimos/dimos/.venv/lib/python3.12.../prebuilt/__pycache__/__init__.cpython-312.pyc'
        __doc__    = 'langgraph.prebuilt exposes a higher-level API for creating and executing agents and tools.'
        __file__   = '.../dimos/dimos/.venv/lib/python3.12.../langgraph/prebuilt/__init__.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x11ca99f10>
        __name__   = 'langgraph.prebuilt'
        __package__ = 'langgraph.prebuilt'
        __path__   = ['.../dimos/dimos/.venv/lib/python3.12....../site-packages/langgraph/prebuilt']
        __spec__   = ModuleSpec(name='langgraph.prebuilt', loader=<_frozen_importlib_external.SourceFileLoader object at 0x11ca99f10>, orig...h_locations=['.../dimos/dimos/.venv/lib/python3.12....../site-packages/langgraph/prebuilt'])
.venv/lib/python3.12........./langgraph/prebuilt/chat_agent_executor.py:47: in <module>
    from langgraph.prebuilt.tool_node import ToolCallWithContext, ToolNode
        AIMessage  = <class 'langchain_core.messages.ai.AIMessage'>
        Annotated  = <class 'typing.Annotated'>
        Any        = typing.Any
        AnyMessage = typing.Annotated[typing.Union[typing.Annotated[langchain_core.messages.ai.AIMessage, Tag(tag='ai')], typing.Annotated[...or=<function _get_type at 0x10b245800>, custom_error_type=None, custom_error_message=None, custom_error_context=None))]
        Awaitable  = <class 'collections.abc.Awaitable'>
        BaseChatModel = <class 'langchain_core.language_models.chat_models.BaseChatModel'>
        BaseMessage = <class 'langchain_core.messages.base.BaseMessage'>
        BaseModel  = <class 'pydantic.main.BaseModel'>
        BaseStore  = <class 'langgraph.store.base.BaseStore'>
        BaseTool   = <class 'langchain_core.tools.base.BaseTool'>
        Callable   = <class 'collections.abc.Callable'>
        Checkpointer = None | bool | langgraph.checkpoint.base.BaseCheckpointSaver
        CompiledStateGraph = <class 'langgraph.graph.state.CompiledStateGraph'>
        ContextT   = ~ContextT
        END        = '__end__'
        ErrorCode  = <enum 'ErrorCode'>
        LangGraphDeprecatedSinceV10 = <class 'langgraph.warnings.LangGraphDeprecatedSinceV10'>
        LanguageModelInput = langchain_core.prompt_values.PromptValue | str | collections.abc.Sequence[langchain_core.messages.base.BaseMessage | list[str] | tuple[str, str] | str | dict[str, typing.Any]]
        LanguageModelLike = langchain_core.runnables.base.Runnable[langchain_core.prompt_values.PromptValue | str | collections.abc.Sequence[langc...seMessage | list[str] | tuple[str, str] | str | dict[str, typing.Any]], langchain_core.messages.base.BaseMessage | str]
        Literal    = typing.Literal
        MISSING    = <object object at 0x11cec4b60>
        NotRequired = typing.NotRequired
        RemainingSteps = typing.Annotated[int, <class 'langgraph.managed.is_last_step.RemainingStepsManager'>]
        Runnable   = <class 'langchain_core.runnables.base.Runnable'>
        RunnableBinding = <class 'langchain_core.runnables.base.RunnableBinding'>
        RunnableCallable = <class 'langgraph._internal._runnable.RunnableCallable'>
        RunnableConfig = <class 'langchain_core.runnables.config.RunnableConfig'>
        RunnableLike = typing.Union[langchain_core.runnables.base.Runnable[-Input, +Output], collections.abc.Callable[[-Input], +Output], col...unnableWithConfigStore[-Input, +Output], langgraph._internal._runnable._RunnableWithConfigWriterStore[-Input, +Output]]
        RunnableSequence = <class 'langchain_core.runnables.base.RunnableSequence'>
        Runtime    = <class 'langgraph.runtime.Runtime'>
        Send       = <class 'langgraph.types.Send'>
        Sequence   = <class 'collections.abc.Sequence'>
        StateGraph = <class 'langgraph.graph.state.StateGraph'>
        SystemMessage = <class 'langchain_core.messages.system.SystemMessage'>
        ToolMessage = <class 'langchain_core.messages.tool.ToolMessage'>
        TypeVar    = <class 'typing.TypeVar'>
        TypedDict  = typing_extensions.TypedDict
        __builtins__ = <builtins>
        __cached__ = '.../dimos/dimos/.venv/lib/python3.12........./prebuilt/__pycache__/chat_agent_executor.cpython-312.pyc'
        __doc__    = None
        __file__   = '.../dimos/dimos/.venv/lib/python3.12........./langgraph/prebuilt/chat_agent_executor.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x11cbc0470>
        __name__   = 'langgraph.prebuilt.chat_agent_executor'
        __package__ = 'langgraph.prebuilt'
        __spec__   = ModuleSpec(name='langgraph.prebuilt.chat_agent_executor', loader=<_frozen_importlib_external.SourceFileLoader object a....../dimos/dimos/.venv/lib/python3.12........./langgraph/prebuilt/chat_agent_executor.py')
        add_messages = <function _add_messages_wrapper.<locals>._add_messages at 0x11d36ec00>
        cast       = <function cast at 0x1029a0ea0>
        create_error_message = <function create_error_message at 0x11d13ede0>
        deprecated = <class 'typing_extensions.deprecated'>
        get_type_hints = <function get_type_hints at 0x1029a0fe0>
        inspect    = <module 'inspect' from '................../Users/ec2-user/.local.../uv/python/cpython-3.12.13-macos-aarch64-none/lib/python3.12/inspect.py'>
        warnings   = <module 'warnings' from '................../Users/ec2-user/.local.../uv/python/cpython-3.12.13-macos-aarch64-none/lib/python3.12/warnings.py'>
.venv/lib/python3.12........./langgraph/prebuilt/tool_node.py:89: in <module>
    from langgraph.runtime import ExecutionInfo, ServerInfo  # noqa: TC002
E   ImportError: cannot import name 'ExecutionInfo' from 'langgraph.runtime' (.../dimos/dimos/.venv/lib/python3.12.../site-packages/langgraph/runtime.py)
        AIMessage  = <class 'langchain_core.messages.ai.AIMessage'>
        Annotated  = <class 'typing.Annotated'>
        Any        = typing.Any
        AnyMessage = typing.Annotated[typing.Union[typing.Annotated[langchain_core.messages.ai.AIMessage, Tag(tag='ai')], typing.Annotated[...or=<function _get_type at 0x10b245800>, custom_error_type=None, custom_error_message=None, custom_error_context=None))]
        Awaitable  = <class 'collections.abc.Awaitable'>
        BaseTool   = <class 'langchain_core.tools.base.BaseTool'>
        CONF       = 'configurable'
        CONFIG_KEY_READ = '__pregel_read'
        Callable   = <class 'collections.abc.Callable'>
        Generic    = <class 'typing.Generic'>
        GraphBubbleUp = <class 'langgraph.errors.GraphBubbleUp'>
        InjectedToolArg = <class 'langchain_core.tools.base.InjectedToolArg'>
        Literal    = typing.Literal
        REMOVE_ALL_MESSAGES = '__remove_all__'
        RemoveMessage = <class 'langchain_core.messages.modifier.RemoveMessage'>
        RunnableCallable = <class 'langgraph._internal._runnable.RunnableCallable'>
        RunnableConfig = <class 'langchain_core.runnables.config.RunnableConfig'>
        TOOL_MESSAGE_BLOCK_TYPES = ('text', 'image_url', 'image', 'json', 'search_result', 'custom_tool_call_output', ...)
        TYPE_CHECKING = False
        ToolCall   = <class 'langchain_core.messages.tool.ToolCall'>
        ToolException = <class 'langchain_core.tools.base.ToolException'>
        ToolMessage = <class 'langchain_core.messages.tool.ToolMessage'>
        TypedDict  = <function TypedDict at 0x1024f32e0>
        Union      = typing.Union
        UnionType  = <class 'types.UnionType'>
        _DirectlyInjectedToolArg = <class 'langchain_core.tools.base._DirectlyInjectedToolArg'>
        __builtins__ = <builtins>
        __cached__ = '.../dimos/dimos/.venv/lib/python3.12........./prebuilt/__pycache__/tool_node.cpython-312.pyc'
        __doc__    = 'Tool execution node for LangGraph workflows.\n\nThis module provides prebuilt functionality for executing tools in La...ol\n    def my_tool(x: int) -> str:\n        return f"Result: {x}"\n\n\n    tool_node = ToolNode([my_tool])\n    ```\n'
        __file__   = '.../dimos/dimos/.venv/lib/python3.12........./langgraph/prebuilt/tool_node.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x11cbc0590>
        __name__   = 'langgraph.prebuilt.tool_node'
        __package__ = 'langgraph.prebuilt'
        __spec__   = ModuleSpec(name='langgraph.prebuilt.tool_node', loader=<_frozen_importlib_external.SourceFileLoader object at 0x11cbc0...='.../dimos/dimos/.venv/lib/python3.12........./langgraph/prebuilt/tool_node.py')
        _is_injected_arg_type = <function _is_injected_arg_type at 0x11d0e3a60>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        asyncio    = <module 'asyncio' from '................../Users/ec2-user/.local.../uv/python/cpython-3.12.13-macos-aarch64-none/lib/python3.12/asyncio/__init__.py'>
        cast       = <function cast at 0x1029a0ea0>
        convert_to_messages = <function convert_to_messages at 0x10b22f740>
        copy       = <function copy at 0x1028b7ce0>
        create_tool = <function tool at 0x11d3ed300>
        dataclass  = <function dataclass at 0x1029427a0>
        deepcopy   = <function deepcopy at 0x1028e4040>
        field      = <function field at 0x102941080>
        get_all_basemodel_annotations = <function get_all_basemodel_annotations at 0x11d0e3b00>
        get_args   = <function get_args at 0x1029a11c0>
        get_config_list = <function get_config_list at 0x10b260ae0>
        get_executor_for_config = <function get_executor_for_config at 0x10b263ba0>
        get_origin = <function get_origin at 0x1029a1120>
        get_type_hints = <function get_type_hints at 0x1029a0fe0>
        inspect    = <module 'inspect' from '................../Users/ec2-user/.local.../uv/python/cpython-3.12.13-macos-aarch64-none/lib/python3.12/inspect.py'>
        json       = <module 'json' from '................../Users/ec2-user/.local.../uv/python/cpython-3.12.13-macos-aarch64-none/lib/python3.12/json/__init__.py'>
        replace    = <function replace at 0x102942d40>

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@paul-nechifor
paul-nechifor force-pushed the paul/feat/simulation-modules branch from bab5f66 to 7647f65 Compare May 12, 2026 04:29
Comment thread dimos/core/global_config.py Outdated
@paul-nechifor
paul-nechifor force-pushed the paul/feat/simulation-modules branch 3 times, most recently from 72080c3 to f82d270 Compare May 12, 2026 05:30
@paul-nechifor
paul-nechifor force-pushed the paul/feat/simulation-modules branch from f82d270 to 53f9af1 Compare May 19, 2026 05:08
# fully populated by the time `Blueprint.with_backend(...)` runs. The Mujoco
# variant defers its mujoco-engine import to instance __init__, so registering
# it here is cheap.
from dimos.robot.unitree.go2 import (

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

didn't we ban init .py ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We did, but I need them here for the same reason we banned them: to import more than is needed.

This solution requires importing all of the connections in order to register them in the registry.

…modules

Resolved conflicts:
- dimos/robot/unitree/connection.py: deleted (per PR); ported time_is_now
  helper and its application to lidar/odom/video streams into
  Go2WebRtcConnection (was in unitree/connection.py on main).
- dimos/robot/unitree/go2/connection.py: deleted (per PR); ported
  dedicated_worker=True onto Go2WebRtcConnection and main's YAML-based
  camera_info loading into dimos/robot/unitree/go2/camera.py.
- dimos/robot/unitree/go2/blueprints/basic/unitree_go2_basic.py: kept PR's
  Go2WebRtcConnection import; adopted main's commented-out
  ClockSyncConfigurator (sensor timestamps now derived on reception).
- dimos/robot/all_blueprints.py: dropped foxglove-bridge (removed on main)
  and obsolete g1-connection entries (classes no longer exist on PR);
  verified by pytest dimos/robot/test_all_blueprints_generation.py.
- docs/usage/{data,sensor}_streams/storage_replay.md: updated
  connection.py doclinks to point to new connection_replay.py.
@paul-nechifor

Copy link
Copy Markdown
Contributor Author

Needs to be redone.

@paul-nechifor
paul-nechifor deleted the paul/feat/simulation-modules branch September 22, 2026 22:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants